From 8156604ee2961c70b336d40486a0cf1f61dac21e Mon Sep 17 00:00:00 2001 From: "kilian (dks-laptop)" Date: Thu, 7 Nov 2019 09:11:36 +0100 Subject: [PATCH] v20191107 --- .gitignore | 2 + backoffice/.htaccess | 9 + backoffice/api/db.cgi | 93 + backoffice/api/file.cgi | 136 + backoffice/api/fingerprint.cgi | 23 + backoffice/api/index.cgi | 152 + backoffice/api/lib/dksconfig.pm | 28 + backoffice/api/lib/dksdb.pm | 409 + backoffice/api/lib/dkssavefile.pm | 49 + backoffice/api/lib/sendemail.pm | 130 + backoffice/api/lib/session.pm | 241 + backoffice/api/sendEmail | 2235 ++ backoffice/api/upload.cgi | 242 + backoffice/css/module.css | 8 + backoffice/css/w3pro.css | 378 + backoffice/data/.htaccess | 5 + backoffice/img/bg1.jpg | Bin 0 -> 135161 bytes .../img/favicon/android-icon-144x144.png | Bin 0 -> 4090 bytes .../img/favicon/android-icon-192x192.png | Bin 0 -> 4657 bytes backoffice/img/favicon/android-icon-36x36.png | Bin 0 -> 1448 bytes backoffice/img/favicon/android-icon-48x48.png | Bin 0 -> 1789 bytes backoffice/img/favicon/android-icon-72x72.png | Bin 0 -> 2257 bytes backoffice/img/favicon/android-icon-96x96.png | Bin 0 -> 2867 bytes backoffice/img/favicon/apple-icon-114x114.png | Bin 0 -> 3321 bytes backoffice/img/favicon/apple-icon-120x120.png | Bin 0 -> 3459 bytes backoffice/img/favicon/apple-icon-144x144.png | Bin 0 -> 4090 bytes backoffice/img/favicon/apple-icon-152x152.png | Bin 0 -> 4353 bytes backoffice/img/favicon/apple-icon-180x180.png | Bin 0 -> 5335 bytes backoffice/img/favicon/apple-icon-57x57.png | Bin 0 -> 1902 bytes backoffice/img/favicon/apple-icon-60x60.png | Bin 0 -> 2003 bytes backoffice/img/favicon/apple-icon-72x72.png | Bin 0 -> 2257 bytes backoffice/img/favicon/apple-icon-76x76.png | Bin 0 -> 2339 bytes .../img/favicon/apple-icon-precomposed.png | Bin 0 -> 5226 bytes backoffice/img/favicon/apple-icon.png | Bin 0 -> 5226 bytes backoffice/img/favicon/browserconfig.xml | 2 + backoffice/img/favicon/favicon-16x16.png | Bin 0 -> 1004 bytes backoffice/img/favicon/favicon-32x32.png | Bin 0 -> 1328 bytes backoffice/img/favicon/favicon-96x96.png | Bin 0 -> 2867 bytes backoffice/img/favicon/favicon.ico | Bin 0 -> 1150 bytes backoffice/img/favicon/manifest.json | 41 + backoffice/img/favicon/ms-icon-144x144.png | Bin 0 -> 4090 bytes backoffice/img/favicon/ms-icon-150x150.png | Bin 0 -> 4301 bytes backoffice/img/favicon/ms-icon-310x310.png | Bin 0 -> 11523 bytes backoffice/img/favicon/ms-icon-70x70.png | Bin 0 -> 2216 bytes backoffice/img/icons/Agreement_01.svg | 1 + backoffice/img/icons/Bill.svg | 1 + backoffice/img/icons/Document_Save.svg | 1 + backoffice/img/icons/Floppy.svg | 1 + backoffice/img/icons/Folder_Delete_01.svg | 1 + backoffice/img/icons/Folder_Find_01.svg | 1 + backoffice/img/icons/Save.svg | 1 + backoffice/img/icons/access.svg | 1 + backoffice/img/icons/access_white.svg | 5 + backoffice/img/icons/address.svg | 3 + backoffice/img/icons/address_white.svg | 3 + backoffice/img/icons/apps.svg | 3 + backoffice/img/icons/apps_white.svg | 3 + backoffice/img/icons/archive.svg | 1 + backoffice/img/icons/archive_white.svg | 5 + backoffice/img/icons/calendar.svg | 3 + backoffice/img/icons/calendar_white.svg | 3 + backoffice/img/icons/club.svg | 3 + backoffice/img/icons/club_white.svg | 3 + backoffice/img/icons/clubs.svg | 3 + backoffice/img/icons/clubs_white.svg | 3 + backoffice/img/icons/code.svg | 1 + backoffice/img/icons/company.svg | 1 + backoffice/img/icons/company_white.svg | 5 + backoffice/img/icons/cube.svg | 3 + backoffice/img/icons/cube_white.svg | 3 + backoffice/img/icons/cubelight.svg | 3 + backoffice/img/icons/cubelight_white.svg | 3 + backoffice/img/icons/dashboard.svg | 3 + backoffice/img/icons/dashboard_white.svg | 3 + backoffice/img/icons/documents.svg | 1 + backoffice/img/icons/documents_white.svg | 5 + backoffice/img/icons/download.svg | 3 + backoffice/img/icons/download_white.svg | 3 + backoffice/img/icons/duplicate.svg | 3 + backoffice/img/icons/duplicate_white.svg | 3 + backoffice/img/icons/edit.svg | 3 + backoffice/img/icons/edit_white.svg | 3 + backoffice/img/icons/excel.svg | 1 + backoffice/img/icons/excel_white.svg | 5 + backoffice/img/icons/file.svg | 3 + backoffice/img/icons/file/dir.png | Bin 0 -> 6937 bytes backoffice/img/icons/file/doc.png | Bin 0 -> 6455 bytes backoffice/img/icons/file/docx.png | Bin 0 -> 6455 bytes backoffice/img/icons/file/file.png | Bin 0 -> 4540 bytes backoffice/img/icons/file/folderup.svg | 22 + backoffice/img/icons/file/folderup_white.svg | 22 + backoffice/img/icons/file/jpg.png | Bin 0 -> 6297 bytes backoffice/img/icons/file/pdf.png | Bin 0 -> 8783 bytes backoffice/img/icons/file/png.png | Bin 0 -> 6297 bytes backoffice/img/icons/file/txt.png | Bin 0 -> 6049 bytes backoffice/img/icons/file/xls.png | Bin 0 -> 6065 bytes backoffice/img/icons/file/xlsx.png | Bin 0 -> 6065 bytes backoffice/img/icons/file_white.svg | 3 + backoffice/img/icons/folder.svg | 3 + backoffice/img/icons/folder_add.svg | 1 + backoffice/img/icons/folder_add_white.svg | 5 + backoffice/img/icons/folder_white.svg | 3 + backoffice/img/icons/globe.svg | 3 + backoffice/img/icons/globe_white.svg | 3 + backoffice/img/icons/group.svg | 3 + backoffice/img/icons/group_white.svg | 3 + backoffice/img/icons/inbox.svg | 3 + backoffice/img/icons/inbox_white.svg | 3 + backoffice/img/icons/library.svg | 3 + backoffice/img/icons/library_white.svg | 3 + backoffice/img/icons/license.svg | 3 + backoffice/img/icons/license_white.svg | 3 + backoffice/img/icons/list.svg | 3 + backoffice/img/icons/list_white.svg | 3 + backoffice/img/icons/log.svg | 1 + backoffice/img/icons/log_white.svg | 5 + backoffice/img/icons/logout.svg | 3 + backoffice/img/icons/logout_white.svg | 3 + backoffice/img/icons/menu.svg | 3 + backoffice/img/icons/menu_white.svg | 3 + backoffice/img/icons/newspaper.svg | 3 + backoffice/img/icons/newspaper_white.svg | 3 + backoffice/img/icons/numberlist.svg | 3 + backoffice/img/icons/numberlist_white.svg | 3 + backoffice/img/icons/package.svg | 3 + backoffice/img/icons/package_white.svg | 3 + backoffice/img/icons/pdf.svg | 1 + backoffice/img/icons/pdf_white.svg | 5 + backoffice/img/icons/pdfexport.svg | 1 + backoffice/img/icons/pdfexport_white.svg | 1 + backoffice/img/icons/pictures.svg | 1 + backoffice/img/icons/pictures_white.svg | 5 + backoffice/img/icons/plus.svg | 3 + backoffice/img/icons/plus_white.svg | 3 + backoffice/img/icons/projects.svg | 1 + backoffice/img/icons/projects_white.svg | 5 + backoffice/img/icons/remove.svg | 3 + backoffice/img/icons/remove_white.svg | 3 + backoffice/img/icons/squares.svg | 3 + backoffice/img/icons/squares_white.svg | 3 + backoffice/img/icons/target.svg | 3 + backoffice/img/icons/target_white.svg | 3 + backoffice/img/icons/upload.svg | 1 + backoffice/img/icons/upload_white.svg | 5 + backoffice/img/icons/user.svg | 3 + backoffice/img/icons/user_white.svg | 3 + backoffice/img/logo_512.png | Bin 0 -> 14719 bytes backoffice/img/no-image-icon.png | Bin 0 -> 20003 bytes backoffice/img/no-news-img.png | Bin 0 -> 17922 bytes backoffice/img/toplogo.png | Bin 0 -> 44729 bytes backoffice/img/toplogo.svg | 482 + backoffice/index.cgi | 184 + backoffice/js/.DS_Store | Bin 0 -> 6148 bytes backoffice/js/admin.js | 37 + backoffice/js/formsave.js | 192 + backoffice/js/module_global.js | 37 + backoffice/js/request.js | 118 + backoffice/tmpl/block/cgu.tt | 216 + backoffice/tmpl/block/dlguploadfile.tt | 91 + backoffice/tmpl/block/head.tt | 30 + backoffice/tmpl/block/snackbar.tt | 1 + backoffice/tmpl/block/toolbars.tt | 9 + backoffice/tmpl/macro/fields.tt | 118 + backoffice/tmpl/module/companies/index.js | 164 + backoffice/tmpl/module/companies/index.tt | 86 + backoffice/tmpl/module/dashboard/index.js | 3 + backoffice/tmpl/module/dashboard/index.tt | 19 + backoffice/tmpl/module/profile/dlgpassword.tt | 81 + backoffice/tmpl/module/profile/dlgusername.tt | 90 + backoffice/tmpl/module/profile/index.js | 64 + backoffice/tmpl/module/profile/index.tt | 45 + backoffice/tmpl/module/projects/cdm.js | 93 + backoffice/tmpl/module/projects/cdm.tt | 36 + backoffice/tmpl/module/projects/index.js | 105 + backoffice/tmpl/module/projects/index.tt | 39 + backoffice/tmpl/module/submissions/index.js | 105 + backoffice/tmpl/module/submissions/index.tt | 51 + backoffice/tmpl/module/upload/index.js | 45 + backoffice/tmpl/module/upload/index.tt | 24 + backoffice/tmpl/module/users/index.js | 294 + backoffice/tmpl/module/users/index.tt | 98 + backoffice/tmpl/module/users/javascript.tt | 3 + backoffice/tmpl/skeleton/index.tt | 47 + backoffice/tmpl/skeleton/login.tt | 33 + .../tmpl/skeleton/login/forgotpassword.tt | 20 + backoffice/tmpl/skeleton/login/login.tt | 25 + backoffice/tmpl/skeleton/login/message.tt | 12 + backoffice/tmpl/skeleton/login/register.tt | 49 + .../tmpl/skeleton/login/validationcode.tt | 23 + backoffice/tmpl/skeleton/module.tt | 57 + backoffice/tmpl/skeleton/module_file.tt | 3 + backoffice/vendors/choices/base.css | 191 + backoffice/vendors/choices/base.min.css | 1 + backoffice/vendors/choices/choices.css | 368 + backoffice/vendors/choices/choices.js | 6787 ++++ backoffice/vendors/choices/choices.min.css | 1 + backoffice/vendors/choices/choices.min.js | 58 + backoffice/vendors/choices/scripts/choices.js | 6787 ++++ .../vendors/choices/scripts/choices.min.js | 58 + backoffice/vendors/flatpickr/flatpickr.css | 784 + backoffice/vendors/flatpickr/flatpickr.js | 2596 ++ .../vendors/flatpickr/flatpickr.min.css | 13 + backoffice/vendors/flatpickr/flatpickr.min.js | 2 + backoffice/vendors/flatpickr/ie.css | 13 + backoffice/vendors/flatpickr/index.d.ts | 4 + backoffice/vendors/flatpickr/l10n/de.d.ts | 66 + backoffice/vendors/flatpickr/l10n/de.js | 70 + .../vendors/flatpickr/l10n/default.d.ts | 3 + backoffice/vendors/flatpickr/l10n/default.js | 83 + backoffice/vendors/flatpickr/l10n/fr.d.ts | 66 + backoffice/vendors/flatpickr/l10n/fr.js | 75 + backoffice/vendors/flatpickr/l10n/lu.d.ts | 67 + backoffice/vendors/flatpickr/l10n/lu.js | 71 + .../plugins/confirmDate/confirmDate.css | 24 + .../plugins/confirmDate/confirmDate.d.ts | 9 + .../plugins/confirmDate/confirmDate.js | 84 + .../plugins/labelPlugin/labelPlugin.d.ts | 3 + .../plugins/labelPlugin/labelPlugin.js | 31 + .../flatpickr/plugins/minMaxTimePlugin.d.ts | 17 + .../flatpickr/plugins/minMaxTimePlugin.js | 326 + .../flatpickr/plugins/monthSelect/index.d.ts | 13 + .../flatpickr/plugins/monthSelect/index.js | 174 + .../flatpickr/plugins/monthSelect/style.css | 69 + .../plugins/monthSelect/tests.spec.d.ts | 1 + .../flatpickr/plugins/rangePlugin.d.ts | 12 + .../vendors/flatpickr/plugins/rangePlugin.js | 146 + .../flatpickr/plugins/scrollPlugin.d.ts | 3 + .../vendors/flatpickr/plugins/scrollPlugin.js | 58 + .../plugins/weekSelect/weekSelect.d.ts | 7 + .../plugins/weekSelect/weekSelect.js | 86 + .../vendors/flatpickr/themes/airbnb.css | 872 + .../vendors/flatpickr/themes/confetti.css | 795 + backoffice/vendors/flatpickr/themes/dark.css | 784 + backoffice/vendors/flatpickr/themes/light.css | 798 + .../flatpickr/themes/material_blue.css | 795 + .../flatpickr/themes/material_green.css | 795 + .../flatpickr/themes/material_orange.css | 795 + .../vendors/flatpickr/themes/material_red.css | 795 + .../vendors/flatpickr/types/globals.d.ts | 20 + .../vendors/flatpickr/types/instance.d.ts | 118 + .../vendors/flatpickr/types/locale.d.ts | 45 + .../vendors/flatpickr/types/options.d.ts | 144 + backoffice/vendors/flatpickr/typings.d.ts | 38 + backoffice/vendors/flatpickr/utils/dates.d.ts | 17 + backoffice/vendors/flatpickr/utils/dom.d.ts | 6 + .../vendors/flatpickr/utils/formatting.d.ts | 13 + backoffice/vendors/flatpickr/utils/index.d.ts | 8 + .../vendors/flatpickr/utils/polyfills.d.ts | 0 backoffice/vendors/jspdf/jspdf.min.js | 286 + .../vendors/jspdf/jspdf.plugin.autotable.js | 1941 + .../jspdf/jspdf.plugin.autotable.min.js | 17 + backoffice/vendors/jsxlsx/LICENSE | 201 + backoffice/vendors/jsxlsx/cpexcel.js | 1505 + backoffice/vendors/jsxlsx/jszip.js | 8999 +++++ backoffice/vendors/jsxlsx/shim.min.js | 2 + backoffice/vendors/jsxlsx/xlsx.core.min.js | 17 + backoffice/vendors/jsxlsx/xlsx.core.min.map | 1 + .../vendors/jsxlsx/xlsx.extendscript.js | 30131 ++++++++++++++++ backoffice/vendors/jsxlsx/xlsx.full.min.js | 23 + backoffice/vendors/jsxlsx/xlsx.full.min.map | 1 + backoffice/vendors/jsxlsx/xlsx.js | 20975 +++++++++++ backoffice/vendors/jsxlsx/xlsx.min.js | 14 + backoffice/vendors/jsxlsx/xlsx.min.map | 1 + .../vendors/moment/moment-with-locales.js | 14765 ++++++++ .../vendors/moment/moment-with-locales.min.js | 1 + backoffice/vendors/moment/moment.js | 4602 +++ backoffice/vendors/moment/moment.min.js | 1 + .../vendors/tabulator/css/tabulator.css | 807 + .../vendors/tabulator/css/tabulator.min.css | 3 + .../tabulator/css/tabulator.min.css.map | 1 + .../tabulator/css/tabulator_midnight.css | 810 + .../tabulator/css/tabulator_midnight.min.css | 3 + .../css/tabulator_midnight.min.css.map | 1 + .../tabulator/css/tabulator_modern.css | 832 + .../tabulator/css/tabulator_modern.min.css | 3 + .../css/tabulator_modern.min.css.map | 1 + .../tabulator/css/tabulator_simple.css | 804 + .../tabulator/css/tabulator_simple.min.css | 3 + .../css/tabulator_simple.min.css.map | 1 + .../vendors/tabulator/css/tabulator_site.css | 804 + .../tabulator/css/tabulator_site.min.css | 3 + .../tabulator/css/tabulator_site.min.css.map | 1 + .../vendors/tabulator/js/modules/accessor.js | 91 + .../tabulator/js/modules/accessor.min.js | 2 + .../vendors/tabulator/js/modules/ajax.js | 465 + .../vendors/tabulator/js/modules/ajax.min.js | 2 + .../js/modules/calculation_colums.js | 468 + .../js/modules/calculation_colums.min.js | 2 + .../vendors/tabulator/js/modules/clipboard.js | 1011 + .../tabulator/js/modules/clipboard.min.js | 2 + .../vendors/tabulator/js/modules/data_tree.js | 341 + .../tabulator/js/modules/data_tree.min.js | 2 + .../vendors/tabulator/js/modules/download.js | 900 + .../tabulator/js/modules/download.min.js | 2 + .../vendors/tabulator/js/modules/edit.js | 1727 + .../vendors/tabulator/js/modules/edit.min.js | 2 + .../vendors/tabulator/js/modules/filter.js | 754 + .../tabulator/js/modules/filter.min.js | 2 + .../vendors/tabulator/js/modules/format.js | 632 + .../tabulator/js/modules/format.min.js | 2 + .../tabulator/js/modules/frozen_columns.js | 243 + .../js/modules/frozen_columns.min.js | 2 + .../tabulator/js/modules/frozen_rows.js | 98 + .../tabulator/js/modules/frozen_rows.min.js | 2 + .../tabulator/js/modules/group_rows.js | 1048 + .../tabulator/js/modules/group_rows.min.js | 2 + .../vendors/tabulator/js/modules/history.js | 141 + .../tabulator/js/modules/history.min.js | 2 + .../tabulator/js/modules/html_table_export.js | 377 + .../js/modules/html_table_export.min.js | 2 + .../tabulator/js/modules/html_table_import.js | 203 + .../js/modules/html_table_import.min.js | 2 + .../tabulator/js/modules/keybindings.js | 382 + .../tabulator/js/modules/keybindings.min.js | 2 + .../tabulator/js/modules/moveable_columns.js | 289 + .../js/modules/moveable_columns.min.js | 2 + .../tabulator/js/modules/moveable_rows.js | 580 + .../tabulator/js/modules/moveable_rows.min.js | 2 + .../vendors/tabulator/js/modules/mutator.js | 113 + .../tabulator/js/modules/mutator.min.js | 2 + .../vendors/tabulator/js/modules/page.js | 636 + .../vendors/tabulator/js/modules/page.min.js | 2 + .../tabulator/js/modules/persistence.js | 222 + .../tabulator/js/modules/persistence.min.js | 2 + .../vendors/tabulator/js/modules/print.js | 96 + .../vendors/tabulator/js/modules/print.min.js | 2 + .../tabulator/js/modules/reactive_data.js | 235 + .../tabulator/js/modules/reactive_data.min.js | 2 + .../tabulator/js/modules/resize_columns.js | 161 + .../js/modules/resize_columns.min.js | 2 + .../tabulator/js/modules/resize_rows.js | 98 + .../tabulator/js/modules/resize_rows.min.js | 2 + .../tabulator/js/modules/resize_table.js | 38 + .../tabulator/js/modules/resize_table.min.js | 2 + .../tabulator/js/modules/responsive_layout.js | 255 + .../js/modules/responsive_layout.min.js | 2 + .../tabulator/js/modules/select_row.js | 361 + .../tabulator/js/modules/select_row.min.js | 2 + .../vendors/tabulator/js/modules/sort.js | 560 + .../vendors/tabulator/js/modules/sort.min.js | 2 + .../vendors/tabulator/js/modules/validate.js | 219 + .../tabulator/js/modules/validate.min.js | 2 + backoffice/vendors/tabulator/js/tabulator.js | 22906 ++++++++++++ .../vendors/tabulator/js/tabulator.min.js | 11 + .../vendors/tabulator/js/tabulator_core.js | 7867 ++++ .../tabulator/js/tabulator_core.min.js | 5 + backoffice/vendors/tinymce/changelog.txt | 1393 + .../tinymce/js/tinymce/jquery.tinymce.min.js | 91 + .../vendors/tinymce/js/tinymce/langs/de.js | 260 + .../vendors/tinymce/js/tinymce/langs/fr_FR.js | 261 + .../tinymce/js/tinymce/langs/readme.md | 3 + .../vendors/tinymce/js/tinymce/license.txt | 504 + .../js/tinymce/plugins/advlist/plugin.min.js | 9 + .../js/tinymce/plugins/anchor/plugin.min.js | 9 + .../js/tinymce/plugins/autolink/plugin.min.js | 9 + .../tinymce/plugins/autoresize/plugin.min.js | 9 + .../js/tinymce/plugins/autosave/plugin.min.js | 9 + .../js/tinymce/plugins/bbcode/plugin.min.js | 9 + .../js/tinymce/plugins/charmap/plugin.min.js | 9 + .../js/tinymce/plugins/code/plugin.min.js | 9 + .../tinymce/plugins/codesample/plugin.min.js | 9 + .../tinymce/plugins/colorpicker/plugin.min.js | 9 + .../tinymce/plugins/contextmenu/plugin.min.js | 9 + .../plugins/directionality/plugin.min.js | 9 + .../js/tinymce/plugins/emoticons/js/emojis.js | 9015 +++++ .../plugins/emoticons/js/emojis.min.js | 2 + .../tinymce/plugins/emoticons/plugin.min.js | 9 + .../js/tinymce/plugins/fullpage/plugin.min.js | 9 + .../tinymce/plugins/fullscreen/plugin.min.js | 9 + .../js/tinymce/plugins/help/plugin.min.js | 9 + .../js/tinymce/plugins/hr/plugin.min.js | 9 + .../js/tinymce/plugins/image/plugin.min.js | 9 + .../tinymce/plugins/imagetools/plugin.min.js | 9 + .../tinymce/plugins/importcss/plugin.min.js | 9 + .../plugins/insertdatetime/plugin.min.js | 9 + .../plugins/legacyoutput/plugin.min.js | 9 + .../js/tinymce/plugins/link/plugin.min.js | 9 + .../js/tinymce/plugins/lists/plugin.min.js | 9 + .../js/tinymce/plugins/media/plugin.min.js | 9 + .../tinymce/plugins/nonbreaking/plugin.min.js | 9 + .../tinymce/plugins/noneditable/plugin.min.js | 9 + .../tinymce/plugins/pagebreak/plugin.min.js | 9 + .../js/tinymce/plugins/paste/plugin.min.js | 9 + .../js/tinymce/plugins/preview/plugin.min.js | 9 + .../js/tinymce/plugins/print/plugin.min.js | 9 + .../tinymce/plugins/quickbars/plugin.min.js | 9 + .../js/tinymce/plugins/save/plugin.min.js | 9 + .../plugins/searchreplace/plugin.min.js | 9 + .../plugins/spellchecker/plugin.min.js | 9 + .../js/tinymce/plugins/tabfocus/plugin.min.js | 9 + .../js/tinymce/plugins/table/plugin.min.js | 9 + .../js/tinymce/plugins/template/plugin.min.js | 9 + .../tinymce/plugins/textcolor/plugin.min.js | 9 + .../tinymce/plugins/textpattern/plugin.min.js | 9 + .../js/tinymce/plugins/toc/plugin.min.js | 9 + .../plugins/visualblocks/plugin.min.js | 9 + .../tinymce/plugins/visualchars/plugin.min.js | 9 + .../tinymce/plugins/wordcount/plugin.min.js | 9 + .../skins/content/dark/content.min.css | 7 + .../skins/content/default/content.min.css | 7 + .../skins/content/document/content.min.css | 7 + .../skins/content/writer/content.min.css | 7 + .../ui/oxide-dark/content.inline.min.css | 7 + .../skins/ui/oxide-dark/content.min.css | 7 + .../ui/oxide-dark/content.mobile.min.css | 7 + .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide-dark/skin.min.css | 7 + .../skins/ui/oxide-dark/skin.mobile.min.css | 7 + .../skins/ui/oxide/content.inline.min.css | 7 + .../js/tinymce/skins/ui/oxide/content.min.css | 7 + .../skins/ui/oxide/content.mobile.min.css | 7 + .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../js/tinymce/skins/ui/oxide/skin.min.css | 7 + .../skins/ui/oxide/skin.mobile.min.css | 7 + .../js/tinymce/themes/mobile/theme.min.js | 9 + .../js/tinymce/themes/silver/theme.min.js | 9 + .../vendors/tinymce/js/tinymce/tinymce.min.js | 9 + css/site.css | 4 + css/w3pro.css | 378 + img/favicon/android-chrome-144x144.png | Bin 0 -> 6818 bytes img/favicon/android-chrome-192x192.png | Bin 0 -> 9015 bytes img/favicon/android-chrome-36x36.png | Bin 0 -> 1408 bytes img/favicon/android-chrome-48x48.png | Bin 0 -> 1722 bytes img/favicon/android-chrome-72x72.png | Bin 0 -> 3493 bytes img/favicon/android-chrome-96x96.png | Bin 0 -> 4586 bytes img/favicon/apple-touch-icon-114x114.png | Bin 0 -> 4367 bytes img/favicon/apple-touch-icon-120x120.png | Bin 0 -> 4550 bytes img/favicon/apple-touch-icon-144x144.png | Bin 0 -> 5494 bytes img/favicon/apple-touch-icon-152x152.png | Bin 0 -> 5833 bytes img/favicon/apple-touch-icon-180x180.png | Bin 0 -> 6894 bytes img/favicon/apple-touch-icon-57x57.png | Bin 0 -> 1751 bytes img/favicon/apple-touch-icon-60x60.png | Bin 0 -> 1804 bytes img/favicon/apple-touch-icon-72x72.png | Bin 0 -> 2039 bytes img/favicon/apple-touch-icon-76x76.png | Bin 0 -> 2919 bytes img/favicon/apple-touch-icon-precomposed.png | Bin 0 -> 8127 bytes img/favicon/apple-touch-icon.png | Bin 0 -> 6894 bytes img/favicon/browserconfig.xml | 12 + img/favicon/favicon-16x16.png | Bin 0 -> 769 bytes img/favicon/favicon-32x32.png | Bin 0 -> 1284 bytes img/favicon/favicon-96x96.png | Bin 0 -> 4586 bytes img/favicon/favicon.ico | Bin 0 -> 7406 bytes img/favicon/manifest.json | 41 + img/favicon/mstile-144x144.png | Bin 0 -> 6797 bytes img/favicon/mstile-150x150.png | Bin 0 -> 6650 bytes img/favicon/mstile-310x150.png | Bin 0 -> 7237 bytes img/favicon/mstile-310x310.png | Bin 0 -> 14580 bytes img/favicon/mstile-70x70.png | Bin 0 -> 4651 bytes img/favicon/safari-pinned-tab.svg | 32 + img/htlogo.png | Bin 0 -> 44729 bytes img/slides/slide1.jpg | Bin 0 -> 582011 bytes img/slides/slide2.jpg | Bin 0 -> 61860 bytes img/slides/slide3.jpg | Bin 0 -> 58120 bytes img/slides/slide4.jpg | Bin 0 -> 124615 bytes index.cgi | 88 + js/slides.js | 27 + tmpl/skeleton/index.tt | 264 + 456 files changed, 177820 insertions(+) create mode 100644 .gitignore create mode 100644 backoffice/.htaccess create mode 100644 backoffice/api/db.cgi create mode 100644 backoffice/api/file.cgi create mode 100644 backoffice/api/fingerprint.cgi create mode 100644 backoffice/api/index.cgi create mode 100644 backoffice/api/lib/dksconfig.pm create mode 100644 backoffice/api/lib/dksdb.pm create mode 100644 backoffice/api/lib/dkssavefile.pm create mode 100644 backoffice/api/lib/sendemail.pm create mode 100644 backoffice/api/lib/session.pm create mode 100644 backoffice/api/sendEmail create mode 100644 backoffice/api/upload.cgi create mode 100644 backoffice/css/module.css create mode 100644 backoffice/css/w3pro.css create mode 100644 backoffice/data/.htaccess create mode 100644 backoffice/img/bg1.jpg create mode 100644 backoffice/img/favicon/android-icon-144x144.png create mode 100644 backoffice/img/favicon/android-icon-192x192.png create mode 100644 backoffice/img/favicon/android-icon-36x36.png create mode 100644 backoffice/img/favicon/android-icon-48x48.png create mode 100644 backoffice/img/favicon/android-icon-72x72.png create mode 100644 backoffice/img/favicon/android-icon-96x96.png create mode 100644 backoffice/img/favicon/apple-icon-114x114.png create mode 100644 backoffice/img/favicon/apple-icon-120x120.png create mode 100644 backoffice/img/favicon/apple-icon-144x144.png create mode 100644 backoffice/img/favicon/apple-icon-152x152.png create mode 100644 backoffice/img/favicon/apple-icon-180x180.png create mode 100644 backoffice/img/favicon/apple-icon-57x57.png create mode 100644 backoffice/img/favicon/apple-icon-60x60.png create mode 100644 backoffice/img/favicon/apple-icon-72x72.png create mode 100644 backoffice/img/favicon/apple-icon-76x76.png create mode 100644 backoffice/img/favicon/apple-icon-precomposed.png create mode 100644 backoffice/img/favicon/apple-icon.png create mode 100644 backoffice/img/favicon/browserconfig.xml create mode 100644 backoffice/img/favicon/favicon-16x16.png create mode 100644 backoffice/img/favicon/favicon-32x32.png create mode 100644 backoffice/img/favicon/favicon-96x96.png create mode 100644 backoffice/img/favicon/favicon.ico create mode 100644 backoffice/img/favicon/manifest.json create mode 100644 backoffice/img/favicon/ms-icon-144x144.png create mode 100644 backoffice/img/favicon/ms-icon-150x150.png create mode 100644 backoffice/img/favicon/ms-icon-310x310.png create mode 100644 backoffice/img/favicon/ms-icon-70x70.png create mode 100644 backoffice/img/icons/Agreement_01.svg create mode 100644 backoffice/img/icons/Bill.svg create mode 100644 backoffice/img/icons/Document_Save.svg create mode 100644 backoffice/img/icons/Floppy.svg create mode 100644 backoffice/img/icons/Folder_Delete_01.svg create mode 100644 backoffice/img/icons/Folder_Find_01.svg create mode 100644 backoffice/img/icons/Save.svg create mode 100644 backoffice/img/icons/access.svg create mode 100644 backoffice/img/icons/access_white.svg create mode 100644 backoffice/img/icons/address.svg create mode 100644 backoffice/img/icons/address_white.svg create mode 100644 backoffice/img/icons/apps.svg create mode 100644 backoffice/img/icons/apps_white.svg create mode 100644 backoffice/img/icons/archive.svg create mode 100644 backoffice/img/icons/archive_white.svg create mode 100644 backoffice/img/icons/calendar.svg create mode 100644 backoffice/img/icons/calendar_white.svg create mode 100644 backoffice/img/icons/club.svg create mode 100644 backoffice/img/icons/club_white.svg create mode 100644 backoffice/img/icons/clubs.svg create mode 100644 backoffice/img/icons/clubs_white.svg create mode 100644 backoffice/img/icons/code.svg create mode 100644 backoffice/img/icons/company.svg create mode 100644 backoffice/img/icons/company_white.svg create mode 100644 backoffice/img/icons/cube.svg create mode 100644 backoffice/img/icons/cube_white.svg create mode 100644 backoffice/img/icons/cubelight.svg create mode 100644 backoffice/img/icons/cubelight_white.svg create mode 100644 backoffice/img/icons/dashboard.svg create mode 100644 backoffice/img/icons/dashboard_white.svg create mode 100644 backoffice/img/icons/documents.svg create mode 100644 backoffice/img/icons/documents_white.svg create mode 100644 backoffice/img/icons/download.svg create mode 100644 backoffice/img/icons/download_white.svg create mode 100644 backoffice/img/icons/duplicate.svg create mode 100644 backoffice/img/icons/duplicate_white.svg create mode 100644 backoffice/img/icons/edit.svg create mode 100644 backoffice/img/icons/edit_white.svg create mode 100644 backoffice/img/icons/excel.svg create mode 100644 backoffice/img/icons/excel_white.svg create mode 100644 backoffice/img/icons/file.svg create mode 100644 backoffice/img/icons/file/dir.png create mode 100644 backoffice/img/icons/file/doc.png create mode 100644 backoffice/img/icons/file/docx.png create mode 100644 backoffice/img/icons/file/file.png create mode 100644 backoffice/img/icons/file/folderup.svg create mode 100644 backoffice/img/icons/file/folderup_white.svg create mode 100644 backoffice/img/icons/file/jpg.png create mode 100644 backoffice/img/icons/file/pdf.png create mode 100644 backoffice/img/icons/file/png.png create mode 100644 backoffice/img/icons/file/txt.png create mode 100644 backoffice/img/icons/file/xls.png create mode 100644 backoffice/img/icons/file/xlsx.png create mode 100644 backoffice/img/icons/file_white.svg create mode 100644 backoffice/img/icons/folder.svg create mode 100644 backoffice/img/icons/folder_add.svg create mode 100644 backoffice/img/icons/folder_add_white.svg create mode 100644 backoffice/img/icons/folder_white.svg create mode 100644 backoffice/img/icons/globe.svg create mode 100644 backoffice/img/icons/globe_white.svg create mode 100644 backoffice/img/icons/group.svg create mode 100644 backoffice/img/icons/group_white.svg create mode 100644 backoffice/img/icons/inbox.svg create mode 100644 backoffice/img/icons/inbox_white.svg create mode 100644 backoffice/img/icons/library.svg create mode 100644 backoffice/img/icons/library_white.svg create mode 100644 backoffice/img/icons/license.svg create mode 100644 backoffice/img/icons/license_white.svg create mode 100644 backoffice/img/icons/list.svg create mode 100644 backoffice/img/icons/list_white.svg create mode 100644 backoffice/img/icons/log.svg create mode 100644 backoffice/img/icons/log_white.svg create mode 100644 backoffice/img/icons/logout.svg create mode 100644 backoffice/img/icons/logout_white.svg create mode 100644 backoffice/img/icons/menu.svg create mode 100644 backoffice/img/icons/menu_white.svg create mode 100644 backoffice/img/icons/newspaper.svg create mode 100644 backoffice/img/icons/newspaper_white.svg create mode 100644 backoffice/img/icons/numberlist.svg create mode 100644 backoffice/img/icons/numberlist_white.svg create mode 100644 backoffice/img/icons/package.svg create mode 100644 backoffice/img/icons/package_white.svg create mode 100644 backoffice/img/icons/pdf.svg create mode 100644 backoffice/img/icons/pdf_white.svg create mode 100644 backoffice/img/icons/pdfexport.svg create mode 100644 backoffice/img/icons/pdfexport_white.svg create mode 100644 backoffice/img/icons/pictures.svg create mode 100644 backoffice/img/icons/pictures_white.svg create mode 100644 backoffice/img/icons/plus.svg create mode 100644 backoffice/img/icons/plus_white.svg create mode 100644 backoffice/img/icons/projects.svg create mode 100644 backoffice/img/icons/projects_white.svg create mode 100644 backoffice/img/icons/remove.svg create mode 100644 backoffice/img/icons/remove_white.svg create mode 100644 backoffice/img/icons/squares.svg create mode 100644 backoffice/img/icons/squares_white.svg create mode 100644 backoffice/img/icons/target.svg create mode 100644 backoffice/img/icons/target_white.svg create mode 100644 backoffice/img/icons/upload.svg create mode 100644 backoffice/img/icons/upload_white.svg create mode 100644 backoffice/img/icons/user.svg create mode 100644 backoffice/img/icons/user_white.svg create mode 100644 backoffice/img/logo_512.png create mode 100644 backoffice/img/no-image-icon.png create mode 100644 backoffice/img/no-news-img.png create mode 100644 backoffice/img/toplogo.png create mode 100644 backoffice/img/toplogo.svg create mode 100644 backoffice/index.cgi create mode 100644 backoffice/js/.DS_Store create mode 100644 backoffice/js/admin.js create mode 100644 backoffice/js/formsave.js create mode 100644 backoffice/js/module_global.js create mode 100644 backoffice/js/request.js create mode 100644 backoffice/tmpl/block/cgu.tt create mode 100644 backoffice/tmpl/block/dlguploadfile.tt create mode 100644 backoffice/tmpl/block/head.tt create mode 100644 backoffice/tmpl/block/snackbar.tt create mode 100644 backoffice/tmpl/block/toolbars.tt create mode 100644 backoffice/tmpl/macro/fields.tt create mode 100644 backoffice/tmpl/module/companies/index.js create mode 100644 backoffice/tmpl/module/companies/index.tt create mode 100644 backoffice/tmpl/module/dashboard/index.js create mode 100644 backoffice/tmpl/module/dashboard/index.tt create mode 100644 backoffice/tmpl/module/profile/dlgpassword.tt create mode 100644 backoffice/tmpl/module/profile/dlgusername.tt create mode 100644 backoffice/tmpl/module/profile/index.js create mode 100644 backoffice/tmpl/module/profile/index.tt create mode 100644 backoffice/tmpl/module/projects/cdm.js create mode 100644 backoffice/tmpl/module/projects/cdm.tt create mode 100644 backoffice/tmpl/module/projects/index.js create mode 100644 backoffice/tmpl/module/projects/index.tt create mode 100644 backoffice/tmpl/module/submissions/index.js create mode 100644 backoffice/tmpl/module/submissions/index.tt create mode 100644 backoffice/tmpl/module/upload/index.js create mode 100644 backoffice/tmpl/module/upload/index.tt create mode 100644 backoffice/tmpl/module/users/index.js create mode 100644 backoffice/tmpl/module/users/index.tt create mode 100644 backoffice/tmpl/module/users/javascript.tt create mode 100644 backoffice/tmpl/skeleton/index.tt create mode 100644 backoffice/tmpl/skeleton/login.tt create mode 100644 backoffice/tmpl/skeleton/login/forgotpassword.tt create mode 100644 backoffice/tmpl/skeleton/login/login.tt create mode 100644 backoffice/tmpl/skeleton/login/message.tt create mode 100644 backoffice/tmpl/skeleton/login/register.tt create mode 100644 backoffice/tmpl/skeleton/login/validationcode.tt create mode 100644 backoffice/tmpl/skeleton/module.tt create mode 100644 backoffice/tmpl/skeleton/module_file.tt create mode 100644 backoffice/vendors/choices/base.css create mode 100644 backoffice/vendors/choices/base.min.css create mode 100644 backoffice/vendors/choices/choices.css create mode 100644 backoffice/vendors/choices/choices.js create mode 100644 backoffice/vendors/choices/choices.min.css create mode 100644 backoffice/vendors/choices/choices.min.js create mode 100644 backoffice/vendors/choices/scripts/choices.js create mode 100644 backoffice/vendors/choices/scripts/choices.min.js create mode 100644 backoffice/vendors/flatpickr/flatpickr.css create mode 100644 backoffice/vendors/flatpickr/flatpickr.js create mode 100644 backoffice/vendors/flatpickr/flatpickr.min.css create mode 100644 backoffice/vendors/flatpickr/flatpickr.min.js create mode 100644 backoffice/vendors/flatpickr/ie.css create mode 100644 backoffice/vendors/flatpickr/index.d.ts create mode 100644 backoffice/vendors/flatpickr/l10n/de.d.ts create mode 100644 backoffice/vendors/flatpickr/l10n/de.js create mode 100644 backoffice/vendors/flatpickr/l10n/default.d.ts create mode 100644 backoffice/vendors/flatpickr/l10n/default.js create mode 100644 backoffice/vendors/flatpickr/l10n/fr.d.ts create mode 100644 backoffice/vendors/flatpickr/l10n/fr.js create mode 100644 backoffice/vendors/flatpickr/l10n/lu.d.ts create mode 100644 backoffice/vendors/flatpickr/l10n/lu.js create mode 100644 backoffice/vendors/flatpickr/plugins/confirmDate/confirmDate.css create mode 100644 backoffice/vendors/flatpickr/plugins/confirmDate/confirmDate.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/confirmDate/confirmDate.js create mode 100644 backoffice/vendors/flatpickr/plugins/labelPlugin/labelPlugin.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/labelPlugin/labelPlugin.js create mode 100644 backoffice/vendors/flatpickr/plugins/minMaxTimePlugin.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/minMaxTimePlugin.js create mode 100644 backoffice/vendors/flatpickr/plugins/monthSelect/index.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/monthSelect/index.js create mode 100644 backoffice/vendors/flatpickr/plugins/monthSelect/style.css create mode 100644 backoffice/vendors/flatpickr/plugins/monthSelect/tests.spec.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/rangePlugin.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/rangePlugin.js create mode 100644 backoffice/vendors/flatpickr/plugins/scrollPlugin.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/scrollPlugin.js create mode 100644 backoffice/vendors/flatpickr/plugins/weekSelect/weekSelect.d.ts create mode 100644 backoffice/vendors/flatpickr/plugins/weekSelect/weekSelect.js create mode 100644 backoffice/vendors/flatpickr/themes/airbnb.css create mode 100644 backoffice/vendors/flatpickr/themes/confetti.css create mode 100644 backoffice/vendors/flatpickr/themes/dark.css create mode 100644 backoffice/vendors/flatpickr/themes/light.css create mode 100644 backoffice/vendors/flatpickr/themes/material_blue.css create mode 100644 backoffice/vendors/flatpickr/themes/material_green.css create mode 100644 backoffice/vendors/flatpickr/themes/material_orange.css create mode 100644 backoffice/vendors/flatpickr/themes/material_red.css create mode 100644 backoffice/vendors/flatpickr/types/globals.d.ts create mode 100644 backoffice/vendors/flatpickr/types/instance.d.ts create mode 100644 backoffice/vendors/flatpickr/types/locale.d.ts create mode 100644 backoffice/vendors/flatpickr/types/options.d.ts create mode 100644 backoffice/vendors/flatpickr/typings.d.ts create mode 100644 backoffice/vendors/flatpickr/utils/dates.d.ts create mode 100644 backoffice/vendors/flatpickr/utils/dom.d.ts create mode 100644 backoffice/vendors/flatpickr/utils/formatting.d.ts create mode 100644 backoffice/vendors/flatpickr/utils/index.d.ts create mode 100644 backoffice/vendors/flatpickr/utils/polyfills.d.ts create mode 100644 backoffice/vendors/jspdf/jspdf.min.js create mode 100644 backoffice/vendors/jspdf/jspdf.plugin.autotable.js create mode 100644 backoffice/vendors/jspdf/jspdf.plugin.autotable.min.js create mode 100644 backoffice/vendors/jsxlsx/LICENSE create mode 100644 backoffice/vendors/jsxlsx/cpexcel.js create mode 100644 backoffice/vendors/jsxlsx/jszip.js create mode 100644 backoffice/vendors/jsxlsx/shim.min.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.core.min.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.core.min.map create mode 100644 backoffice/vendors/jsxlsx/xlsx.extendscript.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.full.min.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.full.min.map create mode 100644 backoffice/vendors/jsxlsx/xlsx.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.min.js create mode 100644 backoffice/vendors/jsxlsx/xlsx.min.map create mode 100644 backoffice/vendors/moment/moment-with-locales.js create mode 100644 backoffice/vendors/moment/moment-with-locales.min.js create mode 100644 backoffice/vendors/moment/moment.js create mode 100644 backoffice/vendors/moment/moment.min.js create mode 100644 backoffice/vendors/tabulator/css/tabulator.css create mode 100644 backoffice/vendors/tabulator/css/tabulator.min.css create mode 100644 backoffice/vendors/tabulator/css/tabulator.min.css.map create mode 100644 backoffice/vendors/tabulator/css/tabulator_midnight.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_midnight.min.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_midnight.min.css.map create mode 100644 backoffice/vendors/tabulator/css/tabulator_modern.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_modern.min.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_modern.min.css.map create mode 100644 backoffice/vendors/tabulator/css/tabulator_simple.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_simple.min.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_simple.min.css.map create mode 100644 backoffice/vendors/tabulator/css/tabulator_site.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_site.min.css create mode 100644 backoffice/vendors/tabulator/css/tabulator_site.min.css.map create mode 100644 backoffice/vendors/tabulator/js/modules/accessor.js create mode 100644 backoffice/vendors/tabulator/js/modules/accessor.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/ajax.js create mode 100644 backoffice/vendors/tabulator/js/modules/ajax.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/calculation_colums.js create mode 100644 backoffice/vendors/tabulator/js/modules/calculation_colums.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/clipboard.js create mode 100644 backoffice/vendors/tabulator/js/modules/clipboard.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/data_tree.js create mode 100644 backoffice/vendors/tabulator/js/modules/data_tree.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/download.js create mode 100644 backoffice/vendors/tabulator/js/modules/download.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/edit.js create mode 100644 backoffice/vendors/tabulator/js/modules/edit.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/filter.js create mode 100644 backoffice/vendors/tabulator/js/modules/filter.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/format.js create mode 100644 backoffice/vendors/tabulator/js/modules/format.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/frozen_columns.js create mode 100644 backoffice/vendors/tabulator/js/modules/frozen_columns.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/frozen_rows.js create mode 100644 backoffice/vendors/tabulator/js/modules/frozen_rows.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/group_rows.js create mode 100644 backoffice/vendors/tabulator/js/modules/group_rows.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/history.js create mode 100644 backoffice/vendors/tabulator/js/modules/history.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/html_table_export.js create mode 100644 backoffice/vendors/tabulator/js/modules/html_table_export.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/html_table_import.js create mode 100644 backoffice/vendors/tabulator/js/modules/html_table_import.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/keybindings.js create mode 100644 backoffice/vendors/tabulator/js/modules/keybindings.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/moveable_columns.js create mode 100644 backoffice/vendors/tabulator/js/modules/moveable_columns.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/moveable_rows.js create mode 100644 backoffice/vendors/tabulator/js/modules/moveable_rows.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/mutator.js create mode 100644 backoffice/vendors/tabulator/js/modules/mutator.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/page.js create mode 100644 backoffice/vendors/tabulator/js/modules/page.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/persistence.js create mode 100644 backoffice/vendors/tabulator/js/modules/persistence.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/print.js create mode 100644 backoffice/vendors/tabulator/js/modules/print.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/reactive_data.js create mode 100644 backoffice/vendors/tabulator/js/modules/reactive_data.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_columns.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_columns.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_rows.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_rows.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_table.js create mode 100644 backoffice/vendors/tabulator/js/modules/resize_table.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/responsive_layout.js create mode 100644 backoffice/vendors/tabulator/js/modules/responsive_layout.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/select_row.js create mode 100644 backoffice/vendors/tabulator/js/modules/select_row.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/sort.js create mode 100644 backoffice/vendors/tabulator/js/modules/sort.min.js create mode 100644 backoffice/vendors/tabulator/js/modules/validate.js create mode 100644 backoffice/vendors/tabulator/js/modules/validate.min.js create mode 100644 backoffice/vendors/tabulator/js/tabulator.js create mode 100644 backoffice/vendors/tabulator/js/tabulator.min.js create mode 100644 backoffice/vendors/tabulator/js/tabulator_core.js create mode 100644 backoffice/vendors/tabulator/js/tabulator_core.min.js create mode 100644 backoffice/vendors/tinymce/changelog.txt create mode 100644 backoffice/vendors/tinymce/js/tinymce/jquery.tinymce.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/langs/de.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/langs/fr_FR.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/langs/readme.md create mode 100644 backoffice/vendors/tinymce/js/tinymce/license.txt create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/advlist/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/anchor/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/autolink/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/autoresize/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/autosave/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/bbcode/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/charmap/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/code/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/codesample/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/directionality/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/emoticons/js/emojis.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/emoticons/js/emojis.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/emoticons/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/fullpage/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/help/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/hr/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/image/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/imagetools/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/importcss/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/link/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/lists/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/media/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/noneditable/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/paste/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/preview/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/print/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/quickbars/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/save/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/table/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/template/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/textcolor/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/textpattern/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/toc/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/visualchars/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/plugins/wordcount/plugin.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/content/dark/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/content/default/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/content/document/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/content/writer/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/content.mobile.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide-dark/skin.mobile.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/content.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/content.mobile.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/skin.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 backoffice/vendors/tinymce/js/tinymce/themes/mobile/theme.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/themes/silver/theme.min.js create mode 100644 backoffice/vendors/tinymce/js/tinymce/tinymce.min.js create mode 100644 css/site.css create mode 100644 css/w3pro.css create mode 100644 img/favicon/android-chrome-144x144.png create mode 100644 img/favicon/android-chrome-192x192.png create mode 100644 img/favicon/android-chrome-36x36.png create mode 100644 img/favicon/android-chrome-48x48.png create mode 100644 img/favicon/android-chrome-72x72.png create mode 100644 img/favicon/android-chrome-96x96.png create mode 100644 img/favicon/apple-touch-icon-114x114.png create mode 100644 img/favicon/apple-touch-icon-120x120.png create mode 100644 img/favicon/apple-touch-icon-144x144.png create mode 100644 img/favicon/apple-touch-icon-152x152.png create mode 100644 img/favicon/apple-touch-icon-180x180.png create mode 100644 img/favicon/apple-touch-icon-57x57.png create mode 100644 img/favicon/apple-touch-icon-60x60.png create mode 100644 img/favicon/apple-touch-icon-72x72.png create mode 100644 img/favicon/apple-touch-icon-76x76.png create mode 100644 img/favicon/apple-touch-icon-precomposed.png create mode 100644 img/favicon/apple-touch-icon.png create mode 100644 img/favicon/browserconfig.xml create mode 100644 img/favicon/favicon-16x16.png create mode 100644 img/favicon/favicon-32x32.png create mode 100644 img/favicon/favicon-96x96.png create mode 100644 img/favicon/favicon.ico create mode 100644 img/favicon/manifest.json create mode 100644 img/favicon/mstile-144x144.png create mode 100644 img/favicon/mstile-150x150.png create mode 100644 img/favicon/mstile-310x150.png create mode 100644 img/favicon/mstile-310x310.png create mode 100644 img/favicon/mstile-70x70.png create mode 100644 img/favicon/safari-pinned-tab.svg create mode 100644 img/htlogo.png create mode 100644 img/slides/slide1.jpg create mode 100644 img/slides/slide2.jpg create mode 100644 img/slides/slide3.jpg create mode 100644 img/slides/slide4.jpg create mode 100644 index.cgi create mode 100644 js/slides.js create mode 100644 tmpl/skeleton/index.tt diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2ff3f331 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +backoffice/api/lib/perl5 + diff --git a/backoffice/.htaccess b/backoffice/.htaccess new file mode 100644 index 00000000..ff153d93 --- /dev/null +++ b/backoffice/.htaccess @@ -0,0 +1,9 @@ +RewriteEngine on + +DirectoryIndex index.cgi index.html +AddHandler cgi-script .cgi +#RewriteBase / +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +RewriteRule "^(.*)$" "index.cgi" [NC,L,QSA] \ No newline at end of file diff --git a/backoffice/api/db.cgi b/backoffice/api/db.cgi new file mode 100644 index 00000000..5e529491 --- /dev/null +++ b/backoffice/api/db.cgi @@ -0,0 +1,93 @@ +#!/usr/bin/perl +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use CGI; +use CGI::Cookie; +# use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use JSON::PP; + +use dksconfig qw/$sitecfg/; +use dksdb; + +use session; +#use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +my $html->{result} = (); +$p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +my $se = session->new(); +my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); +if ($sess == undef){ + $html->{error} = "No Authorisation"; + print JSON::PP::encode_json($html); + exit(0); +} +# $html->{p} = $p; +# $html->{sess} =$sess; +#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/'; +if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ + + my @params = $cgi->param(); + foreach my $pp (@params){ + $p->{$pp} = $cgi->param($pp); + } + my $db = dksdb->new(); + if (exists($p->{get})){ + my $sql = "select * from vw_".$p->{get}; + if (exists($p->{fields}) ){ + $sql = "select ".$p->{fields}." from vw_".$p->{get}; + } + if (exists($p->{filter})){ + $sql .= " WHERE ".$p->{filter}.";"; + } + $html->{result}->{sqldata} = $db->dbqueryarray($sql); + } + elsif (exists($p->{set})){ + my $type = "ins"; + foreach my $x (keys(%{$p})){ + if (($x =~ /^ident_/) && ($p->{$x} ne "")){ + $type = "upd"; + last; + } + } + my $x = $p; + delete $x->{sid}; + delete $x->{set}; + my @sql = (); + if ($type eq "ins"){ + @sql = $db->create_ddl_insert($x); + }else { + @sql = $db->create_ddl_update($x); + } + if (scalar(@sql) > 0 ){ + my $rid = $db->dbquerysorted($sql[0]); + if (keys(%{$rid}) > 0 ){ + $html->{result} = $rid->{0}; + } + } + } + elsif (exists($p->{del})){ + my $x = $p; + delete $x->{sid}; + delete $x->{del}; + my @sql = $db->create_ddl_delete($x); + if (scalar(@sql) > 0 ){ + my $rid = $db->dbexec($sql[0]); + if (keys(%{$rid}) > 0 ){ + $html->{result} = $rid->{0}; + } + } + } +} +print JSON::PP::encode_json($html); +# for my $e ( keys %ENV ) { +# print "$e: $ENV{$e}
"; +# } \ No newline at end of file diff --git a/backoffice/api/file.cgi b/backoffice/api/file.cgi new file mode 100644 index 00000000..33d3bee8 --- /dev/null +++ b/backoffice/api/file.cgi @@ -0,0 +1,136 @@ +#!/usr/bin/perl + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use CGI; +use CGI::Cookie; +# use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use File::Path qw/make_path/; +use JSON::PP; +use Image::Size; +use dksconfig qw/$sitecfg/; +use dksdb; + +use session; +#use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +# if ($sitecfg->{basepath} ne "/"){ +$sitecfg->{docroot} = $sitecfg->{docroot}.substr($sitecfg->{basepath},0,index($sitecfg->{basepath},'backoffice')-1); +# } +my $html->{result} = (); +$p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +my $se = session->new(); +my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); +if ($sess == undef){ + $html->{error} = "No Authorisation"; + print JSON::PP::encode_json($html); + exit(0); +} +$html->{docroot} = $sitecfg->{docroot}; +# $html->{basepath} = $sitecfg->{basepath}; +if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ + + if (exists($p->{fn}) && $p->{fn} eq "list"){ + if (exists($p->{folder})){ + + $p->{folder} =~ s/\.\.\///g; + my $cpath = $sitecfg->{docroot}.'/'.$p->{folder}; + my @items = (); + my $up = (); + # if (index($p->{folder},'/') > 0){ + # $up->{type} = "dir"; + # $up->{name} = ".."; + # $up->{sitepath} = $p->{folder}; + # $up->{path} = $p->{folder}; + # $up->{mimtype} = 'directory'; + # $up->{size} = ''; + # $up->{dimension}; + # $up->{thumb} = ''; + # push (@items,$up); + # } + opendir(DIR,$cpath); + + while (my $d = readdir(DIR)){ + if ($d =~ /^\./){ next; } + if ($d eq "thb"){ next; } + my $e = (); + if (-d $cpath.'/'.$d){ + $e->{type} = "dir"; + $e->{name} = $d; + $e->{sitepath} = $p->{folder}.'/'.$d; + $e->{path} = $p->{folder}.'/'.$d; + $e->{mimtype} = 'directory'; + $e->{size} = ''; + + my $cmd = 'find "'.$cpath.'/'.$d.'" -type f | grep -v \'/thb/\' | wc -l'; + my $dim = `$cmd`; + chomp($dim); + $e->{dimension} = $dim; + + $e->{thumb} = ''; + } + if (-f $cpath.'/'.$d){ + my $cmd = 'file -i "'.$cpath.'/'.$d.'" | awk -F": " \'{ print $2 }\' | awk -F";" \'{ print $1 }\''; + my $mt = `$cmd`; + chomp($mt); + #if (($mt !~ /^image/ ) || ($mt !~ /^application\/pdf/ )) { next; } + if (($mt =~ /^image/ ) || ($mt !~ /^application\/pdf/ )) { + if (! -f $cpath.'/thb/'.$d.'.thb.png'){ + if (! -d $cpath.'/thb'){ + make_path($cpath.'/thb'); + } + system('convert -thumbnail x96 -background white -alpha remove "'.$cpath.'/'.$d.'" "'.$cpath.'/thb/'.$d.'.thb.png"'); + } + if ($mt =~ /^image/ ){ + my ($ix, $iy) = imgsize($cpath.'/'.$d); + $e->{dimension} = $ix."x".$iy; + } + } + my @st = stat($cpath.'/'.$d); + $e->{type} = "file"; + $e->{mimetype} = $mt; + my $s = $st[7]; + my $hrs =""; + if ($s > 1000000024){ + $s = $s/1024; + $s = $s/1024; + $s = $s/1024; + ($hrs) = $s =~ m/^(\d+\.\d\d).*/; + $hrs = $hrs." GB"; + } elsif ($s > 1000024){ + $s = $s/1024; + $s = $s/1024; + ($hrs) = $s =~ m/^(\d+\.\d\d).*/; + $hrs = $hrs." MB"; + } elsif ($s > 1024){ + $s = $s/1024; + ($hrs) = $s =~ m/^(\d+\.\d\d).*/; + $hrs = $hrs." KB"; + } else { + $hrs = $s." B"; + } + $e->{hrsize} = $hrs; + $e->{size} = $st[7]; + $e->{name} = $d; + $e->{sitepath} = $p->{folder}.'/'.$d; + $e->{thumb} = ''; + $e->{path} = '../../../'.$p->{folder}.'/'.$d; + } + push (@items,$e); + } + closedir(DIR); + $html->{result} = \@items; + + } + } +} +print JSON::PP::encode_json($html); diff --git a/backoffice/api/fingerprint.cgi b/backoffice/api/fingerprint.cgi new file mode 100644 index 00000000..db482dff --- /dev/null +++ b/backoffice/api/fingerprint.cgi @@ -0,0 +1,23 @@ +#!/usr/bin/perl + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use CGI; +use CGI::Cookie; +#use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use File::Path qw/make_path/; +use JSON::PP; +use Image::Size; +use dksconfig qw/$sitecfg/; +use dksdb; + +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} + diff --git a/backoffice/api/index.cgi b/backoffice/api/index.cgi new file mode 100644 index 00000000..833a85db --- /dev/null +++ b/backoffice/api/index.cgi @@ -0,0 +1,152 @@ +#!/usr/bin/perl +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use CGI; +use CGI::Cookie; +#use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use JSON::PP; + +use dksconfig qw/$sitecfg/; +use dksdb; + +use session; +use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); +} +my $html->{result} = (); +$p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +my $se = session->new(); +my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8"); +if ($sess == undef){ + $html->{error} = "No Authorisation"; + print JSON::PP::encode_json($html); + exit(0); +} +$html->{p} = $p; +# $html->{sess} =$sess; +#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/'; +if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ + + my @params = $cgi->param(); + foreach my $pp (@params){ + $p->{$pp} = $cgi->param($pp); + } + + if (exists($p->{fn})){ + + my $db = dksdb->new(); + if ($p->{fn} eq "savefield"){ + # $html->{p} = $p; + $html->{result}->{ident} = $p->{ident}; + delete $p->{ident}; + delete $p->{fn}; + delete $p->{sid}; + my $retid=undef; + my $type = "upd"; + foreach my $px (keys(%{$p})){ + $html->{result}->{datafield} = $px; + if (($px =~ /\_id$/) && ($p->{$px} eq "")){ + $type = "ins"; + + } + } + my @sql = (); + if ($type eq "ins"){ + @sql = $db->create_ddl_insert($p); + } + else { + @sql = $db->create_ddl_update($p); + } + $html->{result}->{sql} = \@sql; + foreach my $s (@sql){ + $retid= $db->dbquerysorted($s); + } + $html->{result}->{id} = $retid->{0}; + #$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type} + } + + elsif ($p->{fn} eq "saveform"){ + # $html->{p} = $p; + $html->{result}->{ident} = $p->{ident}; + delete $p->{ident}; + delete $p->{fn}; + delete $p->{sid}; + my $retid=undef; + my $type = "upd"; + foreach my $px (keys(%{$p})){ + $html->{result}->{datafield} = $px; + if (($px =~ /\_id$/) && ($p->{$px} eq "")){ + $type = "ins"; + delete $p->{$px}; + } + } + my @sql = (); + if ($type eq "ins"){ + @sql = $db->create_ddl_insert($p); + } + else { + @sql = $db->create_ddl_update($p); + } + # $html->{sql} = \@sql; + foreach my $s (@sql){ + #if ($type eq "ins"){ + $retid= $db->dbquerysorted($s); + #}else { + + #} + + } + $html->{result}->{id} = $retid->{0}; + #$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type} + } + elsif($p->{fn} eq "deleterow"){ + delete $p->{fn}; + delete $p->{sid}; + my $retid = undef; + my @sql = $db->create_ddl_delete($p); + foreach my $s (@sql){ + $retid= $db->dbexec($s); + } + $html->{result}->{id} = $retid->{0}; + } + elsif($p->{fn} eq "savepassword"){ + if ((length($p->{pwd}) > 7) && ($p->{pwd} =~ /\d/) && ($p->{pwd} =~ /[a-z]/) && ($p->{pwd} =~ /[A-Z]/) ){ + $se->savepassword($sess->{id},$p->{pwd}); + $html->{result} = "OK"; + }else { + $html->{result} = "NOT OK"; + } + + } + elsif ($p->{fn} eq "sendmailvcode"){ + my $vcode = $se->randomstring(6); + $vcode = lc($vcode); + $db->dbexec("UPDATE users set vcode='".$vcode."' where id=".$sess->{id}.";"); + my $eml = sendemail->new(); + my $mret = $eml->sendemail('user_verification',$sess->{id},$p->{mail},{vcode => $vcode},undef); + if ($mret == 0){ + $html->{result}->{vcode} = $vcode; + } else { + $html->{result}->{vcode} = $vcode; + $html->{result}->{error} = $mret; + } + } + elsif ($p->{fn} eq "savenewemail"){ + $db->dbexec("update users set username='".$p->{email}."' where id=".$sess->{id}." and vcode='".$p->{vcode}."';"); + $html->{result} = "OK"; + } + elsif($p->{fn} eq "getsitemedia"){ + my $path = dirname(dirname($0)).'/img'; + } + } + +} +print JSON::PP::encode_json($html); diff --git a/backoffice/api/lib/dksconfig.pm b/backoffice/api/lib/dksconfig.pm new file mode 100644 index 00000000..270fff14 --- /dev/null +++ b/backoffice/api/lib/dksconfig.pm @@ -0,0 +1,28 @@ +package dksconfig; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use File::Basename; +use Exporter 'import'; +our @EXPORT_OK = qw($sitecfg); + +our $sitecfg ={ + cookiename => 'hourtrax', + dbtype => 'PgPP', + dsn => 'DBI:PgPP:dbname=potlu_db;host=DKS-LAPTOP.fritz.box', + #dsn => 'DBI:PgPP:dbname=solarch_db;host=sql629.your-server.de', + dbuser => 'potlu_user', + dbpassword => 'r2btTTRfuJz4whez', + page => 'index.tt', + pagename => 'index', + basepath => substr((exists($ENV{"SCRIPT_FILENAME"})?dirname($ENV{"SCRIPT_FILENAME"}):dirname($0)),length($ENV{"DOCUMENT_ROOT"})), + #datapath => substr((exists($ENV{"SCRIPT_FILENAME"})?dirname($ENV{"SCRIPT_FILENAME"}):dirname($0)),length($ENV{"DOCUMENT_ROOT"})).'/data/', + docroot => $ENV{"DOCUMENT_ROOT"}, + registration_enabled => '0', + default_group => 'users', + sitename => 'Accès - Client' +}; + +1; \ No newline at end of file diff --git a/backoffice/api/lib/dksdb.pm b/backoffice/api/lib/dksdb.pm new file mode 100644 index 00000000..2234a013 --- /dev/null +++ b/backoffice/api/lib/dksdb.pm @@ -0,0 +1,409 @@ +package dksdb; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +BEGIN { $ENV{DBI_PUREPERL} = 2 } +use DBI; +use File::Basename; + +use Digest::SHA::PurePerl qw(sha256_hex); +use DBD::PgPP; +use URI::Encode qw(uri_encode uri_decode); +use Encode; +use dksconfig qw($sitecfg); +use Text::Unidecode; + + +sub new { + my $class = shift; + my $p = shift; + my $self = bless {}, $class; + return $self; +} + +sub securetext(){ + my $self = shift; + my $text = shift; + $text =~ s/'/''/g; + return $text; +} + +sub dbquery(){ + my $self = shift; + my $stat = shift; + # my $vw_info = shift; + my $retdata = undef; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + $stat = encode("utf8", $stat); + # open FILE,">>tmp/sql.log"; + # print FILE "$stat\n"; + # close FILE; + my $sth = $dbh->prepare($stat) or return $retdata->{error} = "dbquery".$dbh->errstr. "- SQL: ".$stat;; + + + $sth->execute() or return $retdata->{error} = "dbquery: ".$sth->errstr; + + my $data = $sth->fetchrow_hashref(); + foreach my $k (keys %{$data}){ + $retdata->{$k} = decode("utf-8",$data->{$k}); + } + + $sth->finish(); + $dbh->disconnect(); + + return $retdata; +} + +sub dbquerybykey(){ + my $self = shift; + my $key = shift; + my $stat = shift; + #my $retempty = shift; + my $retdata =(); + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + # $stat = encode("utf8", $stat); + + # open FILE,">>sql.log"; + # print FILE "$stat\n"; + # close FILE; + my $sth = $dbh->prepare($stat) or return $retdata->{error} = "dbquery: ".$stat; + $sth->execute() or return $retdata->{error} = "dbquery: ".$stat; + while(my $data = $sth->fetchrow_hashref()) + { + if (exists $data->{$key}){ + foreach my $k (keys %{$data}){ + #if ($k ne $key){ + + $retdata->{$data->{$key}}{$k} =decode("utf-8",$data->{$k}); + #} + } + } + } + if (keys(%{$retdata}) == 0){ + $retdata =(); + } + $sth->finish(); + $dbh->disconnect(); + return $retdata; +} + +sub dbquerysorted(){ + my $self = shift; + my $stat = shift; + # my $vw_info = shift; + my $retdata; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + # $stat = encode("utf8", $stat); + # open FILE,">>tmp/sql.log"; + # print FILE "\n==\n$stat\n==\n"; + # close FILE; + my $sth = $dbh->prepare($stat) or return $retdata->{error} = "dbquerysorted ".$dbh->errstr. "- SQL: ".$stat;; + + + $sth->execute() or return $retdata->{error} = "dbquerysorted: ".$sth->errstr; + my $count = 0; + + while(my $data = $sth->fetchrow_hashref()) + { + #$retdata->{$count} = $data; + foreach my $k (keys %{$data}){ + $retdata->{$count}->{$k} = decode("utf-8",$data->{$k}); + } + $count++; + } + +# my $qstruct = (); +# my $num_fields = $sth->{NUM_OF_FIELDS}; + +# for ( my $i=0; $i< $num_fields; $i++ ) { +# $qstruct->{$i}->{name} = $sth->{NAME}->[$i]; +# #$qstruct->{$i}->{type} = $sth->{COMMENT}->[$i]; +# #$qstruct->{$i}->{precision} = $sth->{PRECISION}->[$i]; +# } + + $sth->finish(); + $dbh->disconnect(); + + return $retdata; +} + +sub dbexec(){ + my $self = shift; + my $stat = shift; + my $retdata; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + # $stat = decode("UTF-8", $stat); + # open FILE,">>tmp/sql.log"; + # print FILE "\n==\n$stat\n==\n"; + # close FILE; + my $sth = $dbh->prepare($stat) or return $retdata->{error} = "dbexec ".$dbh->errstr. "- SQL: ".$stat;; + $retdata->{success} = $dbh->do($stat) or return $retdata->{error} = "dbexec ".$dbh->errstr. "- SQL: ".$stat; + $dbh->disconnect(); + return $retdata; +} + +sub dbqueryarray(){ + my $self = shift; + my $stat = shift; + my @retdata = (); + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return ({"error" => "dbqueryarray Connection Error!".$!}); + #$stat = encode("utf8", $stat); + #open FILE,">>/tmp/sql.log"; + #print "$stat\n"; + # close FILE; + my $sth = $dbh->prepare($stat); + + $sth->execute() or print "dbqueryarray: ".$sth->errstr; + my $count = 0; + + while(my $data = $sth->fetchrow_hashref()) + { + my $row = (); + foreach my $k (keys %{$data}){ + $row->{$k} = decode("utf-8",$data->{$k}); + } + push @retdata,$row; + } + + $sth->finish(); + $dbh->disconnect(); + #%retdata = sort {$a <=> $b} keys %retdata; + return \@retdata; +} + + +sub create_ddl_insert(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + + foreach my $f (keys(%{$data})){ + if (($f =~ /\_/) && ($f !~ /^ident_/)){ + my $t = substr($f,0,index($f,"_")); + my $c = substr($f,length($t)+1); + #my ($t,$c) = $f =~ m/(.+)\_(.+)/; + $fields->{$t}->{$c} = $data->{$f}; + } elsif ($f =~ /^ident_/){ + my $f2 = $f; + $f2 =~ s/^ident_//; + + my $t = substr($f2,0,index($f2,"_")); + my $c = substr($f2,length($t)+1); + $fields->{$t}->{$c} = $data->{$f}; + } + + } + + foreach my $tb (keys(%{$fields})){ + my @sqlcol = (); + my @sqlval = (); + foreach my $c (keys(%{$fields->{$tb}})){ + my $v = $fields->{$tb}->{$c}; + $v =~ s/'/''/g; + push (@sqlcol,$c); + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlval,$v); + } + push(@ddl,"INSERT INTO public.".$tb." (".join(",",@sqlcol).") VALUES (".join(",",@sqlval).") returning id;"); + } + return @ddl; +} + +sub create_ddl_insert_json(){ + my $self = shift; + my $schema = shift; + my $table = shift; + my $columns = shift; + my $data = shift; + my @ddl = (); + my @sqlcol = (); + my @sqlval = (); + foreach my $c (keys(%{$data})){ + #if (exists($columns->{$c})){ + push (@sqlcol,'"'.$c.'"'); + my $v = $data->{$c}; + + if ($v eq ''){ + $v = 'null'; + }elsif ($v =~ /^data:.+;base64,/){ + $v =~ s/'/''/g; + $v = "'".$v."'"; + } + else { + $v= uri_decode($v); + $v =~ s/'/''/g; + if ($columns->{$c}->{data_type} eq "ARRAY"){ + if (ref($data->{$c}) eq "ARRAY"){ + $v = "{\"".join("\",\"",@{$data->{$c}})."\"}"; + } + else { + $v = 'null'; + } + $v =~ s/""/null/g; + }elsif ($columns->{$c}->{data_type} =~ /^timestamp/ ){ + + }elsif($columns->{$c}->{data_type} eq "date"){ + + }elsif($columns->{$c}->{data_type} eq "time"){ + + } + $v = "'".$v."'"; + } + push (@sqlval,$v); + #} + } + return "INSERT INTO public.".$schema.".\"".$table."\" (".join(",",@sqlcol).") VALUES (".join(",",@sqlval).");"; +} + +sub create_ddl_update(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my $fx = substr($f,6); + my $t = substr($fx,0,index($fx,"_")); + my $c = substr($fx,length($t)+1); + #my ($t,$c) = $f =~ m/^ident_(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{cond}->{$c} = $data->{$f}; + } elsif ( ($f !~ /^ident/) && ($f =~ /.+\_.+/) ){ + my $t = substr($f,0,index($f,"_")); + my $c = substr($f,length($t)+1); + #my ($t,$c) = $f =~ m/^(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{fields}->{$c} = $data->{$f}; + } + } + foreach my $tb (keys(%{$fields})){ + my @sqlupd = (); + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{fields}})){ + + my $v = $fields->{$tb}->{fields}->{$c}; + $v =~ s/'/''/g; + + if ($c =~ /-/){ + my @jp = split('-',$c); + if ($v eq ''){ + $v = 'null'; + } else { + $v = '"'.$v.'"'; + } + $c = 'jsonb_set(to_jsonb('.$jp[0].'),\'{"'.$jp[1].'"}\',\''.$v.'\')::json'; + push (@sqlupd,$jp[0]."=".$c); + }else { + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlupd,$c."=".$v); + } + + } + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlcond,$c."=".$v); + } + push(@ddl,"UPDATE public.".$tb." SET ".join(",",@sqlupd)." WHERE ".join(" AND ",@sqlcond).";"); + } + + return @ddl; +} + +sub create_cnt_statement(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my $fx = substr($f,6); + my $t = substr($fx,0,index($fx,"_")); + my $c = substr($fx,length($t)+1); + #my ($t,$c) = $f =~ m/^ident_(.+)\_([a-z0-9|\_]+)/; + $fields->{$t}->{cond}->{$c} = $data->{$f}; + } + } + foreach my $tb (keys(%{$fields})){ + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + if ($v eq ''){ + $v = 'null'; + } else { + $v = "'".$v."'"; + } + push (@sqlcond,$c."=".$v); + } + push(@ddl,"SELECT count(*) as cnt from ".$tb." WHERE ".join(" AND ",@sqlcond).";"); + } + # open FILE,">>tmp/sql.log"; + # print FILE "\n==\n".join("\n",@ddl)."\n==\n"; + # close FILE; + return @ddl; +} + +sub create_ddl_delete(){ + my $self = shift; + my $data = shift; + my $fields = (); + my @ddl = (); + my @refcols = (); + my $refdata = (); + foreach my $f (keys(%{$data})){ + if ($f =~ /^ident_/){ + my ($t,$c) = $f =~ m/ident_(.+)\_(.+)/; + + $fields->{$t}->{cond}->{$c} = $data->{$f}; + push(@refcols,"'".$c.'_'.$t."'"); + $refdata->{$c.'_'.$t} = $data->{$f}; + } + } + +# my $ref = $self->dbquerysorted("select TABLE_NAME,COLUMN_NAME from information_schema.KEY_COLUMN_USAGE where COLUMN_NAME in (".join(",",@refcols).") and CONSTRAINT_SCHEMA='".$self->{dbname}."';"); +# foreach my $r (keys(%{$ref})){ +# my $refv = $refdata->{$ref->{$r}->{COLUMN_NAME}}; +# if ($refv eq ''){ +# $refv = ' is null'; +# } else { +# $refv =~ s/'/''/g; +# $refv = "='".$refv."'"; +# } +# push(@ddl,"DELETE from ".$ref->{$r}->{TABLE_NAME}." where ".$ref->{$r}->{COLUMN_NAME}.$refv.";"); +# } + foreach my $tb (keys(%{$fields})){ + my @sqlcond = (); + foreach my $c (keys(%{$fields->{$tb}->{cond}})){ + my $v = $fields->{$tb}->{cond}->{$c}; + $v =~ s/'/''/g; + push (@sqlcond,$c."='".$v."'"); + } + push(@ddl,"DELETE FROM public.".$tb." WHERE ".join(" AND ",@sqlcond).";"); + } + return @ddl; +} + +sub textunidecode(){ + my $self = shift; + my $text = shift; + $text = lc(unidecode(decode("utf-8",$text))); + $text =~ s/^[a-z0-9]//g; + return $text; +} + +1; diff --git a/backoffice/api/lib/dkssavefile.pm b/backoffice/api/lib/dkssavefile.pm new file mode 100644 index 00000000..55c260f2 --- /dev/null +++ b/backoffice/api/lib/dkssavefile.pm @@ -0,0 +1,49 @@ +package dkssavefile; + + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use MIME::Base64; +use MIME::Types; +use URI; +use Data::Dumper; +use File::Path qw(make_path); + +sub new { + my $class = shift; + my $self = bless {}, $class; + return $self; +} + +sub saveb64toFile(){ + my $self = shift; + # my $fd = shift; + my $filename = shift; + my $sitepath = shift; + my $filepath = shift; + my $data = shift; + my $ds = URI->new($data); + my $mimetype= $ds->media_type(); + my $mt = MIME::Types->new(); + my $sfx = $mt->type($mimetype); + my $ext = $sfx->{MT_extensions}; + my $nfsfx = ""; + if (scalar(@$ext) > 0){ + $nfsfx = @$ext[0]; + } + if (! -d $sitepath.'/'.$filepath){ + make_path($sitepath.'/'.$filepath); + } + open (NF,">".$sitepath.'/'.$filepath.'/'.$filename.'.'.$nfsfx); + binmode(1); + print NF $ds->data(); + close(NF); + if (-e $sitepath.'/'.$filepath.'/'.$filename.'.'.$nfsfx){ + return $filepath.'/'.$filename.'.'.$nfsfx; + } + return ""; +} + +1; \ No newline at end of file diff --git a/backoffice/api/lib/sendemail.pm b/backoffice/api/lib/sendemail.pm new file mode 100644 index 00000000..6c2c6d0b --- /dev/null +++ b/backoffice/api/lib/sendemail.pm @@ -0,0 +1,130 @@ +package sendemail; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use Data::Dumper; +use File::Basename qw/dirname basename/; +use dksdb; + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{server} = "mail.your-server.de"; + $self->{port} = "587"; + $self->{user} = 'webmaster@solana-architecture.lu'; + $self->{password} = "FLxCtIQs720K8n79"; + $self->{from} = 'webmaster@solana-architecture.lu'; + return $self; +} + +sub sendemail(){ + my $self = shift; + my $template = shift; + my $iduser = shift; + my $sendto = shift; + my $data = shift; + my $attach = shift; + my $body = ""; + my $subject = ""; + my $maildata = (); + my $db = dksdb->new(); + my $send = -1; + my $tmpl = $db->dbquerysorted("select *,ml.mailtemplate from mailtemplates mt join maillayouts ml on (mt.id_maillayout=ml.id) where templatename='".$template."';"); + if (keys(%{$tmpl}) > 0){ + $tmpl = $tmpl->{0}; + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG $ENV{SCRIPT_FILENAME}; + # print LOG "SEND EMAIL:".Dumper($data)."\n"; + # close(LOG); + my $datasql = $tmpl->{'emaildatasql'}; + $data->{id} = $iduser; + foreach my $key (keys(%{$data})){ + my $srch = '%%'.lc($key).'%%'; + my $repl = $data->{$key}; + $datasql =~ s/$srch/$repl/g; + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG "TEMPLATE DATA:".$datasql."\n"; + # close(LOG); + $maildata = $db->dbquerysorted($datasql); + + $body = $tmpl->{'emailtext'}; + $subject = $tmpl->{'mailsubject'}; + foreach my $key (keys(%{$maildata->{0}})){ + $data->{$key} = $maildata->{0}->{$key}; + } + foreach my $key (keys(%{$data})){ + my $srch = '%%'.lc($key).'%%'; + my $repl = $data->{$key}; + $body =~ s/$srch/$repl/g; + $subject =~ s/$srch/$repl/g; + } + my $bodytmpl = $tmpl->{mailtemplate}; + $bodytmpl =~ s/%%BODYCONTENT%%/$body/; + my $siteurl = $ENV{'REQUEST_SCHEME'}.'://'.$ENV{"HTTP_HOST"}; + $bodytmpl =~ s/%%siteurl%%/$siteurl/g; + $bodytmpl =~ s/%%SITEURL%%/$siteurl/g; + $bodytmpl =~ s/\r//g; + #$bodytmpl =~ s/"/\\\"/g; + #PROD REPLACE all not replaced DATA + #$bodytmpl =~ s/%%\w+%%//g; + #$sendto = 'ksaffran@dks.lu'; + # open (LOG,">>tmp/sendmail.log"); + # print LOG "SUBJECT:".$subject."\n"; + # print LOG "BODY TEXT:".$bodytmpl."\n"; + # close(LOG); + if (($bodytmpl ne "") && ($subject ne "") && ($sendto =~ /.+\@.+\..+/)){ + + + my $binsemail = dirname($ENV{'SCRIPT_FILENAME'}).'/sendEmail'; + my $f = dirname($ENV{SCRIPT_FILENAME}).'/tmp/mailbody_'.$sendto.'.txt'; + $f =~ s/\@/_/g; + if (! -e $binsemail){ + $binsemail = dirname($ENV{'SCRIPT_FILENAME'}).'/api/sendEmail'; + $f = dirname($ENV{SCRIPT_FILENAME}).'/api/tmp/mailbody_'.$sendto.'.txt'; + $f =~ s/\@/_/g; + if (! -e $binsemail){ + return 256; + } + } + + my $cmd= 'perl "'.$binsemail.'" -f '.$tmpl->{mailfrom}.' '; + $cmd .= ' -s "'.$self->{server}.':'.$self->{port}.'" -xu "'.$self->{user}.'" -xp "'.$self->{password}.'" -q '; + $cmd .= '-o tls=auto '; + $cmd .= '-o message-content-type=html '; + $cmd .= '-o message-charset=ISO-8859-1 '; + $cmd .= '-o message-file='.$f.' '; + $cmd .= '-t "'.$sendto.'" '; + $cmd .= '-u "'.$subject.'" '; + # open (LOG,">>sendmail.log"); + # print LOG $cmd."\n"; + # # print LOG "BODY TEXT:".$bodytmpl."\n"; + # close(LOG); + open(EML,">".$f); + print EML $bodytmpl; + close(EML); + # $cmd .= '-m "'.$bodytmpl.'" '; + if ($attach != undef){ + $cmd .= " -a"; + + foreach my $a (@{$attach}){ + $cmd .= " ".$a." "; + } + } + # open (LOG,">>tmp/sendmail.log"); + # print LOG "SEND EMAIL CMD:".$cmd."\n"; + # close(LOG); + # $cmd =~ s/'/''/g; + $send = system($cmd); + # open (LOG,">>tmp/sendmail.log"); + # print LOG "CMD RETURN NUM:".$send."\n"; + # close(LOG); + unlink($f); + } + return $send; +} + +1; \ No newline at end of file diff --git a/backoffice/api/lib/session.pm b/backoffice/api/lib/session.pm new file mode 100644 index 00000000..3b64d8da --- /dev/null +++ b/backoffice/api/lib/session.pm @@ -0,0 +1,241 @@ +package session; + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use lib ('./'); +use File::Basename; +use Digest::SHA qw(sha256_hex); + +use dksdb; +use sendemail; +# use Data::Dumper; + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{db} = dksdb->new(); + return $self; +} + +sub checklogin(){ + my $self = shift; + my $login = shift; + my $password = shift; + # open FILE,">>tmp/sql.log"; + # print FILE "pwd: $password\n"; + # close(FILE); + my $pwd = sha256_hex($password); + my $ret->{messagetype} ='w3-red'; + # my $newsid = undef; + $login = lc($login); + $login =~ s/^\s+//; + $login =~ s/\s+$//; + + $ret->{message} = "Mot de passe ou Login pas inconnue!"; + $ret->{messagetype} = "w3-red"; + $ret->{sid} = undef; + my $user = $self->{db}->dbquerysorted("select id from users where lower(username)=lower('".$self->{db}->securetext($login)."') and userpassword = '".$pwd."' and \"blocked\" is null;"); + # open FILE,">>tmp/sql.log"; + # print FILE "select id from users where username= '".$self->{db}->securetext($login)."' and userpassword = '".$pwd."' and \"blocked\" is null;\n"; + # close FILE; + if (keys(%{$user}) > 0){ + $ret->{sid} = $self->randomstring(40); + $self->{db}->dbexec("DELETE FROM sessions where id_user=".$user->{0}->{id}." and remote_addr='".$ENV{REMOTE_ADDR}."' and user_agent='".$ENV{HTTP_USER_AGENT}."';"); + my $r = $self->{db}->dbexec("INSERT INTO sessions (id_user,idsession,remote_addr,user_agent) VALUES (".$user->{0}->{id}.", '".$ret->{sid}."', '".$ENV{REMOTE_ADDR}."', '".$ENV{HTTP_USER_AGENT}."');"); + } + return $ret; +} + +sub savepassword(){ + my $self = shift; + my $iduser = shift; + my $newpwd = shift; + my $pwd = sha256_hex($newpwd); + $self->{db}->dbexec("UPDATE users SET userpassword = '".$pwd."' WHERE id=".$iduser.";"); + return 1; +} + +sub passwordforgotten(){ + my $self = shift; + my $email = shift; + my $ret->{messagetype} ='w3-red'; + $ret->{message} = "Onbekannt E-mail!"; + my $sql = "select id,userpassword from users where username='".$self->{db}->securetext($email)."';"; + my $ex = $self->{db}->dbquerysorted($sql); + if (keys(%{$ex}) > 0){ + my $newpwd = $self->randomstring(12); + my $pwd = sha256_hex($newpwd); + $self->{db}->dbexec("UPDATE users SET userpassword = '".$pwd."' WHERE id=".$ex->{0}->{id}.";"); + my $data->{newpassword} = $newpwd; + my $eml = sendemail->new(); + my $mret = $eml->sendemail('user_forgotpasswd',$ex->{0}->{id},$email,$data,undef); + if ($mret != 0){ + $ret->{messagetype} ='w3-red'; + $ret->{message} = "Den Moment ass et leider nët méglech d'Passwuert autmatesch zreckzesetzen,
wend dech w.e.g. via E-Mail un webmaster\@fld.lu!"; + return $ret; + } + $ret->{message} = "Mir hun dir eng E-Mail, matt engem neien Passwuert gescheckt!"; + $ret->{messagetype} = "w3-green"; + } + return $ret; +} + +sub registeruser(){ + my $self = shift; + my $data = shift; + my $ret->{messagetype} ='w3-red'; + $ret->{message} = "Une erreur c'est produite, essayer plus tard!"; + $ret->{page} = "message.tt"; + my @reqfields = ("companies_company","terms","users_email","members_phone","members_surname","members_prename","members_job"); + my $reqf = 1; + foreach my $rf (@reqfields){ + if (!exists($data->{$rf})){ + $reqf = 0; + } + } + if ($reqf == 0){ + $ret->{message} = "Rempissez tous les champs s.v.p.!"; + $ret->{page} = "register.tt"; + return $ret; + } + foreach my $d (%{$data}){ + $data->{$d} = $self->{db}->securetext($data->{$d}); + } + + my $user = $self->{db}->dbquerysorted("select id from users where username='".$data->{users_email}."';"); + if (keys(%{$user}) > 0){ + $ret->{page} = "register.tt"; + $ret->{message} = "Ily existe déjà un utilisateur avec la mème adresse e-mail!"; + return $ret; + } + + my $newcode = $self->randomstring(6); + + my $newuserid = $self->{db}->dbquerysorted("INSERT INTO users (username,vcode) VALUES ('".$data->{users_email}."','".$newcode."') returning id;"); + $self->{db}->dbexec("INSERT INTO useringroups (id_user,id_group) VALUES ('".$newuserid->{0}->{id}."',(select id from usergroups where isdefault=true));"); + my $company = $self->{db}->dbquerysorted("select id from companies where link=unaccent_string('".$data->{companies_company}."');"); + if (keys(%{$company}) == 0 ){ + $company = $self->{db}->dbquerysorted("INSERT INTO companies (company,link) VALUES ('".$data->{companies_company}."',unaccent_string('".$data->{companies_company}."')) returning id;"); + $self->{db}->dbexec("INSERT INTO useringroups (id_user,id_group) VALUES ('".$newuserid->{0}->{id}."',(select id from usergroups where usergroup='company'));"); + } + $self->{db}->dbexec("INSERT INTO members (surname, prename, phone, id_user, id_company, job) VALUES('".$data->{members_surname}."', '".$data->{members_prename}."', '".$data->{members_phone}."', ".$newuserid->{0}->{id}.", ".$company->{0}->{id}.", '".$data->{members_job}."');"); + my $maildata->{vcode} = $newcode; + my $eml = sendemail->new(); + my $mret = $eml->sendemail('user_verification',$newuserid->{0}->{id},$data->{users_email},$maildata,undef); + if ($mret == 0){ + $ret->{message} = "Merci,
nous vous avons envoyé un email,avec un code de vérification!
Entrez ce code ci dessous, pour valider votre compte!
en cas de problèmes envoyer un email à info\@solana-architecture.lu"; + $ret->{messagetype} = "w3-green"; + $ret->{page} = "validationcode.tt"; + } else { + $self->{db}->dbexec("UPDATE users set username='".$data->{users_email}."',vcode=null where id=".$newuserid->{0}->{id}." ;"); + $ret->{message} = "nous ne pouvons pas envoyer un email à '".$data->{users_email}."' ! Si cette email n'existe pas, régisterez-vous avec un email existant!
en cas de problèemes envoyer un email à info\@solana-architecture.lu"; + $ret->{messagetype} = "w3-red"; + $ret->{page} = "register.tt"; + } + #$self->{db}->dbexec("insert into appaccess (id_user) values (".$newuserid->{0}->{id}.");"); + # $ret->{messagetype} = "w3-green"; + + return $ret; +} + +sub validateaccount(){ + my $self = shift; + my $data = shift; + foreach my $d (%{$data}){ + $data->{$d} = $self->{db}->securetext($data->{$d}); + } + + my $ret->{messagetype} ='w3-red'; + my $vcodedata = $self->{db}->dbquerysorted("select id,vcode,username from users where vcode='".$data->{vcode}."';"); + if (keys(%{$vcodedata}) == 0){ + $ret->{message} = "code inconnue!"; + $ret->{page} = "validationcode.tt"; + } + my $newpwd = $self->randomstring(12); + my $pwd = sha256_hex($newpwd); + my $maildata->{password} = $newpwd; + my $eml = sendemail->new(); + my $newuserid = $self->{db}->dbquerysorted("UPDATE users set userpassword='".$pwd."',vcode=null,regcode=null where id=".$vcodedata->{0}->{id}." returning id,username;"); + my $mret = $eml->sendemail('user_registration',$vcodedata->{0}->{id},$vcodedata->{0}->{username},$maildata,undef); + if ($mret == 0){ + $ret->{message} = "Merci,
Nous vous avons envoyé un email avec les données nécessaires pour se connecter!"; + $ret->{messagetype} = "w3-green"; + $ret->{page} = "message.tt"; + } else { + $ret->{message} = "NOus n'avons pas pu vous envoyé un email à '".$newuserid->{0}->{username}."'! Si l'addresse email n'existe pas, essayer avec un email existant!"; + $ret->{page} = "message.tt"; + } + return $ret; +} + +sub getsession($){ + my $self = shift; + my $sid = shift; + my $sql ="select se.idsession,us.id,us.username,string_agg(distinct(aug.usergroup),',') as usergroups from sessions se +join users us on (us.id=se.id_user) +left join useringroups uig on (us.id=uig.id_user) +left join usergroups aug on (aug.id=uig.id_group) +where se.idsession= '".$self->{db}->securetext($sid)."' +and se.remote_addr= '".$ENV{REMOTE_ADDR}."' +and se.user_agent='".$ENV{HTTP_USER_AGENT}."' and us.blocked is null group by se.id,us.id;"; + my $res= $self->{db}->dbquerysorted($sql); + my $ret = undef; + if (keys(%{$res}) > 0){ + return $res->{0}; + } + return $ret; +} + +sub deletesession(){ + my $self = shift; + my $sid = shift; + $self->{db}->dbexec("DELETE FROM sessions where idsession='".$self->{db}->securetext($sid)."';"); +} + +sub randomstring(){ + my $self = shift; + my $num = shift; + my @alphanumeric = ('a'..'z', 'A'..'Z', 0..9); + my $randstring = join '', map $alphanumeric[rand @alphanumeric], 0..$num; + return $randstring; +} + + +# sub deleteprofile(){ +# my $self = shift; +# my $data = shift; +# my $ret->{message} = "mot de passe ou profile inconnue!"; +# $ret->{messagetype} = "danger"; +# if ($data->{id_user} eq ''){ +# $ret->{sid} = undef; +# return $ret; +# } +# my $pwd = sha256_hex($data->{password}); +# my $user = $self->{db}->dbquerysorted("select id from users where id= '".$data->{id_user}."' and userpassword = '".$pwd."';"); +# if (keys(%{$user}) > 0){ +# $self->admindeleteuser($data->{id_user}); +# my $ret->{'message'} = "Votre profile a été supprimé!"; +# $ret->{'messagetype'} = "info"; +# $ret->{sid} = undef; +# } +# return $ret; + +# } + +# sub admindeleteuser(){ +# my $self = shift; +# my $id_user = shift; +# my @dl = ("DELETE FROM public.useringroups WHERE id_uset=".$id_user.";", +# "DELETE FROM public.userclients WHERE id_user=".$id_user.";", +# "DELETE FROM public.appaccess WHERE id_user=".$id_user.";", +# "DELETE FROM public.modulepreferences WHERE id_user=".$id_user.";",, +# "DELETE FROM public.sessions WHERE id_user=".$id_user.";", +# "delete from users where id=".$id_user.";"); +# foreach my $s (@dl){ +# $self->{db}->dbexec($s); +# } +# return 1; +# } + +1; \ No newline at end of file diff --git a/backoffice/api/sendEmail b/backoffice/api/sendEmail new file mode 100644 index 00000000..c639439c --- /dev/null +++ b/backoffice/api/sendEmail @@ -0,0 +1,2235 @@ +#!/usr/bin/perl -w +############################################################################## +## sendEmail +## Written by: Brandon Zehm +## +## License: +## sendEmail (hereafter referred to as "program") is free software; +## you can redistribute it and/or modify it under the terms of the GNU General +## Public License as published by the Free Software Foundation; either version +## 2 of the License, or (at your option) any later version. +## When redistributing modified versions of this source code it is recommended +## that that this disclaimer and the above coder's names are included in the +## modified code. +## +## Disclaimer: +## This program is provided with no warranty of any kind, either expressed or +## implied. It is the responsibility of the user (you) to fully research and +## comprehend the usage of this program. As with any tool, it can be misused, +## either intentionally (you're a vandal) or unintentionally (you're a moron). +## THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM +## or anything that happens because of your use (or misuse) of this program, +## including but not limited to anything you, your lawyers, or anyone else +## can dream up. And now, a relevant quote directly from the GPL: +## +## NO WARRANTY +## +## 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +## FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +## OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +## PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +## OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +## TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +## PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +## REPAIR OR CORRECTION. +## +############################################################################## +use strict; +use IO::Socket; + + +######################## +## Global Variables ## +######################## + +my %conf = ( + ## General + "programName" => $0, ## The name of this program + "version" => '1.56', ## The version of this program + "authorName" => 'Brandon Zehm', ## Author's Name + "authorEmail" => 'caspian@dotconf.net', ## Author's Email Address + "timezone" => '+0000', ## We always use +0000 for the time zone + "hostname" => 'changeme', ## Used in printmsg() for all output (is updated later in the script). + "debug" => 0, ## Default debug level + "error" => '', ## Error messages will often be stored here + + ## Logging + "stdout" => 1, + "logging" => 0, ## If this is true the printmsg function prints to the log file + "logFile" => '', ## If this is specified (form the command line via -l) this file will be used for logging. + + ## Network + "server" => 'localhost', ## Default SMTP server + "port" => 25, ## Default port + "bindaddr" => '', ## Default local bind address + "alarm" => '', ## Default timeout for connects and reads, this gets set from $opt{'timeout'} + "tls_client" => 0, ## If TLS is supported by the client (us) + "tls_server" => 0, ## If TLS is supported by the remote SMTP server + + ## Email + "delimiter" => "----MIME delimiter for sendEmail-" ## MIME Delimiter + . rand(1000000), ## Add some randomness to the delimiter + "Message-ID" => rand(1000000) . "-sendEmail", ## Message-ID for email header + +); + + +## This hash stores the options passed on the command line via the -o option. +my %opt = ( + ## Addressing + "reply-to" => '', ## Reply-To field + + ## Message + "message-file" => '', ## File to read message body from + "message-header" => '', ## Additional email header line(s) + "message-format" => 'normal', ## If "raw" is specified the message is sent unmodified + "message-charset" => 'iso-8859-1', ## Message character-set + "message-content-type" => 'auto', ## auto, text, html or an actual string to put into the content-type header. + + ## Network + "timeout" => 60, ## Default timeout for connects and reads, this is copied to $conf{'alarm'} later. + "fqdn" => 'changeme', ## FQDN of this machine, used during SMTP communication (is updated later in the script). + + ## eSMTP + "username" => '', ## Username used in SMTP Auth + "password" => '', ## Password used in SMTP Auth + "tls" => 'auto', ## Enable or disable TLS support. Options: auto, yes, no + +); + +## More variables used later in the program +my $SERVER; +my $CRLF = "\015\012"; +my $subject = ''; +my $header = ''; +my $message = ''; +my $from = ''; +my @to = (); +my @cc = (); +my @bcc = (); +my @attachments = (); +my @attachments_names = (); + +## For printing colors to the console +my ${colorRed} = "\033[31;1m"; +my ${colorGreen} = "\033[32;1m"; +my ${colorCyan} = "\033[36;1m"; +my ${colorWhite} = "\033[37;1m"; +my ${colorNormal} = "\033[m"; +my ${colorBold} = "\033[1m"; +my ${colorNoBold} = "\033[0m"; + +## Don't use shell escape codes on Windows systems +if ($^O =~ /win/i) { + ${colorRed} = ${colorGreen} = ${colorCyan} = ${colorWhite} = ${colorNormal} = ${colorBold} = ${colorNoBold} = ""; +} + +## Load IO::Socket::SSL if it's available +eval { require IO::Socket::SSL; }; +if ($@) { $conf{'tls_client'} = 0; } +else { $conf{'tls_client'} = 1; } + + + + + + +############################# +## ## +## FUNCTIONS ## +## ## +############################# + + + + + +############################################################################################### +## Function: initialize () +## +## Does all the script startup jibberish. +## +############################################################################################### +sub initialize { + + ## Set STDOUT to flush immediatly after each print + $| = 1; + + ## Intercept signals + $SIG{'QUIT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + $SIG{'INT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + $SIG{'KILL'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + $SIG{'TERM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + + ## ALARM and HUP signals are not supported in Win32 + unless ($^O =~ /win/i) { + $SIG{'HUP'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + $SIG{'ALRM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; + } + + ## Fixup $conf{'programName'} + $conf{'programName'} =~ s/(.)*[\/,\\]//; + $0 = $conf{'programName'} . " " . join(" ", @ARGV); + + ## Fixup $conf{'hostname'} and $opt{'fqdn'} + if ($opt{'fqdn'} eq 'changeme') { $opt{'fqdn'} = get_hostname(1); } + if ($conf{'hostname'} eq 'changeme') { $conf{'hostname'} = $opt{'fqdn'}; $conf{'hostname'} =~ s/\..*//; } + + return(1); +} + + + + + + + + + + + + + + + +############################################################################################### +## Function: processCommandLine () +## +## Processes command line storing important data in global vars (usually %conf) +## +############################################################################################### +sub processCommandLine { + + + ############################ + ## Process command line ## + ############################ + + my @ARGS = @ARGV; ## This is so later we can re-parse the command line args later if we need to + my $numargv = @ARGS; + help() unless ($numargv); + my $counter = 0; + + for ($counter = 0; $counter < $numargv; $counter++) { + + if ($ARGS[$counter] =~ /^-h$/i) { ## Help ## + help(); + } + + elsif ($ARGS[$counter] eq "") { ## Ignore null arguments + ## Do nothing + } + + elsif ($ARGS[$counter] =~ /^--help/) { ## Topical Help ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + helpTopic($ARGS[$counter]); + } + else { + help(); + } + } + + elsif ($ARGS[$counter] =~ /^-o$/i) { ## Options specified with -o ## + $counter++; + ## Loop through each option passed after the -o + while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + + if ($ARGS[$counter] !~ /(\S+)=(\S.*)/) { + printmsg("WARNING => Name/Value pair [$ARGS[$counter]] is not properly formatted", 0); + printmsg("WARNING => Arguments proceeding -o should be in the form of \"name=value\"", 0); + } + else { + if (exists($opt{$1})) { + if ($1 eq 'message-header') { + $opt{$1} .= $2 . $CRLF; + } + else { + $opt{$1} = $2; + } + printmsg("DEBUG => Assigned \$opt{} key/value: $1 => $2", 3); + } + else { + printmsg("WARNING => Name/Value pair [$ARGS[$counter]] will be ignored: unknown key [$1]", 0); + printmsg("HINT => Try the --help option to find valid command line arguments", 1); + } + } + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-f$/) { ## From ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $from = $ARGS[$counter]; } + else { printmsg("WARNING => The argument after -f was not an email address!", 0); $counter--; } + } + + elsif ($ARGS[$counter] =~ /^-t$/) { ## To ## + $counter++; + while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { + if ($ARGS[$counter] =~ /[;,]/) { + push (@to, split(/[;,]/, $ARGS[$counter])); + } + else { + push (@to,$ARGS[$counter]); + } + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-cc$/) { ## Cc ## + $counter++; + while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { + if ($ARGS[$counter] =~ /[;,]/) { + push (@cc, split(/[;,]/, $ARGS[$counter])); + } + else { + push (@cc,$ARGS[$counter]); + } + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-bcc$/) { ## Bcc ## + $counter++; + while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { + if ($ARGS[$counter] =~ /[;,]/) { + push (@bcc, split(/[;,]/, $ARGS[$counter])); + } + else { + push (@bcc,$ARGS[$counter]); + } + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-m$/) { ## Message ## + $counter++; + $message = ""; + while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + if ($message) { $message .= " "; } + $message .= $ARGS[$counter]; + $counter++; + } $counter--; + + ## Replace '\n' with $CRLF. + ## This allows newlines with messages sent on the command line + $message =~ s/\\n/$CRLF/g; + } + + elsif ($ARGS[$counter] =~ /^-u$/) { ## Subject ## + $counter++; + $subject = ""; + while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + if ($subject) { $subject .= " "; } + $subject .= $ARGS[$counter]; + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-s$/) { ## Server ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + $conf{'server'} = $ARGS[$counter]; + if ($conf{'server'} =~ /:/) { ## Port ## + ($conf{'server'},$conf{'port'}) = split(":",$conf{'server'}); + } + } + else { printmsg("WARNING - The argument after -s was not the server!", 0); $counter--; } + } + + elsif ($ARGS[$counter] =~ /^-b$/) { ## Bind Address ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + $conf{'bindaddr'} = $ARGS[$counter]; + } + else { printmsg("WARNING - The argument after -b was not the bindaddr!", 0); $counter--; } + } + + elsif ($ARGS[$counter] =~ /^-a$/) { ## Attachments ## + $counter++; + while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { + push (@attachments,$ARGS[$counter]); + $counter++; + } $counter--; + } + + elsif ($ARGS[$counter] =~ /^-xu$/) { ## AuthSMTP Username ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + $opt{'username'} = $ARGS[$counter]; + } + else { + printmsg("WARNING => The argument after -xu was not valid username!", 0); + $counter--; + } + } + + elsif ($ARGS[$counter] =~ /^-xp$/) { ## AuthSMTP Password ## + $counter++; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { + $opt{'password'} = $ARGS[$counter]; + } + else { + printmsg("WARNING => The argument after -xp was not valid password!", 0); + $counter--; + } + } + + elsif ($ARGS[$counter] =~ /^-l$/) { ## Logging ## + $counter++; + $conf{'logging'} = 1; + if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'logFile'} = $ARGS[$counter]; } + else { printmsg("WARNING - The argument after -l was not the log file!", 0); $counter--; } + } + + elsif ($ARGS[$counter] =~ s/^-v+//i) { ## Verbosity ## + my $tmp = (length($&) - 1); + $conf{'debug'} += $tmp; + } + + elsif ($ARGS[$counter] =~ /^-q$/) { ## Quiet ## + $conf{'stdout'} = 0; + } + + else { + printmsg("Error: \"$ARGS[$counter]\" is not a recognized option!", 0); + help(); + } + + } + + + + + + + + + ################################################### + ## Verify required variables are set correctly ## + ################################################### + + ## Make sure we have something in $conf{hostname} and $opt{fqdn} + if ($opt{'fqdn'} =~ /\./) { + $conf{'hostname'} = $opt{'fqdn'}; + $conf{'hostname'} =~ s/\..*//; + } + + if (!$conf{'server'}) { $conf{'server'} = 'localhost'; } + if (!$conf{'port'}) { $conf{'port'} = 25; } + if (!$from) { + quit("ERROR => You must specify a 'from' field! Try --help.", 1); + } + if ( ((scalar(@to)) + (scalar(@cc)) + (scalar(@bcc))) <= 0) { + quit("ERROR => You must specify at least one recipient via -t, -cc, or -bcc", 1); + } + + ## Make sure email addresses look OK. + foreach my $addr (@to, @cc, @bcc, $from, $opt{'reply-to'}) { + if ($addr) { + if (!returnAddressParts($addr)) { + printmsg("ERROR => Can't use improperly formatted email address: $addr", 0); + printmsg("HINT => Try viewing the extended help on addressing with \"--help addressing\"", 1); + quit("", 1); + } + } + } + + ## Make sure all attachments exist. + foreach my $file (@attachments) { + if ( (! -f $file) or (! -r $file) ) { + printmsg("ERROR => The attachment [$file] doesn't exist!", 0); + printmsg("HINT => Try specifying the full path to the file or reading extended help with \"--help message\"", 1); + quit("", 1); + } + } + + if ($conf{'logging'} and (!$conf{'logFile'})) { + quit("ERROR => You used -l to enable logging but didn't specify a log file!", 1); + } + + if ( $opt{'username'} ) { + if (!$opt{'password'}) { + ## Prompt for a password since one wasn't specified with the -xp option. + $SIG{'ALRM'} = sub { quit("ERROR => Timeout waiting for password inpupt", 1); }; + alarm(60) if ($^O !~ /win/i); ## alarm() doesn't work in win32 + print "Password: "; + $opt{'password'} = ; chomp $opt{'password'}; + if (!$opt{'password'}) { + quit("ERROR => A username for SMTP authentication was specified, but no password!", 1); + } + } + } + + ## Validate the TLS setting + $opt{'tls'} = lc($opt{'tls'}); + if ($opt{'tls'} !~ /^(auto|yes|no)$/) { + quit("ERROR => Invalid TLS setting ($opt{'tls'}). Must be one of auto, yes, or no.", 1); + } + + ## If TLS is set to "yes", make sure sendEmail loaded the libraries needed. + if ($opt{'tls'} eq 'yes' and $conf{'tls_client'} == 0) { + quit("ERROR => No TLS support! SendEmail can't load required libraries. (try installing Net::SSLeay and IO::Socket::SSL)", 1); + } + + ## Return 0 errors + return(0); +} + + + + + + + + + + + + + + + + +## getline($socketRef) +sub getline { + my ($socketRef) = @_; + local ($/) = "\r\n"; + return $$socketRef->getline; +} + + + + +## Receive a (multiline?) SMTP response from ($socketRef) +sub getResponse { + my ($socketRef) = @_; + my ($tmp, $reply); + local ($/) = "\r\n"; + return undef unless defined($tmp = getline($socketRef)); + return("getResponse() socket is not open") unless ($$socketRef->opened); + ## Keep reading lines if it's a multi-line response + while ($tmp =~ /^\d{3}-/o) { + $reply .= $tmp; + return undef unless defined($tmp = getline($socketRef)); + } + $reply .= $tmp; + $reply =~ s/\r?\n$//o; + return $reply; +} + + + + +############################################################################################### +## Function: SMTPchat ( [string $command] ) +## +## Description: Sends $command to the SMTP server (on SERVER) and awaits a successful +## reply form the server. If the server returns an error, or does not reply +## within $conf{'alarm'} seconds an error is generated. +## NOTE: $command is optional, if no command is specified then nothing will +## be sent to the server, but a valid response is still required from the server. +## +## Input: [$command] A (optional) valid SMTP command (ex. "HELO") +## +## +## Output: Returns zero on success, or non-zero on error. +## Error messages will be stored in $conf{'error'} +## A copy of the last SMTP response is stored in the global variable +## $conf{'SMTPchat_response'} +## +## +## Example: SMTPchat ("HELO mail.isp.net"); +############################################################################################### +sub SMTPchat { + my ($command) = @_; + + printmsg("INFO => Sending: \t$command", 1) if ($command); + + ## Send our command + print $SERVER "$command$CRLF" if ($command); + + ## Read a response from the server + $SIG{'ALRM'} = sub { $conf{'error'} = "alarm"; $SERVER->close(); }; + alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; + my $result = $conf{'SMTPchat_response'} = getResponse(\$SERVER); + alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; + + ## Generate an alert if we timed out + if ($conf{'error'} eq "alarm") { + $conf{'error'} = "ERROR => Timeout while reading from $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds."; + return(1); + } + + ## Make sure the server actually responded + if (!$result) { + $conf{'error'} = "ERROR => $conf{'server'}:$conf{'port'} returned a zero byte response to our query."; + return(2); + } + + ## Validate the response + if (evalSMTPresponse($result)) { + ## conf{'error'} will already be set here + return(2); + } + + ## Print the success messsage + printmsg($conf{'error'}, 1); + + ## Return Success + return(0); +} + + + + + + + + + + + + +############################################################################################### +## Function: evalSMTPresponse (string $message ) +## +## Description: Searches $message for either an SMTP success or error code, and returns +## 0 on success, and the actual error code on error. +## +## +## Input: $message Data received from a SMTP server (ex. "220 +## +## +## Output: Returns zero on success, or non-zero on error. +## Error messages will be stored in $conf{'error'} +## +## +## Example: SMTPchat ("HELO mail.isp.net"); +############################################################################################### +sub evalSMTPresponse { + my ($message) = @_; + + ## Validate input + if (!$message) { + $conf{'error'} = "ERROR => No message was passed to evalSMTPresponse(). What happened?"; + return(1) + } + + printmsg("DEBUG => evalSMTPresponse() - Checking for SMTP success or error status in the message: $message ", 3); + + ## Look for a SMTP success code + if ($message =~ /^([23]\d\d)/) { + printmsg("DEBUG => evalSMTPresponse() - Found SMTP success code: $1", 2); + $conf{'error'} = "SUCCESS => Received: \t$message"; + return(0); + } + + ## Look for a SMTP error code + if ($message =~ /^([45]\d\d)/) { + printmsg("DEBUG => evalSMTPresponse() - Found SMTP error code: $1", 2); + $conf{'error'} = "ERROR => Received: \t$message"; + return($1); + } + + ## If no SMTP codes were found return an error of 1 + $conf{'error'} = "ERROR => Received a message with no success or error code. The message received was: $message"; + return(2); + +} + + + + + + + + + + +######################################################### +# SUB: &return_month(0,1,etc) +# returns the name of the month that corrosponds +# with the number. returns 0 on error. +######################################################### +sub return_month { + my $x = $_[0]; + if ($x == 0) { return 'Jan'; } + if ($x == 1) { return 'Feb'; } + if ($x == 2) { return 'Mar'; } + if ($x == 3) { return 'Apr'; } + if ($x == 4) { return 'May'; } + if ($x == 5) { return 'Jun'; } + if ($x == 6) { return 'Jul'; } + if ($x == 7) { return 'Aug'; } + if ($x == 8) { return 'Sep'; } + if ($x == 9) { return 'Oct'; } + if ($x == 10) { return 'Nov'; } + if ($x == 11) { return 'Dec'; } + return (0); +} + + + + + + + + + + + + + + + + +######################################################### +# SUB: &return_day(0,1,etc) +# returns the name of the day that corrosponds +# with the number. returns 0 on error. +######################################################### +sub return_day { + my $x = $_[0]; + if ($x == 0) { return 'Sun'; } + if ($x == 1) { return 'Mon'; } + if ($x == 2) { return 'Tue'; } + if ($x == 3) { return 'Wed'; } + if ($x == 4) { return 'Thu'; } + if ($x == 5) { return 'Fri'; } + if ($x == 6) { return 'Sat'; } + return (0); +} + + + + + + + + + + + + + + + + +############################################################################################### +## Function: returnAddressParts(string $address) +## +## Description: Returns a two element array containing the "Name" and "Address" parts of +## an email address. +## +## Example: "Brandon Zehm " +## would return: ("Brandon Zehm", "caspian@dotconf.net"); +## +## "caspian@dotconf.net" +## would return: ("caspian@dotconf.net", "caspian@dotconf.net") +############################################################################################### +sub returnAddressParts { + my $input = $_[0]; + my $name = ""; + my $address = ""; + + ## Make sure to fail if it looks totally invalid + if ($input !~ /(\S+\@\S+)/) { + $conf{'error'} = "ERROR => The address [$input] doesn't look like a valid email address, ignoring it"; + return(undef()); + } + + ## Check 1, should find addresses like: "Brandon Zehm " + elsif ($input =~ /^\s*(\S(.*\S)?)\s*<(\S+\@\S+)>/o) { + ($name, $address) = ($1, $3); + } + + ## Otherwise if that failed, just get the address: + elsif ($input =~ /<(\S+\@\S+)>/o) { + $name = $address = $1; + } + + ## Or maybe it was formatted this way: caspian@dotconf.net + elsif ($input =~ /(\S+\@\S+)/o) { + $name = $address = $1; + } + + ## Something stupid happened, just return an error. + unless ($name and $address) { + printmsg("ERROR => Couldn't parse the address: $input", 0); + printmsg("HINT => If you think this should work, consider reporting this as a bug to $conf{'authorEmail'}", 1); + return(undef()); + } + + ## Make sure there aren't invalid characters in the address, and return it. + my $ctrl = '\000-\037'; + my $nonASCII = '\x80-\xff'; + if ($address =~ /[<> ,;:"'\[\]\\$ctrl$nonASCII]/) { + printmsg("WARNING => The address [$address] seems to contain invalid characters: continuing anyway", 0); + } + return($name, $address); +} + + + + + + + + + + + + + + + + +############################################################################################### +## Function: base64_encode(string $data, bool $chunk) +## +## Description: Returns $data as a base64 encoded string. +## If $chunk is true, the encoded data is returned in 76 character long lines +## with the final \CR\LF removed. +## +## Note: This is only used from the smtp auth section of code. +## At some point it would be nice to merge the code that encodes attachments and this. +############################################################################################### +sub base64_encode { + my $data = $_[0]; + my $chunk = $_[1]; + my $tmp = ''; + my $base64 = ''; + my $CRLF = "\r\n"; + + ################################### + ## Convert binary data to base64 ## + ################################### + while ($data =~ s/(.{45})//s) { ## Get 45 bytes from the binary string + $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text + chop($tmp); + $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 + $base64 .= $tmp; + } + + ########################## + ## Encode the leftovers ## + ########################## + my $padding = ""; + if ( ($data) and (length($data) > 0) ) { + $padding = (3 - length($data) % 3) % 3; ## Set flag if binary data isn't divisible by 3 + $tmp = substr(pack('u', $data), 1); ## Convert the binary to uuencoded text + chop($tmp); + $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 + $base64 .= $tmp; + } + + ############################ + ## Fix padding at the end ## + ############################ + $data = ''; + $base64 =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set + if ($chunk) { + while ($base64 =~ s/(.{1,76})//s) { ## Put $CRLF after each 76 characters + $data .= "$1$CRLF"; + } + } + else { + $data = $base64; + } + + ## Remove any trailing CRLF's + $data =~ s/(\r|\n)*$//s; + return($data); +} + + + + + + + + + +######################################################### +# SUB: send_attachment("/path/filename") +# Sends the mime headers and base64 encoded file +# to the email server. +######################################################### +sub send_attachment { + my ($filename) = @_; ## Get filename passed + my (@fields, $y, $filename_name, $encoding, ## Local variables + @attachlines, $content_type); + my $bin = 1; + + @fields = split(/\/|\\/, $filename); ## Get the actual filename without the path + $filename_name = pop(@fields); + push @attachments_names, $filename_name; ## FIXME: This is only used later for putting in the log file + + ########################## + ## Autodetect Mime Type ## + ########################## + + @fields = split(/\./, $filename_name); + $encoding = $fields[$#fields]; + + if ($encoding =~ /txt|text|log|conf|^c$|cpp|^h$|inc|m3u/i) { $content_type = 'text/plain'; } + elsif ($encoding =~ /html|htm|shtml|shtm|asp|php|cfm/i) { $content_type = 'text/html'; } + elsif ($encoding =~ /sh$/i) { $content_type = 'application/x-sh'; } + elsif ($encoding =~ /tcl/i) { $content_type = 'application/x-tcl'; } + elsif ($encoding =~ /pl$/i) { $content_type = 'application/x-perl'; } + elsif ($encoding =~ /js$/i) { $content_type = 'application/x-javascript'; } + elsif ($encoding =~ /man/i) { $content_type = 'application/x-troff-man'; } + elsif ($encoding =~ /gif/i) { $content_type = 'image/gif'; } + elsif ($encoding =~ /jpg|jpeg|jpe|jfif|pjpeg|pjp/i) { $content_type = 'image/jpeg'; } + elsif ($encoding =~ /tif|tiff/i) { $content_type = 'image/tiff'; } + elsif ($encoding =~ /xpm/i) { $content_type = 'image/x-xpixmap'; } + elsif ($encoding =~ /bmp/i) { $content_type = 'image/x-MS-bmp'; } + elsif ($encoding =~ /pcd/i) { $content_type = 'image/x-photo-cd'; } + elsif ($encoding =~ /png/i) { $content_type = 'image/png'; } + elsif ($encoding =~ /aif|aiff/i) { $content_type = 'audio/x-aiff'; } + elsif ($encoding =~ /wav/i) { $content_type = 'audio/x-wav'; } + elsif ($encoding =~ /mp2|mp3|mpa/i) { $content_type = 'audio/x-mpeg'; } + elsif ($encoding =~ /ra$|ram/i) { $content_type = 'audio/x-pn-realaudio'; } + elsif ($encoding =~ /mpeg|mpg/i) { $content_type = 'video/mpeg'; } + elsif ($encoding =~ /mov|qt$/i) { $content_type = 'video/quicktime'; } + elsif ($encoding =~ /avi/i) { $content_type = 'video/x-msvideo'; } + elsif ($encoding =~ /zip/i) { $content_type = 'application/x-zip-compressed'; } + elsif ($encoding =~ /tar/i) { $content_type = 'application/x-tar'; } + elsif ($encoding =~ /jar/i) { $content_type = 'application/java-archive'; } + elsif ($encoding =~ /exe|bin/i) { $content_type = 'application/octet-stream'; } + elsif ($encoding =~ /ppt|pot|ppa|pps|pwz/i) { $content_type = 'application/vnd.ms-powerpoint'; } + elsif ($encoding =~ /mdb|mda|mde/i) { $content_type = 'application/vnd.ms-access'; } + elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) { $content_type = 'application/vnd.ms-excel'; } + elsif ($encoding =~ /doc|dot/i) { $content_type = 'application/msword'; } + elsif ($encoding =~ /rtf/i) { $content_type = 'application/rtf'; } + elsif ($encoding =~ /pdf/i) { $content_type = 'application/pdf'; } + elsif ($encoding =~ /tex/i) { $content_type = 'application/x-tex'; } + elsif ($encoding =~ /latex/i) { $content_type = 'application/x-latex'; } + elsif ($encoding =~ /vcf/i) { $content_type = 'application/x-vcard'; } + else { $content_type = 'application/octet-stream'; } + + + ############################ + ## Process the attachment ## + ############################ + + ##################################### + ## Generate and print MIME headers ## + ##################################### + + $y = "$CRLF--$conf{'delimiter'}$CRLF"; + $y .= "Content-Type: $content_type;$CRLF"; + $y .= " name=\"$filename_name\"$CRLF"; + $y .= "Content-Transfer-Encoding: base64$CRLF"; + $y .= "Content-Disposition: attachment; filename=\"$filename_name\"$CRLF"; + $y .= "$CRLF"; + print $SERVER $y; + + + ########################################################### + ## Convert the file to base64 and print it to the server ## + ########################################################### + + open (FILETOATTACH, $filename) || do { + printmsg("ERROR => Opening the file [$filename] for attachment failed with the error: $!", 0); + return(1); + }; + binmode(FILETOATTACH); ## Hack to make Win32 work + + my $res = ""; + my $tmp = ""; + my $base64 = ""; + while () { ## Read a line from the (binary) file + $res .= $_; + + ################################### + ## Convert binary data to base64 ## + ################################### + while ($res =~ s/(.{45})//s) { ## Get 45 bytes from the binary string + $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text + chop($tmp); + $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 + $base64 .= $tmp; + } + + ################################ + ## Print chunks to the server ## + ################################ + while ($base64 =~ s/(.{76})//s) { + print $SERVER "$1$CRLF"; + } + + } + + ################################### + ## Encode and send the leftovers ## + ################################### + my $padding = ""; + if ( ($res) and (length($res) >= 1) ) { + $padding = (3 - length($res) % 3) % 3; ## Set flag if binary data isn't divisible by 3 + $res = substr(pack('u', $res), 1); ## Convert the binary to uuencoded text + chop($res); + $res =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 + } + + ############################ + ## Fix padding at the end ## + ############################ + $res = $base64 . $res; ## Get left overs from above + $res =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set + if ($res) { + while ($res =~ s/(.{1,76})//s) { ## Send it to the email server. + print $SERVER "$1$CRLF"; + } + } + + close (FILETOATTACH) || do { + printmsg("ERROR - Closing the filehandle for file [$filename] failed with the error: $!", 0); + return(2); + }; + + ## Return 0 errors + return(0); + +} + + + + + + + + + +############################################################################################### +## Function: $string = get_hostname (boot $fqdn) +## +## Description: Tries really hard to returns the short (or FQDN) hostname of the current +## system. Uses techniques and code from the Sys-Hostname module. +## +## Input: $fqdn A true value (1) will cause this function to return a FQDN hostname +## rather than a short hostname. +## +## Output: Returns a string +############################################################################################### +sub get_hostname { + ## Assign incoming parameters to variables + my ( $fqdn ) = @_; + my $hostname = ""; + + ## STEP 1: Get short hostname + + ## Load Sys::Hostname if it's available + eval { require Sys::Hostname; }; + unless ($@) { + $hostname = Sys::Hostname::hostname(); + } + + ## If that didn't get us a hostname, try a few other things + else { + ## Windows systems + if ($^O !~ /win/i) { + if ($ENV{'COMPUTERNAME'}) { $hostname = $ENV{'COMPUTERNAME'}; } + if (!$hostname) { $hostname = gethostbyname('localhost'); } + if (!$hostname) { chomp($hostname = `hostname 2> NUL`) }; + } + + ## Unix systems + else { + local $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; ## Paranoia + + ## Try the environment first (Help! What other variables could/should I be checking here?) + if ($ENV{'HOSTNAME'}) { $hostname = $ENV{'HOSTNAME'}; } + + ## Try the hostname command + eval { local $SIG{__DIE__}; local $SIG{CHLD}; $hostname = `hostname 2>/dev/null`; chomp($hostname); } || + + ## Try POSIX::uname(), which strictly can't be expected to be correct + eval { local $SIG{__DIE__}; require POSIX; $hostname = (POSIX::uname())[1]; } || + + ## Try the uname command + eval { local $SIG{__DIE__}; $hostname = `uname -n 2>/dev/null`; chomp($hostname); }; + + } + + ## If we can't find anything else, return "" + if (!$hostname) { + print "WARNING => No hostname could be determined, please specify one with -o fqdn=FQDN option!\n"; + return("unknown"); + } + } + + ## Return the short hostname + unless ($fqdn) { + $hostname =~ s/\..*//; + return(lc($hostname)); + } + + ## STEP 2: Determine the FQDN + + ## First, if we already have one return it. + if ($hostname =~ /\w\.\w/) { return(lc($hostname)); } + + ## Next try using + eval { $fqdn = (gethostbyname($hostname))[0]; }; + if ($fqdn) { return(lc($fqdn)); } + return(lc($hostname)); +} + + + + + + + + +############################################################################################### +## Function: printmsg (string $message, int $level) +## +## Description: Handles all messages - printing them to the screen only if the messages +## $level is >= the global debug level. If $conf{'logFile'} is defined it +## will also log the message to that file. +## +## Input: $message A message to be printed, logged, etc. +## $level The debug level of the message. If +## not defined 0 will be assumed. 0 is +## considered a normal message, 1 and +## higher is considered a debug message. +## +## Output: Prints to STDOUT +## +## Assumptions: $conf{'hostname'} should be the name of the computer we're running on. +## $conf{'stdout'} should be set to 1 if you want to print to stdout +## $conf{'logFile'} should be a full path to a log file if you want that +## $conf{'debug'} should be an integer between 0 and 10. +## +## Example: printmsg("WARNING: We believe in generic error messages... NOT!", 0); +############################################################################################### +sub printmsg { + ## Assign incoming parameters to variables + my ( $message, $level ) = @_; + + ## Make sure input is sane + $level = 0 if (!defined($level)); + $message =~ s/\s+$//sgo; + $message =~ s/\r?\n/, /sgo; + + ## Continue only if the debug level of the program is >= message debug level. + if ($conf{'debug'} >= $level) { + + ## Get the date in the format: Dec 3 11:14:04 + my ($sec, $min, $hour, $mday, $mon) = localtime(); + $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon]; + my $date = sprintf("%s %02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec); + + ## Print to STDOUT always if debugging is enabled, or if conf{stdout} is true. + if ( ($conf{'debug'} >= 1) or ($conf{'stdout'} == 1) ) { + print "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; + } + + ## Print to the log file if $conf{'logging'} is true + if ($conf{'logFile'}) { + if (openLogFile($conf{'logFile'})) { $conf{'logFile'} = ""; printmsg("ERROR => Opening the file [$conf{'logFile'}] for appending returned the error: $!", 1); } + print LOGFILE "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; + } + + } + + ## Return 0 errors + return(0); +} + + + + + + + + + + + + +############################################################################################### +## FUNCTION: +## openLogFile ( $filename ) +## +## +## DESCRIPTION: +## Opens the file $filename and attaches it to the filehandle "LOGFILE". Returns 0 on success +## and non-zero on failure. Error codes are listed below, and the error message gets set in +## global variable $!. +## +## +## Example: +## openFile ("/var/log/sendEmail.log"); +## +############################################################################################### +sub openLogFile { + ## Get the incoming filename + my $filename = $_[0]; + + ## Make sure our file exists, and if the file doesn't exist then create it + if ( ! -f $filename ) { + print STDERR "NOTICE: The log file [$filename] does not exist. Creating it now with mode [0600].\n" if ($conf{'stdout'}); + open (LOGFILE, ">>$filename"); + close LOGFILE; + chmod (0600, $filename); + } + + ## Now open the file and attach it to a filehandle + open (LOGFILE,">>$filename") or return (1); + + ## Put the file into non-buffering mode + select LOGFILE; + $| = 1; + select STDOUT; + + ## Return success + return(0); +} + + + + + + + + +############################################################################################### +## Function: read_file (string $filename) +## +## Description: Reads the contents of a file and returns a two part array: +## ($status, $file-contents) +## $status is 0 on success, non-zero on error. +## +## Example: ($status, $file) = read_file("/etc/passwd"); +############################################################################################### +sub read_file { + my ( $filename ) = @_; + + ## If the value specified is a file, load the file's contents + if ( (-e $filename and -r $filename) ) { + my $FILE; + if(!open($FILE, ' ' . $filename)) { + return((1, "")); + } + my $file = ''; + while (<$FILE>) { + $file .= $_; + } + ## Strip an ending \r\n + $file =~ s/\r?\n$//os; + } + return((1, "")); +} + + + + + + + + + +############################################################################################### +## Function: quit (string $message, int $errorLevel) +## +## Description: Exits the program, optionally printing $message. It +## returns an exit error level of $errorLevel to the +## system (0 means no errors, and is assumed if empty.) +## +## Example: quit("Exiting program normally", 0); +############################################################################################### +sub quit { + my ( $message, $errorLevel ) = @_; + $errorLevel = 0 if (!defined($errorLevel)); + + ## Print exit message + if ($message) { + printmsg($message, 0); + } + + ## Exit + exit($errorLevel); +} + + + + + + + + + + + + +############################################################################################### +## Function: help () +## +## Description: For all those newbies ;) +## Prints a help message and exits the program. +## +############################################################################################### +sub help { +exit(1) if (!$conf{'stdout'}); +print <${colorNoBold} + +Synopsis: $conf{'programName'} -f ADDRESS [options] + + ${colorRed}Required:${colorNormal} + -f ADDRESS from (sender) email address + * At least one recipient required via -t, -cc, or -bcc + * Message body required via -m, STDIN, or -o message-file=FILE + + ${colorGreen}Common:${colorNormal} + -t ADDRESS [ADDR ...] to email address(es) + -u SUBJECT message subject + -m MESSAGE message body + -s SERVER[:PORT] smtp mail relay, default is $conf{'server'}:$conf{'port'} + + ${colorGreen}Optional:${colorNormal} + -a FILE [FILE ...] file attachment(s) + -cc ADDRESS [ADDR ...] cc email address(es) + -bcc ADDRESS [ADDR ...] bcc email address(es) + -xu USERNAME username for SMTP authentication + -xp PASSWORD password for SMTP authentication + + ${colorGreen}Paranormal:${colorNormal} + -b BINDADDR[:PORT] local host bind address + -l LOGFILE log to the specified file + -v verbosity, use multiple times for greater effect + -q be quiet (i.e. no STDOUT output) + -o NAME=VALUE advanced options, for details try: --help misc + -o message-content-type= + -o message-file=FILE -o message-format=raw + -o message-header=HEADER -o message-charset=CHARSET + -o reply-to=ADDRESS -o timeout=SECONDS + -o username=USERNAME -o password=PASSWORD + -o tls= -o fqdn=FQDN + + + ${colorGreen}Help:${colorNormal} + --help the helpful overview you're reading now + --help addressing explain addressing and related options + --help message explain message body input and related options + --help networking explain -s, -b, etc + --help output explain logging and other output options + --help misc explain -o options, TLS, SMTP auth, and more + +EOM +exit(1); +} + + + + + + + + + +############################################################################################### +## Function: helpTopic ($topic) +## +## Description: For all those newbies ;) +## Prints a help message and exits the program. +## +############################################################################################### +sub helpTopic { + exit(1) if (!$conf{'stdout'}); + my ($topic) = @_; + + CASE: { + + + + +## ADDRESSING + ($topic eq 'addressing') && do { + print <" + Just Address: "john.doe\@gmail.com" + +The "Full Name" method is useful if you want a name, rather than a plain +email address, to be displayed in the recipient's From, To, or Cc fields +when they view the message. + + +${colorGreen}Multiple Recipients${colorNormal} +The -t, -cc, and -bcc options each accept multiple addresses. They may be +specified by separating them by either a white space, comma, or semi-colon +separated list. You may also specify the -t, -cc, and -bcc options multiple +times, each occurance will append the new recipients to the respective list. + +Examples: +(I used "-t" in these examples, but it can be "-cc" or "-bcc" as well) + + * Space separated list: + -t jane.doe\@yahoo.com "John Doe " + + * Semi-colon separated list: + -t "jane.doe\@yahoo.com; John Doe " + + * Comma separated list: + -t "jane.doe\@yahoo.com, John Doe " + + * Multiple -t, -cc, or -bcc options: + -t "jane.doe\@yahoo.com" -t "John Doe " + + +EOM + last CASE; + }; + + + + + + +## MESSAGE + ($topic eq 'message') && do { + print < + -o message-header=EMAIL HEADER + -o message-charset=CHARSET + -o message-format=raw + +-u SUBJECT + This option allows you to specify the subject for your email message. + It is not required (anymore) that the subject be quoted, although it + is recommended. The subject will be read until an argument starting + with a hyphen (-) is found. + Examples: + -u "Contact information while on vacation" + -u New Microsoft vulnerability discovered + +-m MESSAGE + This option is one of three methods that allow you to specify the message + body for your email. The message may be specified on the command line + with this -m option, read from a file with the -o message-file=FILE + option, or read from STDIN if neither of these options are present. + + It is not required (anymore) that the message be quoted, although it is + recommended. The message will be read until an argument starting with a + hyphen (-) is found. + Examples: + -m "See you in South Beach, Hawaii. -Todd" + -m Please ensure that you upgrade your systems right away + + Multi-line message bodies may be specified with the -m option by putting + a "\\n" into the message. Example: + -m "This is line 1.\\nAnd this is line 2." + + HTML messages are supported, simply begin your message with "" and + sendEmail will properly label the mime header so MUAs properly render + the message. It is currently not possible without "-o message-format=raw" + to send a message with both text and html parts with sendEmail. + +-o message-file=FILE + This option is one of three methods that allow you to specify the message + body for your email. To use this option simply specify a text file + containing the body of your email message. Examples: + -o message-file=/root/message.txt + -o message-file="C:\\Program Files\\output.txt" + +-o message-content-type= + This option allows you to specify the content-type of the email. If your + email message is an html message but is being displayed as a text message + just add "-o message-content-type=html" to the command line to force it + to display as an html message. This actually just changes the Content-Type: + header. Advanced users will be happy to know that if you specify anything + other than the three options listed above it will use that as the vaule + for the Content-Type header. + +-o message-header=EMAIL HEADER + This option allows you to specify additional email headers to be included. + To add more than one message header simply use this option on the command + line more than once. If you specify a message header that sendEmail would + normally generate the one you specified will be used in it's place. + Do not use this unless you know what you are doing! + Example: + To scare a Microsoft Outlook user you may want to try this: + -o message-header="X-Message-Flag: Message contains illegal content" + Example: + To request a read-receipt try this: + -o message-header="Disposition-Notification-To: " + Example: + To set the message priority try this: + -o message-header="X-Priority: 1" + Priority reference: 1=highest, 2=high, 3=normal, 4=low, 5=lowest + +-o message-charset=CHARSET + This option allows you to specify the character-set for the message body. + The default is iso-8859-1. + +-o message-format=raw + This option instructs sendEmail to assume the message (specified with -m, + read from STDIN, or read from the file specified in -o message-file=FILE) + is already a *complete* email message. SendEmail will not generate any + headers and will transmit the message as-is to the remote SMTP server. + Due to the nature of this option the following command line options will + be ignored when this one is used: + -u SUBJECT + -o message-header=EMAIL HEADER + -o message-charset=CHARSET + -a ATTACHMENT + + +${colorGreen}The Message Body${colorNormal} +The email message body may be specified in one of three ways: + 1) Via the -m MESSAGE command line option. + Example: + -m "This is the message body" + + 2) By putting the message body in a file and using the -o message-file=FILE + command line option. + Example: + -o message-file=/root/message.txt + + 3) By piping the message body to sendEmail when nither of the above command + line options were specified. + Example: + grep "ERROR" /var/log/messages | sendEmail -t you\@domain.com ... + +If the message body begins with "" then the message will be treated as +an HTML message and the MIME headers will be written so that a HTML capable +email client will display the message in it's HTML form. +Any of the above methods may be used with the -o message-format=raw option +to deliver an already complete email message. + + +EOM + last CASE; + }; + + + + + + +## MISC + ($topic eq 'misc') && do { + print < + -o timeout=SECONDS + -o fqdn=FQDN + +-a ATTACHMENT [ATTACHMENT ...] + This option allows you to attach any number of files to your email message. + To specify more than one attachment, simply separate each filename with a + space. Example: -a file1.txt file2.txt file3.txt + +-xu USERNAME + Alias for -o username=USERNAME + +-xp PASSWORD + Alias for -o password=PASSWORD + +-o username=USERNAME (synonym for -xu) + These options allow specification of a username to be used with SMTP + servers that require authentication. If a username is specified but a + password is not, you will be prompted to enter one at runtime. + +-o password=PASSWORD (synonym for -xp) + These options allow specification of a password to be used with SMTP + servers that require authentication. If a username is specified but a + password is not, you will be prompted to enter one at runtime. + +-o tls= + This option allows you to specify if TLS (SSL for SMTP) should be enabled + or disabled. The default, auto, will use TLS automatically if your perl + installation has the IO::Socket::SSL and Net::SSLeay modules available, + and if the remote SMTP server supports TLS. To require TLS for message + delivery set this to yes. To disable TLS support set this to no. A debug + level of one or higher will reveal details about the status of TLS. + +-o timeout=SECONDS + This option sets the timeout value in seconds used for all network reads, + writes, and a few other things. + +-o fqdn=FQDN + This option sets the Fully Qualified Domain Name used during the initial + SMTP greeting. Normally this is automatically detected, but in case you + need to manually set it for some reason or get a warning about detection + failing, you can use this to override the default. + + +EOM + last CASE; + }; + + + + + + +## NETWORKING + ($topic eq 'networking') && do { + print < + -o timeout=SECONDS + +-s SERVER[:PORT] + This option allows you to specify the SMTP server sendEmail should + connect to to deliver your email message to. If this option is not + specified sendEmail will try to connect to localhost:25 to deliver + the message. THIS IS MOST LIKELY NOT WHAT YOU WANT, AND WILL LIKELY + FAIL unless you have a email server (commonly known as an MTA) running + on your computer! + Typically you will need to specify your company or ISP's email server. + For example, if you use CableOne you will need to specify: + -s mail.cableone.net + If you have your own email server running on port 300 you would + probably use an option like this: + -s myserver.mydomain.com:300 + If you're a GMail user try: + -s smtp.gmail.com:587 -xu me\@gmail.com -xp PASSWD + +-b BINDADDR[:PORT] + This option allows you to specify the local IP address (and optional + tcp port number) for sendEmail to bind to when connecting to the remote + SMTP server. This useful for people who need to send an email from a + specific network interface or source address and are running sendEmail on + a firewall or other host with several network interfaces. + +-o tls= + This option allows you to specify if TLS (SSL for SMTP) should be enabled + or disabled. The default, auto, will use TLS automatically if your perl + installation has the IO::Socket::SSL and Net::SSLeay modules available, + and if the remote SMTP server supports TLS. To require TLS for message + delivery set this to yes. To disable TLS support set this to no. A debug + level of one or higher will reveal details about the status of TLS. + +-o timeout=SECONDS + This option sets the timeout value in seconds used for all network reads, + writes, and a few other things. + + +EOM + last CASE; + }; + + + + + + +## OUTPUT + ($topic eq 'output') && do { + print < The help topic specified is not valid!", 1); + }; + +exit(1); +} + + + + + + + + + + + + + + + + + + + + + + +############################# +## ## +## MAIN PROGRAM ## +## ## +############################# + + +## Initialize +initialize(); + +## Process Command Line +processCommandLine(); +$conf{'alarm'} = $opt{'timeout'}; + +## Abort program after $conf{'alarm'} seconds to avoid infinite hangs +alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 + + + + +################################################### +## Read $message from STDIN if -m was not used ## +################################################### + +if (!($message)) { + ## Read message body from a file specified with -o message-file= + if ($opt{'message-file'}) { + if (! -e $opt{'message-file'}) { + printmsg("ERROR => Message body file specified [$opt{'message-file'}] does not exist!", 0); + printmsg("HINT => 1) check spelling of your file; 2) fully qualify the path; 3) doubble quote it", 1); + quit("", 1); + } + if (! -r $opt{'message-file'}) { + printmsg("ERROR => Message body file specified can not be read due to restricted permissions!", 0); + printmsg("HINT => Check permissions on file specified to ensure it can be read", 1); + quit("", 1); + } + if (!open(MFILE, "< " . $opt{'message-file'})) { + printmsg("ERROR => Error opening message body file [$opt{'message-file'}]: $!", 0); + quit("", 1); + } + while () { + $message .= $_; + } + close(MFILE); + } + + ## Read message body from STDIN + else { + alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 + if ($conf{'stdout'}) { + print "Reading message body from STDIN because the '-m' option was not used.\n"; + print "If you are manually typing in a message:\n"; + print " - First line must be received within $conf{'alarm'} seconds.\n" if ($^O !~ /win/i); + print " - End manual input with a CTRL-D on its own line.\n\n" if ($^O !~ /win/i); + print " - End manual input with a CTRL-Z on its own line.\n\n" if ($^O =~ /win/i); + } + while () { ## Read STDIN into $message + $message .= $_; + alarm(0) if ($^O !~ /win/i); ## Disable the alarm since at least one line was received + } + printmsg("Message input complete.", 0); + } +} + +## Replace bare LF's with CRLF's (\012 should always have \015 with it) +$message =~ s/(\015)?(\012|$)/\015\012/g; + +## Replace bare CR's with CRLF's (\015 should always have \012 with it) +$message =~ s/(\015)(\012|$)?/\015\012/g; + +## Check message for bare periods and encode them +$message =~ s/(^|$CRLF)(\.{1})($CRLF|$)/$1.$2$3/g; + +## Get the current date for the email header +my ($sec,$min,$hour,$mday,$mon,$year,$day) = gmtime(); +$year += 1900; $mon = return_month($mon); $day = return_day($day); +my $date = sprintf("%s, %s %s %d %.2d:%.2d:%.2d %s",$day, $mday, $mon, $year, $hour, $min, $sec, $conf{'timezone'}); + + + + +################################## +## Connect to the SMTP server ## +################################## +printmsg("DEBUG => Connecting to $conf{'server'}:$conf{'port'}", 1); +$SIG{'ALRM'} = sub { + printmsg("ERROR => Timeout while connecting to $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.", 0); + printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); + quit("", 1); +}; +alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; +$SERVER = IO::Socket::INET->new( PeerAddr => $conf{'server'}, + PeerPort => $conf{'port'}, + LocalAddr => $conf{'bindaddr'}, + Proto => 'tcp', + Autoflush => 1, + timeout => $conf{'alarm'}, +); +alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; + +## Make sure we got connected +if ( (!$SERVER) or (!$SERVER->opened()) ) { + printmsg("ERROR => Connection attempt to $conf{'server'}:$conf{'port'} failed: $@", 0); + printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); + quit("", 1); +} + +## Save our IP address for later +$conf{'ip'} = $SERVER->sockhost(); +printmsg("DEBUG => My IP address is: $conf{'ip'}", 1); + + + + + + + +######################### +## Do the SMTP Dance ## +######################### + +## Read initial greeting to make sure we're talking to a live SMTP server +if (SMTPchat()) { quit($conf{'error'}, 1); } + +## We're about to use $opt{'fqdn'}, make sure it isn't empty +if (!$opt{'fqdn'}) { + ## Ok, that means we couldn't get a hostname, how about using the IP address for the HELO instead + $opt{'fqdn'} = "[" . $conf{'ip'} . "]"; +} + +## EHLO +if (SMTPchat('EHLO ' . $opt{'fqdn'})) { + printmsg($conf{'error'}, 0); + printmsg("NOTICE => EHLO command failed, attempting HELO instead"); + if (SMTPchat('HELO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); } + if ( $opt{'username'} and $opt{'password'} ) { + printmsg("WARNING => The mail server does not support SMTP authentication!", 0); + } +} +else { + + ## Determin if the server supports TLS + if ($conf{'SMTPchat_response'} =~ /STARTTLS/) { + $conf{'tls_server'} = 1; + printmsg("DEBUG => The remote SMTP server supports TLS :)", 2); + } + else { + $conf{'tls_server'} = 0; + printmsg("DEBUG => The remote SMTP server does NOT support TLS :(", 2); + } + + ## Start TLS if possible + if ($conf{'tls_server'} == 1 and $conf{'tls_client'} == 1 and $opt{'tls'} =~ /^(yes|auto)$/) { + printmsg("DEBUG => Starting TLS", 2); + if (SMTPchat('STARTTLS')) { quit($conf{'error'}, 1); } + if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv3:!SSLv2', , SSL_verify_mode => 0)) { + quit("ERROR => TLS setup failed: " . IO::Socket::SSL::errstr(), 1); + } + printmsg("DEBUG => TLS: Using cipher: ". $SERVER->get_cipher(), 3); + printmsg("DEBUG => TLS session initialized :)", 1); + + ## Restart our SMTP session + if (SMTPchat('EHLO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); } + } + elsif ($opt{'tls'} eq 'yes' and $conf{'tls_server'} == 0) { + quit("ERROR => TLS not possible! Remote SMTP server, $conf{'server'}, does not support it.", 1); + } + + + ## Do SMTP Auth if required + if ( $opt{'username'} and $opt{'password'} ) { + if ($conf{'SMTPchat_response'} !~ /AUTH\s/) { + printmsg("NOTICE => Authentication not supported by the remote SMTP server!", 0); + } + else { + my $auth_succeeded = 0; + my $mutual_method = 0; + + # ## SASL CRAM-MD5 authentication method + # if ($conf{'SMTPchat_response'} =~ /\bCRAM-MD5\b/i) { + # printmsg("DEBUG => SMTP-AUTH: Using CRAM-MD5 authentication method", 1); + # if (SMTPchat('AUTH CRAM-MD5')) { quit($conf{'error'}, 1); } + # + # ## FIXME!! + # + # printmsg("DEBUG => User authentication was successful", 1); + # } + + ## SASL LOGIN authentication method + if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bLOGIN\b/i) { + $mutual_method = 1; + printmsg("DEBUG => SMTP-AUTH: Using LOGIN authentication method", 1); + if (!SMTPchat('AUTH LOGIN')) { + if (!SMTPchat(base64_encode($opt{'username'}))) { + if (!SMTPchat(base64_encode($opt{'password'}))) { + $auth_succeeded = 1; + printmsg("DEBUG => User authentication was successful (Method: LOGIN)", 1); + } + } + } + if ($auth_succeeded == 0) { + printmsg("DEBUG => SMTP-AUTH: LOGIN authenticaion failed.", 1); + } + } + + ## SASL PLAIN authentication method + if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bPLAIN\b/i) { + $mutual_method = 1; + printmsg("DEBUG => SMTP-AUTH: Using PLAIN authentication method", 1); + if (SMTPchat('AUTH PLAIN ' . base64_encode("$opt{'username'}\0$opt{'username'}\0$opt{'password'}"))) { + printmsg("DEBUG => SMTP-AUTH: PLAIN authenticaion failed.", 1); + } + else { + $auth_succeeded = 1; + printmsg("DEBUG => User authentication was successful (Method: PLAIN)", 1); + } + } + + ## If none of the authentication methods supported by sendEmail were supported by the server, let the user know + if ($mutual_method == 0) { + printmsg("WARNING => SMTP-AUTH: No mutually supported authentication methods available", 0); + } + + ## If we didn't get authenticated, log an error message and exit + if ($auth_succeeded == 0) { + quit("ERROR => ERROR => SMTP-AUTH: Authentication to $conf{'server'}:$conf{'port'} failed.", 1); + } + } + } +} + +## MAIL FROM +if (SMTPchat('MAIL FROM:<' .(returnAddressParts($from))[1]. '>')) { quit($conf{'error'}, 1); } + +## RCPT TO +my $oneRcptAccepted = 0; +foreach my $rcpt (@to, @cc, @bcc) { + my ($name, $address) = returnAddressParts($rcpt); + if (SMTPchat('RCPT TO:<' . $address . '>')) { + printmsg("WARNING => The recipient <$address> was rejected by the mail server, error follows:", 0); + $conf{'error'} =~ s/^ERROR/WARNING/o; + printmsg($conf{'error'}, 0); + } + elsif ($oneRcptAccepted == 0) { + $oneRcptAccepted = 1; + } +} +## If no recipients were accepted we need to exit with an error. +if ($oneRcptAccepted == 0) { + quit("ERROR => Exiting. No recipients were accepted for delivery by the mail server.", 1); +} + +## DATA +if (SMTPchat('DATA')) { quit($conf{'error'}, 1); } + + +############################### +## Build and send the body ## +############################### +printmsg("INFO => Sending message body",1); + +## If the message-format is raw just send the message as-is. +if ($opt{'message-format'} =~ /^raw$/i) { + print $SERVER $message; +} + +## If the message-format isn't raw, then build and send the message, +else { + + ## Message-ID: + if ($opt{'message-header'} !~ /^Message-ID:/iom) { + $header .= 'Message-ID: <' . $conf{'Message-ID'} . '@' . $conf{'hostname'} . '>' . $CRLF; + } + + ## From: "Name" (the pointless test below is just to keep scoping correct) + if ($from and $opt{'message-header'} !~ /^From:/iom) { + my ($name, $address) = returnAddressParts($from); + $header .= 'From: "' . $name . '" <' . $address . '>' . $CRLF; + } + + ## Reply-To: + if ($opt{'reply-to'} and $opt{'message-header'} !~ /^Reply-To:/iom) { + my ($name, $address) = returnAddressParts($opt{'reply-to'}); + $header .= 'Reply-To: "' . $name . '" <' . $address . '>' . $CRLF; + } + + ## To: "Name" + if ($opt{'message-header'} =~ /^To:/iom) { + ## The user put the To: header in via -o message-header - dont do anything + } + elsif (scalar(@to) > 0) { + $header .= "To:"; + for (my $a = 0; $a < scalar(@to); $a++) { + my $msg = ""; + + my ($name, $address) = returnAddressParts($to[$a]); + $msg = " \"$name\" <$address>"; + + ## If we're not on the last address add a comma to the end of the line. + if (($a + 1) != scalar(@to)) { + $msg .= ","; + } + + $header .= $msg . $CRLF; + } + } + ## We always want a To: line so if the only recipients were bcc'd they don't see who it was sent to + else { + $header .= "To: \"Undisclosed Recipients\" <>$CRLF"; + } + + if (scalar(@cc) > 0 and $opt{'message-header'} !~ /^Cc:/iom) { + $header .= "Cc:"; + for (my $a = 0; $a < scalar(@cc); $a++) { + my $msg = ""; + + my ($name, $address) = returnAddressParts($cc[$a]); + $msg = " \"$name\" <$address>"; + + ## If we're not on the last address add a comma to the end of the line. + if (($a + 1) != scalar(@cc)) { + $msg .= ","; + } + + $header .= $msg . $CRLF; + } + } + + if ($opt{'message-header'} !~ /^Subject:/iom) { + $header .= 'Subject: ' . $subject . $CRLF; ## Subject + } + if ($opt{'message-header'} !~ /^Date:/iom) { + $header .= 'Date: ' . $date . $CRLF; ## Date + } + if ($opt{'message-header'} !~ /^X-Mailer:/iom) { + $header .= 'X-Mailer: sendEmail-'.$conf{'version'}.$CRLF; ## X-Mailer + } + ## I wonder if I should put this in by default? + # if ($opt{'message-header'} !~ /^X-Originating-IP:/iom) { + # $header .= 'X-Originating-IP: ['.$conf{'ip'}.']'.$CRLF; ## X-Originating-IP + # } + + ## Encode all messages with MIME. + if ($opt{'message-header'} !~ /^MIME-Version:/iom) { + $header .= "MIME-Version: 1.0$CRLF"; + } + if ($opt{'message-header'} !~ /^Content-Type:/iom) { + my $content_type = 'multipart/mixed'; + if (scalar(@attachments) == 0) { $content_type = 'multipart/related'; } + $header .= "Content-Type: $content_type; boundary=\"$conf{'delimiter'}\"$CRLF"; + } + + ## Send additional message header line(s) if specified + if ($opt{'message-header'}) { + $header .= $opt{'message-header'}; + } + + ## Send the message header to the server + print $SERVER $header . $CRLF; + + ## Start sending the message body to the server + print $SERVER "This is a multi-part message in MIME format. To properly display this message you need a MIME-Version 1.0 compliant Email program.$CRLF"; + print $SERVER "$CRLF"; + + + ## Send message body + print $SERVER "--$conf{'delimiter'}$CRLF"; + ## Send a message content-type header: + ## If the message contains HTML... + if ($opt{'message-content-type'} eq 'html' or ($opt{'message-content-type'} eq 'auto' and $message =~ /^\s*( 0) { + ## Disable the alarm so people on modems can send big attachments + alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32 + + ## Send the attachments + foreach my $filename (@attachments) { + ## This is check 2, we already checked this above, but just in case... + if ( ! -f $filename ) { + printmsg("ERROR => The file [$filename] doesn't exist! Email will be sent, but without that attachment.", 0); + } + elsif ( ! -r $filename ) { + printmsg("ERROR => Couldn't open the file [$filename] for reading: $! Email will be sent, but without that attachment.", 0); + } + else { + printmsg("DEBUG => Sending the attachment [$filename]", 1); + send_attachment($filename); + } + } + } + + + ## End the mime encoded message + print $SERVER "$CRLF--$conf{'delimiter'}--$CRLF"; +} + + +## Tell the server we are done sending the email +print $SERVER "$CRLF.$CRLF"; +if (SMTPchat()) { quit($conf{'error'}, 1); } + + + +#################### +# We are done!!! # +#################### + +## Disconnect from the server (don't SMTPchat(), it breaks when using TLS) +print $SERVER "QUIT$CRLF"; +close $SERVER; + + + + + + +####################################### +## Generate exit message/log entry ## +####################################### + +if ($conf{'debug'} or $conf{'logging'}) { + printmsg("Generating a detailed exit message", 3); + + ## Put the message together + my $output = "Email was sent successfully! From: <" . (returnAddressParts($from))[1] . "> "; + + if (scalar(@to) > 0) { + $output .= "To: "; + for ($a = 0; $a < scalar(@to); $a++) { + $output .= "<" . (returnAddressParts($to[$a]))[1] . "> "; + } + } + if (scalar(@cc) > 0) { + $output .= "Cc: "; + for ($a = 0; $a < scalar(@cc); $a++) { + $output .= "<" . (returnAddressParts($cc[$a]))[1] . "> "; + } + } + if (scalar(@bcc) > 0) { + $output .= "Bcc: "; + for ($a = 0; $a < scalar(@bcc); $a++) { + $output .= "<" . (returnAddressParts($bcc[$a]))[1] . "> "; + } + } + $output .= "Subject: [$subject] " if ($subject); + if (scalar(@attachments_names) > 0) { + $output .= "Attachment(s): "; + foreach(@attachments_names) { + $output .= "[$_] "; + } + } + $output .= "Server: [$conf{'server'}:$conf{'port'}]"; + + +###################### +# Exit the program # +###################### + + ## Print / Log the detailed message + quit($output, 0); +} +else { + ## Or the standard message + quit("Email was sent successfully!", 0); +} + diff --git a/backoffice/api/upload.cgi b/backoffice/api/upload.cgi new file mode 100644 index 00000000..47c62fbf --- /dev/null +++ b/backoffice/api/upload.cgi @@ -0,0 +1,242 @@ +#!/usr/bin/perl + +use strict; +use lib ('./lib/perl5'); +use lib ('./lib'); +use CGI; +use CGI::Cookie; +#use CGI::Carp qw/fatalsToBrowser/; +use File::Basename; +use File::Path qw/make_path/; +use JSON::PP; +use Image::Size; +use dksconfig qw/$sitecfg/; +use dksdb; + +use session; +use sendemail; +my $cgi = new CGI(); +my $scriptpath = $cgi->url(-absolute => 1); +my $p = (); +my @params = $cgi->param(); +if ($cgi->request_method() eq "POST"){ + foreach my $pe (@params){ + $p->{$pe} = $cgi->param($pe); + } +} +my $html->{result} = (); +$p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +my $se = session->new(); +my $sess = $se->getsession($p->{sid}); +print $cgi->header(-type=>"application/json", -charset => "utf-8");s +if ($sess == undef){ + $html->{error} = "No Authorisation"; + print JSON::PP::encode_json($html); + exit(0); +} +my $utime = time(); +my $db = dksdb->new(); +my $basepath = dirname(dirname($ENV{SCRIPT_FILENAME})); +if ($p->{fn}){ + if ($p->{fn} eq "setsubmission"){ + select * from cdms where id_project= + #select * from vw_submission where id_project= and is_cdm= + if (exists($p->{xlsxfile}) && $p->{xlsxfile} ne ""){ + my $fh = $cgi->upload('file'); + open(NF,">".$basepath.'/'.$filepath); + binmode NF; + while (<$fh>) { + print NF; + } + close(NF); + } + if (exists($p->{pdffile}) && $p->{pdffile} ne ""){ + my $fh = $cgi->upload('file'); + open(NF,">".$basepath.'/'.$filepath); + binmode NF; + while (<$fh>) { + print NF; + } + close(NF); + } + if (exists($p->{otherfile}) && $p->{otherfile} ne ""){ + my $fh = $cgi->upload('file'); + open(NF,">".$basepath.'/'.$filepath); + binmode NF; + while (<$fh>) { + print NF; + } + close(NF); + } + + } + + # my $filepath = ""; + # my $suffix = substr($p->{file},rindex($p->{file},'.')+1); + # if ($p->{filetype} eq "download_document"){ + # $filepath = 'data/documents/'.$p->{file}; + # } + # if ($p->{filetype} eq "news_image"){ + # if ($suffix eq 'jpg' || $suffix eq 'png'){ + # $filepath = '../media/news/'.$p->{file}; + # $p->{relpath} = 'media/news/'.$p->{file}; + # } + # } + #mogrify -thumbnail x300 -background white *.png + #ls -1 members_sized/*.png | awk -F\/ '{print "composite -gravity southeast wm_fld.png members_sized/"$(NF)" members/"$(NF)}' | sh + # if ($p->{upload_filetype} eq "new_profile_photo"){ + # my $sql = "select link from members where id=".$p->{id_member}.";"; + # my $ml = $db->dbquerysorted($sql); + # $filepath = 'data/members/'.$ml->{0}->{link}.'/'.$ml->{0}->{link}.'_new.'.$suffix; + # } elsif ($p->{upload_filetype} eq "profile_photo"){ + # my $sql = "select link from members where id=".$p->{id_member}.";"; + # my $ml = $db->dbquerysorted($sql); + # $filepath = 'data/members/'.$ml->{0}->{link}.'/'.$ml->{0}->{link}.'_new.'.$suffix; + # } elsif ($p->{upload_filetype} eq "spillbou"){ + # $filepath = 'data/championnat/'.$p->{season}.'_'.$p->{playday}.'_'.$p->{team}.'.'.$suffix; + # } elsif ($p->{upload_filetype} eq "member_document"){ + # my $sql = "select link from members where id=".$p->{id_member}.";"; + # my $ml = $db->dbquerysorted($sql); + # $filepath = 'data/members/'.$ml->{0}->{link}.'/'.$p->{upload_file}.'_'.$utime.$suffix; + # } elsif ($p->{upload_filetype} eq "clublogo_new"){ + # my $sql = "select link from clubs where id=".$p->{id_club}.";"; + # my $cl = $db->dbquerysorted($sql); + # $filepath = 'data/clubs/'.$cl->{0}->{link}.'/'.$cl->{0}->{link}.'_new.'.$suffix; + # } elsif ($p->{upload_filetype} eq "clublogo"){ + # my $sql = "select link from clubs where id=".$p->{id_club}.";"; + # my $cl = $db->dbquerysorted($sql); + # $filepath = 'data/clubs/'.$cl->{0}->{link}.'/'.$cl->{0}->{link}.'.'.$suffix; + # }elsif ($p->{upload_filetype} eq "website_image"){ + # $basepath = $ENV{"DOCUMENT_ROOT"}; + # $filepath = 'images/'.$p->{folder}.'/'.$p->{upload_file}; +# if ($filepath ne ""){ +# $p->{path} = $basepath.'/'.$filepath; +# $p->{suffix} = $suffix; +# my $fh = $cgi->upload('file'); +# open(NF,">".$basepath.'/'.$filepath); +# binmode NF; +# while (<$fh>) { +# print NF; +# } +# close(NF); +# if ($p->{filetype} eq "download_document"){ +# if ($suffix eq 'png' || $suffix eq 'jpg' || $suffix eq 'pdf'){ +# system('convert -thumbnail x128 -background white -alpha remove "'.$basepath.'/'.$filepath.'" "'.$basepath.'/thumb/'.$filepath.'.thumb.png"'); +# } + +# if ($p->{row_id} eq ""){ +# my $dx = $db->dbquerysorted("select id from documents where filename='".basename($filepath)."' and folder='documents'"); +# if (keys(%{$dx}) == 0){ +# my $sql = "INSERT INTO documents (filename,folder,filetype) VALUES ('".basename($filepath)."','documents','".$suffix."');"; +# $db->dbexec($sql); +# } +# } +# } +# if ($p->{filetype} eq "news_image"){ +# my ($pwidth,$pheight) =imgsize($p->{path}); +# my $width=0; +# my $height =0; +# my $density = 72; +# if ($pwidth>700){ +# $width = 700; +# } elsif ($height > 380) { +# $height = 380; +# } +# if ($height == 0){ +# $height = ($pheight/$pwidth) * $width; +# } +# elsif ($width == 0) { +# $width = ($pwidth/$pheight) * $height; +# } +# if ($height > 380){ +# $height = 380; +# $width = ($width/$height) * $height; +# } +# system("mogrify -resize ".$width."x".$height." -density ".$density." ".$p->{path}); +# } + +# # if ($p->{upload_filetype} eq "new_profile_photo"){ +# # #convert! +# # $db->dbexec("update members set new_profile_photo='".$filepath."' where id=".$p->{id_member}.";"); +# # $html->{result}->{new_profile_photo}= $filepath; +# # } elsif ($p->{upload_filetype} eq "profile_photo"){ +# # #convert! +# # $db->dbexec("update members set profile_photo='".$filepath."' where id=".$p->{id_member}.";"); +# # $html->{result}->{new_profile_photo}= $filepath; +# # } elsif ($p->{upload_filetype} eq "spillbou"){ +# # $db->dbexec("update csresult set upload_team".$p->{team}."='".$filepath."' where id=;"); +# # } elsif ($p->{upload_filetype} eq "member_document"){ + +# # } elsif ($p->{upload_filetype} eq "clublogo_new"){ + +# # } elsif ($p->{upload_filetype} eq "clublogo"){ + +# # } elsif ($p->{upload_filetype} eq "website_image"){ + +# # } els +# } +# } +# if (exists($p->{gameresult})){ +# my $basepath = dirname(dirname($ENV{SCRIPT_FILENAME})); +# my $csdir = "data/championship/"; +# my $gmid = $p->{id}; +# my $cdata = $db->dbquerybykey("id","select * from vw_games where id=".$gmid); + +# if ($p->{result_teamhome} ne ""){ +# my $suffix = substr($p->{upload_teamhome},rindex($p->{upload_teamhome},'.')+1); +# my $fh = $cgi->upload('upload_teamhome'); +# my $filepath = $basepath.'/'.$csdir.'/'.$cdata->{$gmid}->{season}.'/'.$cdata->{$gmid}->{playday}.'_'.$cdata->{$gmid}->{link_teamhome}.'.'.$suffix; +# open(NF,">".$filepath); +# binmode NF; +# while (<$fh>) { +# print NF; +# } +# close(NF); +# $db->dbexec("UPDATE csgames set upload_teamhome='".basename($filepath)."',result_teamhome='".$p->{result_teamhome}."' WHERE id=".$gmid); + +# #transform document an make thumbnail +# } +# if ($p->{result_teamguest} ne ""){ +# my $suffix = substr($p->{upload_teamguest},rindex($p->{upload_teamguest},'.')+1); +# my $fh = $cgi->upload('upload_teamguest'); +# my $filepath = $basepath.'/'.$csdir.'/'.$cdata->{$gmid}->{season}.'/'.$cdata->{$gmid}->{playday}.'_'.$cdata->{$gmid}->{link_teamguest}.'.'.$suffix; +# open(NF,">".$filepath); +# binmode NF; +# while (<$fh>) { +# print NF; +# } +# close(NF); +# $db->dbexec("UPDATE csgames set upload_teamguest='".basename($filepath)."',result_teamguest='".$p->{result_teamguest}."' WHERE id=".$gmid); +# #transform document an make thumbnail +# } +# $cdata = $db->dbquerybykey("id","select * from vw_games where id=".$gmid); +# if ($cdata->{$gmid}->{result_teamhome} eq $cdata->{$gmid}->{result_teamguest}){ + +# my $pth = "null"; +# my $ptg = "null"; +# my @x = (); +# if (($sess->{usergroups} =~ /fld/ ) && ($p->{sets_teamhome} ne "") && ($p->{sets_teamgoust} ne "")){ +# push(@x,$p->{sets_teamhome}); +# push(@x,$p->{sets_teamguest}); +# } else { +# @x= split("-",$cdata->{$gmid}->{result_teamhome}); +# } +# if (int($x[0]) > int($x[1])){$pth = 3;$ptg=0;} else {$pth = 0;$ptg=3;} +# if (int($x[0]) == int($x[1])){$pth = 1; $ptg = 1;} +# $db->dbexec("update csgames set sets_teamhome=".$x[0].", sets_teamguest=".$x[1].",points_teamhome=".$pth.",points_teamguest=".$ptg." WHERE id=".$gmid.";"); +# if (($sess->{usergroups} =~ /fld/ ) && ($p->{validated} eq "1")) { +# $db->dbexec("update csgames set validated=true WHERE id=".$gmid.";"); +# } +# } else { +# $db->dbexec("update csgames set sets_teamhome=null, sets_teamguest=null,points_teamhome=null,points_teamguest=null,validated=null WHERE id=".$gmid.";"); +# } +# $db->dbexec("select * from setcsranking('".$cdata->{$gmid}->{id_season}."','".$cdata->{$gmid}->{id_division}."');"); +# } +my $js = JSON::PP->new(); +$js->allow_blessed(1); +# open(NF,">upload.txt"); +# print NF $js->utf8->encode($p); +# print NF $js->utf8->encode($sess); +# close(NF); +$html->{result}->{p} = $p; +print $js->utf8->encode($p); \ No newline at end of file diff --git a/backoffice/css/module.css b/backoffice/css/module.css new file mode 100644 index 00000000..ca08b42f --- /dev/null +++ b/backoffice/css/module.css @@ -0,0 +1,8 @@ +/* input::-webkit-calendar-picker-indicator{ + display: none; +} +And to hide the prompt: + +input[type="date"]::-webkit-input-placeholder{ + visibility: hidden !important; +} */ \ No newline at end of file diff --git a/backoffice/css/w3pro.css b/backoffice/css/w3pro.css new file mode 100644 index 00000000..30134899 --- /dev/null +++ b/backoffice/css/w3pro.css @@ -0,0 +1,378 @@ +/* W3PRO.CSS 4.13 June 2019 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin: 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; } +.w3-select{padding:9px 0; display:block;width:100%;border:1px solid #ccc;background-color: #e8f0fe;} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block; } +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* DEFAULT COLORS */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffe7e7!important}.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#e7ffe7!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffd7!important}.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#e7ffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-blue-grey:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffd7!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} +/* DEFAULT THEME */ +.w3-theme-l5 {color:#000 !important; background-color:#f6f8fc !important} +.w3-theme-l4 {color:#000 !important; background-color:#e1e9f6 !important} +.w3-theme-l3 {color:#000 !important; background-color:#c3d3ed !important} +.w3-theme-l2 {color:#000 !important; background-color:#a5bee4 !important} +.w3-theme-l1 {color:#fff !important; background-color:#88a8db !important} +.w3-theme-d1 {color:#fff !important; background-color:#5180cb !important} +.w3-theme-d2 {color:#fff !important; background-color:#3a6fc3 !important} +.w3-theme-d3 {color:#fff !important; background-color:#3361aa !important} +.w3-theme-d4 {color:#fff !important; background-color:#2c5392 !important} +.w3-theme-d5 {color:#fff !important; background-color:#24457a !important} + +.w3-theme-light {color:#000 !important; background-color:#f6f8fc !important} +.w3-theme-dark {color:#fff !important; background-color:#24457a !important} +.w3-theme-action {color:#fff !important; background-color:#24457a !important} + +.w3-theme {color:#fff !important; background-color:#6a92d3 !important} +.w3-text-theme {color:#6a92d3 !important} +.w3-border-theme {border-color:#6a92d3 !important} + +.w3-hover-theme:hover {color:#fff !important; background-color:#6a92d3 !important} +.w3-hover-text-theme:hover {color:#6a92d3 !important} +.w3-hover-border-theme:hover {border-color:#6a92d3 !important} + +.w3-label { color: rgb(153, 150, 150);} +#main {margin-left: 210px;} +@media (max-width:768px){ + #sidebar { display: none;} + #main { margin-left: 0px;} +} + +.w3-select { + display: block; + font-size: 16px; + font-family: sans-serif; + font-weight: normal; + color: #444; + line-height: 1.3; + padding: .6em 1.4em .5em .8em; + width: 100%; + max-width: 100%; + box-sizing: border-box; + margin: 0; + border-bottom: 1px solid #aaa; + box-shadow: 0 1px 0 1px rgba(0,0,0,.04); + /* border-radius: .5em; */ + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: #e8f0fe; + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'), + linear-gradient(to bottom, #e8f0fe 0%,#e8f0fe 100%); + background-repeat: no-repeat, repeat; + background-position: right .7em top 50%, 0 0; + background-size: .65em auto, 100%; +} +.w3-select::-ms-expand { + display: none; +} +.w3-select:hover { + border-color: #888; +} +.w3-select:focus { + border-color: #aaa; + box-shadow: 0 0 1px 1px #6a92d3; + box-shadow: 0 0 0 1px -moz-mac-focusring; + color: #222; + outline: none; +} + + +.w3-select option { + font-weight:normal; +} + +.w3-table { + table-layout: fixed; +} + +.w3-text-line-through { text-decoration: line-through; } + +#snackbar { + visibility: hidden; + min-width: 250px; + margin-left: -125px; + background-color: #333; + color: #fff; + text-align: center; + border-radius: 2px; + padding: 16px; + position: fixed; + z-index: 1; + left: 50%; + bottom: 30px; + font-size: 17px; +} + +#snackbar.show { + visibility: visible; + -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s; + animation: fadein 0.5s, fadeout 0.5s 2.5s; +} + +@-webkit-keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@-webkit-keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} + +@keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} + +.tabulator-header-filter > input { + background-color: #e8f0fe; + border: 1px solid #ccc; + font-weight: normal; +} + +.w3-readonly { + pointer-events:none; + padding:8px;display:block;border:0px;width:100%;background-color: #fff; +} + +.right-side-bg { + background: url("../img/bg1.jpg"); + background-size: cover; + min-height: 100vh; +} + +/* .mceContentBody { + background: #e8f0fe; + color:#000; +} */ + +/* .tabulator-row-even { + background-color: #757575; +} */ \ No newline at end of file diff --git a/backoffice/data/.htaccess b/backoffice/data/.htaccess new file mode 100644 index 00000000..fd8b0c39 --- /dev/null +++ b/backoffice/data/.htaccess @@ -0,0 +1,5 @@ +RewriteEngine On +RewriteBase / +RewriteCond %{HTTP_COOKIE} !solana= [NC] +RewriteRule .* "%{REQUEST_SCHEME}://%{HTTP_HOST}/backoffice/login.html" [L] +# Require all denied \ No newline at end of file diff --git a/backoffice/img/bg1.jpg b/backoffice/img/bg1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80c5326053ade12314d27724114da709830fe3d3 GIT binary patch literal 135161 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 literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/android-icon-36x36.png b/backoffice/img/favicon/android-icon-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..dc480dc0cbb19e73ef4f3de5f4cf8ebd74a0100c GIT binary patch literal 1448 zcmZ{jc~DbV6vi)7ajT_-Is!rgSp)_0l8^|`qLPV1#85!0fa44yWD`R&5Co}Hogytb zksyn0WKl4P(3l8{Y$8Ym)Ue4C5RgR(ix5x&l{7+MoX(VSrhlAw=G^=HzVE(w=Oz33 zdTrilwh;iZne0spK)S82*6Slr3tvq^;&t$Y4eD z4xj)KZx6uv3jk=4rSp>j#6SSN4g~=I6M(I}>?;2s5M8|A;lKkcD=P~N3lAPVxOeYf zSy@?CRn^?w+=~}4EG;b!3=Gz-TW4lw_TR z3xk7$rBZ25PELJ&{f!$pYHDhxr>BR8hBO+DR;v{Xg+)b0si~=%nVAU*3F+zSNl8hU zE?v5L^JZIHn?j*zXlQu)^r=#*oSB*F>gsy<@ZtRY{D%)8-oAaixVTtcT%4De*VNS1 z-rnBQ(o#@RP+eVp`}Xb9($ZJ2UUheOKYH}2va)hyWaQ18Hys@v&!0cn`6X>m)+p6m+> z&$Mq)v4<(Khx8+bJzmxy1w*D*33*dIl7|I0B3GVt<^-RLIVdks1(^$_lKZ=ofAl0L z=ZZO;9C8C;`&7%=QF{@ED?eO)Vte6AYQUcJ>b|w1=(}8nrFpCQmXuMFM$9u0xY*_B zr5a#r9sS3m{Pz3M*DRi_chVPa4Dpbim~lkCwqDb}rEw0&MvM3sSyTmp`a8Q>J&1LXosZn%5 z=1`e*3YE#GMOYDBcDuMayIUcVuFeqN8H2U*#}KSod_E6Gqhn)ZUD!GrDTH?6MllC| zQzM4JMCTaDis6L8Fo{cx;m{-bFzkn*(EwApQjPwC`J4&EEIOOX;scC3)(}J`BFxrR zKL0Yu*x`JZ4(XIwuSXEmRS1R6q4Ur1=-~6I(7Z_IzS5(*%Vjp908$!9GPtULVbgdL_HhOjtXI1NW|!(nI`>TWs>hl8*LH--zMa6!)3eY$Tak^smDd`VJb=&%0( DI$M2< literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/android-icon-48x48.png b/backoffice/img/favicon/android-icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..4f257d2fb00845177696884e98308190414ec5ec GIT binary patch literal 1789 zcmZ{kc~FyA7shWCsX~E{v<>jp8Bj!2lDyeN3Uxw3p@<@)qMzSD2mvC7gphMDH;TqC^g4w-?Xu3x6%LYHA_X9Ix0 z0RW;)0Ia~jL{k6=V3!#u0I2Z*Ai2qkVbaZr(NTivW+4S_Zwzf8Gg+ifTzkZECAkb*^rcIkvRaMp0)YR40DHO`o z)RcyX#_ij;o0^*H>gw*_zu(Z%P+wnPTU*=J)upMa`RLK3j~_o?zkZ$1=NA?he*OA2 zJv}`>K7Ms|wWp`&-o1NKQBk9#qZck*c=qhsyLaziy?WKw*5>2m^WnpXr%#^_4-YRa zEcEyHfBN)k`}XY~9v%q^2`w!xzP`Rfp|H5PSS%LL&dw?nitzC8($Z3QclVN#61iL+ z7#P^u**P{gW^HXvB9X{svW11klP6EQySpnYDmWZYTwGjAO3KBH7q4Eu%4V~#UArcc zNE{sQUD z9hWa(e)#ZVb8~Z5Rn^OvFCRR3AeBnX%F2?GlKlMqa&vPV8yj0&Tie^)D=RB&YHDU? zW@2JuCMG6wa&iU+241{)arf@s%*@Q2H*cndu?9~R;cR`#9E5M#VF?%8xR$5A0Z`q(9*Ex2 z3#$NZ^0G3g*;_UOP5TcCsxelrbP8vy!h=#{e za@;_EP62MSmG+6D%Km+W+LK93gJi=*JkfV@S*banKw2JbArP7qW?S|;NaGulusXXF zSt7!#0I71ev8+P6RN-UkqfoTxpYmz-RkSC$91^yFc96A&?fqk~d=Wa6c)BSh`HtSe z(>P7Xz5{gU;Nm=HYEZGC<3MKD%#_Lena;D5ip_4Vl!p?lTbdRtetMT>sfhRZHBX-k(-jxC5D;URc+p?7|Xl zg_OOXh+<^Qw%;rD8RVAy)Di1s*?Yd&K=~5ptP9dp9)Fo;CckAEIcW0x&ccflrOiio zMH!ENKlPpLM}+b=mNU@>5RHCx;!dB}RcXQePj;`9m7p53xO#RcV*d|^_2Ux`)*0&l z48TD6xJB=M6$N}Fck?YA_%3ullgi*R;RJ9H))<9_P!QH0B2w`bDiOCIf~XL5%GVUW zx*G&+jtk4x@Ba%7c87Muf`jWFyg9CXA3Bc-tk`rnrVZVV#qiK2p~+|p%2*d}NkBnF z6c(p@3`^2==kvK#3!z1jd2=)7YZ}T4L*M}r&un0_jRPNKyNFIXm3DlSZpTW zkIMvq?Fz&7bURRX^2on@Z0unQV2LDSV~B#s<81O*7%-x-!RI*3p9vr{vzR--&B042 zH!Pj7vjVQH^Gx{o7`7+>JjV^=N*A&i98Yh|KZC(Qu5<#yl}Ltgc)SY(Pom(l3@n|@ gWZ>}-jzn=q!wNLKzX9R!KDYz0vN&R1Wabq7CvZR*`~Uy| literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/android-icon-72x72.png b/backoffice/img/favicon/android-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..faa3184bdbd9329be3240de137826de38b7a1f1f GIT binary patch literal 2257 zcmZ{kcTiK?7RC>Pic$nDfDJ@NuRchjX9Vd*4Mh6o(n1X%(l5_~3qg#!HWC1wg#p0b3jlV&E%zA! zu!91?oH+m>VgZ1clvwfj9snGZMLp70IXpZ(I5_zJ{kx;1sLCR ze&NCeP|nQE{N~M@_V#vOUS1|9CKeVJDwQfCA|fXzCo3x}FE3wOTFTDOo}Zt;wzl^3 z=g-yE)$Q$V4i1jW%F6xy{V!j>czb($d3k;M^l5i@cYS?5H8r)qzFt{b+11t6*Vk8F zT|Fl!M_gQdaB$Gy-#FIhx7CE%gf8b!NGQRb_E3mi;Ih+ zqoZbKW}2FsT3TAKU%$rV@#f~{7z{>HQISX_qS5G#j0|mU?WLt96B83G7VGKhxwW(?(gH#Z|ABR@YsBodjJm^d~zrl+UZ($eDM;vyg*5E&UsqtQ?(RA6ABf`UR{Utd*K zm5Pc=US3{taj~?t^z7{H$B!RLBvMmT)8^)8c6K&}LebaPx3siOPfz#o@E{NfLqkJ7 zJv~WDNzTsBAt50X6BFU#;gge--@bk8=;&BjSeTia86F-E2nc9wY|PEgb#QP94Gnd7 zch}X`WiS{C2?>RTh40_LkBW*43JUV^@u{n;i;aza_3G7&7cV}1_>h*ChQr}fQc_Av zO5)?=!@|N^TU$p)Mhp!NfBg6n5fM>VR%R#i$5*gLm@FQuDFc4TuN?L2DU$l1wgAA! za}-RSBW`GrL=UN2#s zPTG+b>MkslRGw4Wni`Moyo17<&o|FqJdsnvsk>pr{lF-d9w9C+`A5QCqdP__=iinz zcP++;l&%#m|D^sHq1&4XJ+4v?X`y7yHZRhfoBP(BN9Sd)*R!jhEz}(HO<5F*48{w` zsbifEnR9xw+bD^5^pGjVw7*Vum#=P~*sk%NzWq*xg z+~VMa24!o~`>iGtqxRWBRLRrdPeD_7Rx(`~;Ug|;r^g=g4%HL3YZ=MoBgN_z(hc&j zA)eAQ&;K0bFIS}_O+`!vxIOZ8xtqqvx||T7=f)1@FI`n~=dk<`i`uI0-f#QxvOd5n zZ;Z=T(Akl#O)b&EIV{s9%b02Iq9jX$q2aYo+H;9WvKbUZA7H@$91_~O9>L>9?u`$e8}!LMxHT%UYalQOP1?^WPr0-{BstdWv%;^i zsNcwLkle^dxzA*7JMz9KG{7A9u(c#<@JpL;HP&Z>;fs)zkmkGmE$KK4l52A%y)m$w z%|&XMv#h@zWvt7`OYNUPpHo~1xVE^=S(%kRPqD~vTjaeC{S+J)&dD~D#;3T#wQ-4Y z?Ts-+r;xQi>v~o9J$_Ctx+df8u^7>K_!1HQr+D^v>yEci8TA?VW>?PkTva_c_H2Tt zP8KZoV56g&{Tfp4_V%Tv_v8DDPH@)t(nXOZp-q#f5{Fl#Yd3qg)4+eS?J(X92Fg7?a0dOcxMg#^Gfx>j55(qJAgarI96pDaC4IE{`N%EV( z${I_=JNlA=H59EoyB;81`8N4FSF*M_o%hD+>fd*&1VKg?mm$AW$G` z3&1iCD64hBTd{N|%WbjATtMa9Usatq** z{%=Qm+8O|!_zVZWKE&!d`I$8Vf=AmEG1kv*A^-a@5GWokE{>Owg2Khbuoy8(X)zcE khL*x%#KfR*Nol+&s1OD3*JD3;2dn^SsAwwZDw=!z4H3j2BLDyZ literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/android-icon-96x96.png b/backoffice/img/favicon/android-icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..6a9b1ad1a898e6b1cf54b25ccc1241f1c514ce8e GIT binary patch literal 2867 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

ZVK$Ml!i{*E5Q>Oo#GBMNyP)@G) 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 P1b~vfs$8jzanQd2{0{bm literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon-57x57.png b/backoffice/img/favicon/apple-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c0ac1b26160144d4b833263f1fd7460b43ab61 GIT binary patch literal 1902 zcmZ{kcTm&W7RPU>F3Q7Q3;V!D+!5xXLK2c735)wcN+`huP=sZXRFXB27=l!#2n>iT z1d!f)=Yc3y>7au2B1n`b;8F#Y(B%Et*_p@e%=_cqGw0sV_j~T0JNJeXEsSMl6l4GZ zvL<)~ODJRaehwivvKOn^Z&k3DSv(=GKOLdwXBMetq%c1%*PnapQ))y?tb4 zrml9GbKV3wAay1KeCF)?v*aR~_tiHV8v@$pqvRlB>p zPEJmJeSPKS<%5HRA3l6oTU%o=7&SFDj*gCjfq^s{t+KN6<;#~uBJtI$SNHGVfAr{4 zb8~ZAT3Sa(M{RBGmoHzuyu4alTj%HJ^Yinkrlwk2TAn_AT3A?^nVGq;uuxZ5my(jw z)zw9()4jdDOG-)>7Z>a6>u=t?nUs{&*4Fm;@#BDifQ*a`91a%}65{Oayt%oVot=$F zqv3G4y1M%0Fn&hd-pDtN=;2oeg6FU?Ch+cpWpQKbbEXI z$B!T1ym|BK)2FPgtb6zFt*or{_xF#Cj0_JC^ZERViHY#=@SdKYsHmu*prFyw(e?Fp zCX*=;2>kv1-@SVm78d4zVsZw$T^Pm8*Z_n`{(y&yZ@73{R{#!ww;!-R;oTho#3oG) z^sMpii_!B|-;s_tEN7I{%;c`e5cGP{1`?9=6ZjYeKDG!WW`6H@vqa`l%8!>om~r|E zK^#lYdp8kgHzkj6gTHQBZcg@Qba9rFu(S5yoOK@eY+60hns)VSY(}uGJPO4M>6zHe8N?(3;cvFKFkV~#uGD}f#+Yeyao4~EHLDc73MytPFro-wgn8;S85 z^Rlo@8BrBqmc!p^zvxLVvTU(_`DG(@L318M&RK##m~+%%;rr zQb&n{n}NFn>xZxCBGp=rDYs4vh-R}ztF*D*AC)bSky>KLO^?8{6~4vy<0^)~_7SR2+FN zfyPPYZD=YB&OWUW$eog#n)K9TDz@JF)=^lHyUoBV>B%Wn+PT#<_1oFFoc^6JGkam= z;_o`#ig&A|s#tYun{wk3{cNBP3a^Q)r=?jewAj9*d; z&J&J>li#<(f`CM$z$Zmlg1#45OS2Wl#=Aw@8>soMP|a;6o>PvjE$WCh<==YqixeXM zkmm&7PmJ6_wz-|EpPaRT&v8s#I4`~`J(_I6!K#5{s-CuppQ+!U$ zT+3TIy>?jUKb!f>xiN0g6HwtBUgy)ud^(QGqeBU3B9K^hBtjj5v_@cXC~X`@^E?89 zLm+HCbfLF$K;X=wu^68JU!bZI)C~!Y_B*(87<_j!j}AY7t0OS#NKIuDQcIc1=W}szIP_&{u=Z&vAX&z8uNM9{=Fgru9Fxv+V)6kJt0@O~K@cNPyMl9FoPI99X7M*4f;B_|Bt{F1MQEc?nuNkFDul=#@Udcf(E&nV zKRV;m0Co}v&Mtg5#|h3L-)2!cF0SzZT?`z-AfwR?%teGI3Pq!$ pw6sx3Dw2GWPDP;*np)Zn4M?E@?Qih*=sBnZFfp_+DA9Ke_%95#Uzh*@ literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon-60x60.png b/backoffice/img/favicon/apple-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ce94760bcdd544c6016a101ba41474a3561978 GIT binary patch literal 2003 zcmZ{kcTm&W7RP@GQdHK4!m=)l1r(N&0s*qD6lp=jf<{zW+=S#82qg(5)TP8n??rl( z-ix70k>Vnt^eRny2LWj+McE%aZ{{&O^Zqz<=G^l+-*fNWbFZJio;Lpp;S&G=@MCl| z?m}Mq(0DlySFT8?LXOK!4XXwK?2wcDgyT@m!MLlf4it7=T7&{oqRw3`062>S0Lv2q zcA+KK0sz>-0AL9Z0O%M15Tqwm89=JX#PsjrG!G6A_V@QUHa0$f{P^k9r-6Y1U0q!T z1qDS#MHC9TS?d|jP z^S^%m%FoYVQBg5EI@;UYyS~1@wY4=dF%cCNg~#KqtgPsC`sCzfS63Gni!CZDT3K1a z;c#!>ya^2reg6FUix)5Y`}=oycWrEJo;`ck+1XiLUA?@#{Qmv>+S=Nop`o3f9R`Cj zI5@bvy4uv#L?jYzZEXnzLP<%9gM&j#N=js8q>GD-ot+&9gP~HX#>U3M!NE)>)6>)Q z^XJbU9UUSfBHY~Eyu7^U&!4ZXtQ;R7Pe@3xu&{Xi_%WGGPEAd1X=yPtGuzzUtgo+U zv)TIk`awZKCMG6TRaGB8e0cftrGbIL+}vDgY3ahkg1^82w{PDvGc!$1O^u9<5)%`B ze0)??R5CI$3JMBbU0qo$mZqlW?Ck8+)YRJA+RV(1va<5X$cUexUwV4FwY9aIo7=;O z53{qgU%h&zs;U|i67uECmw)HF0SczJn6L`1Zlo)dGcg>db+W(vADRn zxw$zxIaw~MdJCEW4%6G(8i4QdA9bLBkFN8G0RSh@9U4c^sM|gOa0+8I)Nne@E0LD> z&JhGyr)7*N4XL_*$5~W;g3a2ixd-C^P zIhN9Uli|TX#ZB(e$z#a*Sl3Ra&5mPV)~Dy)Sr=Iez-aX)A?E5n`*+?Dg76wzS}WSI4mzTqYgd0RoUhBF3+tb{*g-%kt?fT}$HAHxZ z{tZ*#cjW@$UO;q?ssJtGcF@ofR#*YNs8-z4~Isu1@7FvMK;8GOF>C4=1A8KeFRIrhpa5nC>yw z63n!T=uGdWyR2Cyu|5DFQ zx1S7~95i&&ti<#4O*~KOzQHQnHm@Y!s$qwY6J)vl8VJYkaNX9UJT0aqmF<8QPp@IJ zI;M4N=i=uB)RM2}b5FP<)uc0R&|JCv76HTdRZSDR1j(+@K4q5&1~bJa2=0dR?NuMO ztD3;#sL_b{xa26jz<6E0W_TkF*YQK*%={^Ak=QR*^0<+|EUH~9v@)-VcZ0FFmvB@wkUK zf9=#_)_ zruWVczp@AHL1Nc{F7$N7n3@lnBmxse6Kz4r0SFjeNg585hQV<#c{EZHEsyva21CPO z4;+7m-q?`>YZ{3{cKZJX;$mK%P=VHA2L_GIbRgJ*0LGeN24V?j6r!alN=89OQCdk9 zYAGiTlb41gL=E65QFA7fj+T{$K2aIUAq^Qs%g}7i-g~b=f`HJWBF@~-+7yk}pb_n? zK`IlC)`w6A0M9z8mi-s=Pfs-39Hf|;GXb~~;xu6E1u=q0bpFdcppcm6he&V!WnKvR z{s@AlSc6O_Itcu;D_J_#Or_XR?_WAt97F+dd6be8Oc9AhVDol~5OVs6&OM4V2*A|U zBT{dEfKrA>Qups-05Zi2gpMz3O=Viq%w)*~dkT?8Wyt>TVq{@tf}9*#UIB(cB1uFf oN)ZVs!U+l>5s8E$P>N(3s6qzXU%&mZB-8=GXzFPcs^kCjH|kWEumAu6 literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon-72x72.png b/backoffice/img/favicon/apple-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..faa3184bdbd9329be3240de137826de38b7a1f1f GIT binary patch literal 2257 zcmZ{kcTiK?7RC>Pic$nDfDJ@NuRchjX9Vd*4Mh6o(n1X%(l5_~3qg#!HWC1wg#p0b3jlV&E%zA! zu!91?oH+m>VgZ1clvwfj9snGZMLp70IXpZ(I5_zJ{kx;1sLCR ze&NCeP|nQE{N~M@_V#vOUS1|9CKeVJDwQfCA|fXzCo3x}FE3wOTFTDOo}Zt;wzl^3 z=g-yE)$Q$V4i1jW%F6xy{V!j>czb($d3k;M^l5i@cYS?5H8r)qzFt{b+11t6*Vk8F zT|Fl!M_gQdaB$Gy-#FIhx7CE%gf8b!NGQRb_E3mi;Ih+ zqoZbKW}2FsT3TAKU%$rV@#f~{7z{>HQISX_qS5G#j0|mU?WLt96B83G7VGKhxwW(?(gH#Z|ABR@YsBodjJm^d~zrl+UZ($eDM;vyg*5E&UsqtQ?(RA6ABf`UR{Utd*K zm5Pc=US3{taj~?t^z7{H$B!RLBvMmT)8^)8c6K&}LebaPx3siOPfz#o@E{NfLqkJ7 zJv~WDNzTsBAt50X6BFU#;gge--@bk8=;&BjSeTia86F-E2nc9wY|PEgb#QP94Gnd7 zch}X`WiS{C2?>RTh40_LkBW*43JUV^@u{n;i;aza_3G7&7cV}1_>h*ChQr}fQc_Av zO5)?=!@|N^TU$p)Mhp!NfBg6n5fM>VR%R#i$5*gLm@FQuDFc4TuN?L2DU$l1wgAA! za}-RSBW`GrL=UN2#s zPTG+b>MkslRGw4Wni`Moyo17<&o|FqJdsnvsk>pr{lF-d9w9C+`A5QCqdP__=iinz zcP++;l&%#m|D^sHq1&4XJ+4v?X`y7yHZRhfoBP(BN9Sd)*R!jhEz}(HO<5F*48{w` zsbifEnR9xw+bD^5^pGjVw7*Vum#=P~*sk%NzWq*xg z+~VMa24!o~`>iGtqxRWBRLRrdPeD_7Rx(`~;Ug|;r^g=g4%HL3YZ=MoBgN_z(hc&j zA)eAQ&;K0bFIS}_O+`!vxIOZ8xtqqvx||T7=f)1@FI`n~=dk<`i`uI0-f#QxvOd5n zZ;Z=T(Akl#O)b&EIV{s9%b02Iq9jX$q2aYo+H;9WvKbUZA7H@$91_~O9>L>9?u`$e8}!LMxHT%UYalQOP1?^WPr0-{BstdWv%;^i zsNcwLkle^dxzA*7JMz9KG{7A9u(c#<@JpL;HP&Z>;fs)zkmkGmE$KK4l52A%y)m$w z%|&XMv#h@zWvt7`OYNUPpHo~1xVE^=S(%kRPqD~vTjaeC{S+J)&dD~D#;3T#wQ-4Y z?Ts-+r;xQi>v~o9J$_Ctx+df8u^7>K_!1HQr+D^v>yEci8TA?VW>?PkTva_c_H2Tt zP8KZoV56g&{Tfp4_V%Tv_v8DDPH@)t(nXOZp-q#f5{Fl#Yd3qg)4+eS?J(X92Fg7?a0dOcxMg#^Gfx>j55(qJAgarI96pDaC4IE{`N%EV( z${I_=JNlA=H59EoyB;81`8N4FSF*M_o%hD+>fd*&1VKg?mm$AW$G` z3&1iCD64hBTd{N|%WbjATtMa9Usatq** z{%=Qm+8O|!_zVZWKE&!d`I$8Vf=AmEG1kv*A^-a@5GWokE{>Owg2Khbuoy8(X)zcE khL*x%#KfR*Nol+&s1OD3*JD3;2dn^SsAwwZDw=!z4H3j2BLDyZ literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon-76x76.png b/backoffice/img/favicon/apple-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..16e78ac8ef3f52315217583edba5717a0ce05558 GIT binary patch literal 2339 zcmZ{l2T)Vn7KRUAxgwFLU;%j+^eQSX2>~QQDH6IsfCvauLP$b{gce$8p@Vd!S3$af z5=4<+M5Ra(ka8&^y(36(@8G08sG&z-^OUu5||hju>L@V-*e#4jLO9U0q$>+}s!pMsII#XlN*? zI)3~(lgSJV3u9qnVP|JADJeO2>=+vx8y6Q>X=!P3aq-mD)QJ-(-o1Obx3@PtJ3Bf$ zy0Wsev$M0bw6wp!UshJOv9S>m5uvE4sI07v#bPTeD!zXGs-vT0WMniyKVMZEUtbp&m#wX>PoF+1 zC@4%%PyhJwBRxIc-Q7JhGP0wiBPuE?KR^H3vu93DPEAcs0RaIX9v*MryxHE~{`T#g znwpxnwsvf6Y+GB~>gsAuO^u9_RzrVknoLoag!_3S~e0;pAsi~!KJp=+79v%(}3DMHhl9ZGjA0OY{-L0&weE$4-e}8{YPL8^| zy1u^t^73+DU!SI?W?fyKgM$N&Mq6833knKKOiYZ6i!(PjfB5hrA0MBIiHWnbv#zdg zQc_ZPcekplYGGkva&q#|pFid0<-dISGC4W<{rmTUfdNiVP6~zcNRg+iY`ecIXCxw*Nir>Cc(p>g^0Wji}ND=VvvjEt6+7H@Cw*RNk= zFqpx?K?@5DI-OonP(UCMf`fx`I9zymcy@L+i9}jhSXf+KOh`zWo0}UO8~gC#LrO}D zmzNirO!o8hd;IvZjg3uLS65(QV0(MJqod=C7cZ=>t&56^($dn(%gaB0{Ag%s`10k; zSFc{x*4Fm)^cWi(|9!Q?53D2>Gc_eN5XgE_`LL{Plpopy0EFw%SiTH-?1BX?rh=Bk z>NhOJ?CEJcUHB-o$*7-{FkNx(%)6ec)_n8|OCzc7)-{3V#K~IQyz^nUtGK+F`;U== zN!o~pcOf)ssT8bQ%D{esQEfI!v!ibBRm#rxsK??~va88dwam!U#v|a!;p1K7f9CAP zOIq;aD}?bfo1h%uXsxkfw(zpsr}vLBI}i|)bzQfc!yWqUc~HnYl)&pwu`^1o z9F7?3uqfDt?aeFQ`*vGA&GNV~B=vJR0=Pf`j|}@u;G9MmX9z81kjQG9^+>gthRsfE?Q(QXXHp47`fMXK`X&61d=f`l zoGX0?DC*`dQf)J8*nWwUs)%PUu8uF#yW)0C{B!^O*Wv}e0SC{>!9HsTHwOf6*>VW8 zAUwAq)!-!69P zM5x@T;Q27V5uSZ%a;Tt3LX|qvgLm#ME#bZkQ*43pWrIO@6u$f}wU*A6iDUqMkx>U79j@kIKTZgXG4^vn# zq33Fv=tjqyaNliD+e)CcTy`!_&!$of%R0Q=6i3Qp*OVoTpCIjH8KcEo2EAwfdIvK? zWeTqz#6{M-k{J`h=?AO~GqDOD%m_V^>xAK-w+OBk#b&HBvQJlVq6}*Y4@m)q5Tf03 zazuR)YjpS6=JpZkzA^q|)A;DBe(kAE=$TO_lVO$DZ}_&tvNF;KdhRr5;vb?&k$eles;JLkI!mZUT7H{w7QxRua3Exu%cFX@3q_p3{HzhVhTGUSWiZEPWW!So_qEMN7 z0<5OZ@RQn8#?pPh>H*eky;EvNrMu`w>}tgf zP6-K!v6Cu}oDCX;uVyn-UgVKvK_yAg2!&5|@sEbB(0%jcNYDP| zmP@Lihn4xlFRnpa<3h_?Q9ia;>r_zjjcdc$mT7 znn-iP*%1I03XVij$C1c*OFjva+ai*}NIo#7m@rIS7%s}E1()EnpwVnlP$+mEiI5Lz z&_G(m+Kx2nzW@dVcn%|CEgUFjC=}Wn??53?X($v1MC}21&OrtAAIz_uD3k?(OtPQ> zaHQx-!0xcSa{m_Rzl?CeLao? Q0$>I}ML`2ybkEfLKT2UQ{{R30 literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon-precomposed.png b/backoffice/img/favicon/apple-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..887a048ff35cd99d98755e6482d97368c2dedfd9 GIT binary patch literal 5226 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 HI`V%2iF0}C literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/apple-icon.png b/backoffice/img/favicon/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..887a048ff35cd99d98755e6482d97368c2dedfd9 GIT binary patch literal 5226 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 HI`V%2iF0}C literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/browserconfig.xml b/backoffice/img/favicon/browserconfig.xml new file mode 100644 index 00000000..c5541482 --- /dev/null +++ b/backoffice/img/favicon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/backoffice/img/favicon/favicon-16x16.png b/backoffice/img/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..fede4cc71a6ab616da807ec4050e1a0cfa15bb16 GIT binary patch literal 1004 zcmZ{hZAe>Z6vvO)V%Hb!R-E0~FdMW;M{=K=YhrTQ3(>eFu94&>jT;P>>-8qNtTDk{ z&DswoY%^>ynRaoVFe}av3LDZ@n~4LB&bJxeoJr;jDsBwlnBo^fV$?k;gN4FAoab=P z`JMkchv!pMh3>-H=g$Jb1%qD8V1F@fXR`5ID9yECcgm?TY5>0f{9KAXjpHmIqbq@) zUtZY4frQgDMu6K_0RkTbBylRR2~dXsw(S7)R{;6muLsPp;zGi7-CA~Xa&mlpd~|da zi9~ERo5f;b7{+Wi2ZO=(_V%2d9Fl&d&1k^6czvJRXn5 zV$;*pi;Ig33k!2|b4yE0o12?kTU*=P+w1G=8yg#IYioyxhpAL5a{vCj_`s~Hw{%+g z4u`T;r)sLh(@ULgV*pe84Yevwcxn*{|#5K zH2jJi-b_#Mc^smjt>wYsW}Uo|bqd`35~ZwIrjn{9cw~_jDWs%aVkVUmmneE^g7EwO zG9gW4!?es(>s$`*U_rQ?RB4=zDA^J6GnYNcAfl4Ji$DkNz*P~aJobw z)$&}ZZNN-^hR(lCrBE%p(n##Pm(F11xeUZ8xOwrGmxsq&5#Ac-8xL(2Pv{t}m;zFv zRI8DSqU6SJlN?5JGjuG%Z5~ibN$8u`|HdU-M(GA)0Ecjs$LAC78u6ybNjTVgf%DY( zi2pu@Kn}L3$e}1ka*C?vD5Z)bIg%~rIf_DZrOF}09WuOMqJHTbo&bij3T;n`{lk9% D{_2RD literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/favicon-32x32.png b/backoffice/img/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0e386aef5b6e0c73497cf5e85cf92327a86145 GIT binary patch literal 1328 zcmZ{jc~DbV6vl5_=^z;@6%<8laa!oK3VBHc;i*+(s6-k>jF5H)O9(HEEMZ6xWw3$> zVib`81rY|>q3nC0%BrA57TJk}t?XM+C}N7z8>cg6obiuy&zyUI-*@gZ_lCXQ32iL{ zEdYQv&4%g#v!OaPKZPSTP2336Cax9T3V@;r{2EIG);OWV2@1$>-94=)*)|Sz0Q`*s z2)qV>3Qh%10pN=OFyjIM8V7*BcS6-a4;_~kI7_aWMrhLr)OtpKYaKwA|hgXdU|eduBN7DZEa1ZQaye8bZKd6 zVq)Uu%a`%-@kvQZiHV5;0Rhp`(Xp|y4<0-S4h|k29ewiTNnKrCWo2byVPQ#0Nn2an z(9lq7YHE3Tc~4Kz;^N}!>guCMk18rE9zTBE+1Z(ul{Gdt*4x`VJUrae($d%0CzVPw zGc&uoy578bqfjUs8yjD}dNngMv#_wBR4S*Yrsn78XJ==ZmzO6eCr3s`Uc7iwUtizf z-#ME=hvK(22+(L$D~5$^UZQZS z1A4W}G(mcHxqYX(D|VR|zPE#v%)E)5^ax!ZS-)~}F!ylp@fxA>$m@ZnL$Alr1zxER zVsdh$p0(1omhi^gW1rO*(+cl~#GL)dK%DaVA(V5uVZVp#>hHQbvAcBoKHG#VDLj7h z0!_RkiEAsF+`^2b1<8+Us(1w3-SUXrrzn}ZvAe?CRu_3rRF{+@>iFFYgihRhGJ_UQXulh|!n+KylUWFMpNJiSHC z2y!CjqsNYgJLHlXDLLAE+-8rAmZUAfCj>J38+`s_ocL}co*L=Q-Kz0eID8Kb9-rXpCGrq(2^`i1K3m`=B>ev{1cbvnaDZcW5FwGtZfvr-1)0bu jvJPTwG8rM6TX0OF!W8bW`-1#?*a6V2?Wp+_m#hB*gG^Fa literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/favicon-96x96.png b/backoffice/img/favicon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..6a9b1ad1a898e6b1cf54b25ccc1241f1c514ce8e GIT binary patch literal 2867 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 D`lhCj literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/manifest.json b/backoffice/img/favicon/manifest.json new file mode 100644 index 00000000..013d4a6a --- /dev/null +++ b/backoffice/img/favicon/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/backoffice/img/favicon/ms-icon-144x144.png b/backoffice/img/favicon/ms-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..f85274fc9de754cca305ea08e3fbf2162cffe083 GIT binary patch literal 4090 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 iHXHh!#ztL&{ literal 0 HcmV?d00001 diff --git a/backoffice/img/favicon/ms-icon-310x310.png b/backoffice/img/favicon/ms-icon-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..d958930c903bd4daad0c938ef69d0dc75a4326a3 GIT binary patch literal 11523 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%0ANZ=@mcZ<;F8fVONROyfDPH606xBigCot}i6~)X \ No newline at end of file diff --git a/backoffice/img/icons/Bill.svg b/backoffice/img/icons/Bill.svg new file mode 100644 index 00000000..b891cd29 --- /dev/null +++ b/backoffice/img/icons/Bill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/Document_Save.svg b/backoffice/img/icons/Document_Save.svg new file mode 100644 index 00000000..7262b20d --- /dev/null +++ b/backoffice/img/icons/Document_Save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/Floppy.svg b/backoffice/img/icons/Floppy.svg new file mode 100644 index 00000000..d85ccd9a --- /dev/null +++ b/backoffice/img/icons/Floppy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/Folder_Delete_01.svg b/backoffice/img/icons/Folder_Delete_01.svg new file mode 100644 index 00000000..c1b0566f --- /dev/null +++ b/backoffice/img/icons/Folder_Delete_01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/Folder_Find_01.svg b/backoffice/img/icons/Folder_Find_01.svg new file mode 100644 index 00000000..7d4ef633 --- /dev/null +++ b/backoffice/img/icons/Folder_Find_01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/Save.svg b/backoffice/img/icons/Save.svg new file mode 100644 index 00000000..ce6bfa35 --- /dev/null +++ b/backoffice/img/icons/Save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/access.svg b/backoffice/img/icons/access.svg new file mode 100644 index 00000000..ca4578c8 --- /dev/null +++ b/backoffice/img/icons/access.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/access_white.svg b/backoffice/img/icons/access_white.svg new file mode 100644 index 00000000..5ecb2b80 --- /dev/null +++ b/backoffice/img/icons/access_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/address.svg b/backoffice/img/icons/address.svg new file mode 100644 index 00000000..4d51035d --- /dev/null +++ b/backoffice/img/icons/address.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/address_white.svg b/backoffice/img/icons/address_white.svg new file mode 100644 index 00000000..a5de7d77 --- /dev/null +++ b/backoffice/img/icons/address_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/apps.svg b/backoffice/img/icons/apps.svg new file mode 100644 index 00000000..eef3c30c --- /dev/null +++ b/backoffice/img/icons/apps.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/apps_white.svg b/backoffice/img/icons/apps_white.svg new file mode 100644 index 00000000..f37f596f --- /dev/null +++ b/backoffice/img/icons/apps_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/archive.svg b/backoffice/img/icons/archive.svg new file mode 100644 index 00000000..5dc21eee --- /dev/null +++ b/backoffice/img/icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/archive_white.svg b/backoffice/img/icons/archive_white.svg new file mode 100644 index 00000000..2cff08a7 --- /dev/null +++ b/backoffice/img/icons/archive_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/calendar.svg b/backoffice/img/icons/calendar.svg new file mode 100644 index 00000000..6b51e035 --- /dev/null +++ b/backoffice/img/icons/calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/calendar_white.svg b/backoffice/img/icons/calendar_white.svg new file mode 100644 index 00000000..c738ec5a --- /dev/null +++ b/backoffice/img/icons/calendar_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/club.svg b/backoffice/img/icons/club.svg new file mode 100644 index 00000000..8a941e33 --- /dev/null +++ b/backoffice/img/icons/club.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/club_white.svg b/backoffice/img/icons/club_white.svg new file mode 100644 index 00000000..5325dc0e --- /dev/null +++ b/backoffice/img/icons/club_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/clubs.svg b/backoffice/img/icons/clubs.svg new file mode 100644 index 00000000..0a7d497d --- /dev/null +++ b/backoffice/img/icons/clubs.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/clubs_white.svg b/backoffice/img/icons/clubs_white.svg new file mode 100644 index 00000000..7184d282 --- /dev/null +++ b/backoffice/img/icons/clubs_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/code.svg b/backoffice/img/icons/code.svg new file mode 100644 index 00000000..c3b4f286 --- /dev/null +++ b/backoffice/img/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/company.svg b/backoffice/img/icons/company.svg new file mode 100644 index 00000000..4b65899c --- /dev/null +++ b/backoffice/img/icons/company.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/company_white.svg b/backoffice/img/icons/company_white.svg new file mode 100644 index 00000000..ed26c0f7 --- /dev/null +++ b/backoffice/img/icons/company_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/cube.svg b/backoffice/img/icons/cube.svg new file mode 100644 index 00000000..31b31290 --- /dev/null +++ b/backoffice/img/icons/cube.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/cube_white.svg b/backoffice/img/icons/cube_white.svg new file mode 100644 index 00000000..9a78edfa --- /dev/null +++ b/backoffice/img/icons/cube_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/cubelight.svg b/backoffice/img/icons/cubelight.svg new file mode 100644 index 00000000..ff786d47 --- /dev/null +++ b/backoffice/img/icons/cubelight.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/cubelight_white.svg b/backoffice/img/icons/cubelight_white.svg new file mode 100644 index 00000000..c7965b66 --- /dev/null +++ b/backoffice/img/icons/cubelight_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/dashboard.svg b/backoffice/img/icons/dashboard.svg new file mode 100644 index 00000000..c5f36ccb --- /dev/null +++ b/backoffice/img/icons/dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/dashboard_white.svg b/backoffice/img/icons/dashboard_white.svg new file mode 100644 index 00000000..c6a7dda2 --- /dev/null +++ b/backoffice/img/icons/dashboard_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/documents.svg b/backoffice/img/icons/documents.svg new file mode 100644 index 00000000..aaec4c6b --- /dev/null +++ b/backoffice/img/icons/documents.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/documents_white.svg b/backoffice/img/icons/documents_white.svg new file mode 100644 index 00000000..94d71a70 --- /dev/null +++ b/backoffice/img/icons/documents_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/download.svg b/backoffice/img/icons/download.svg new file mode 100644 index 00000000..eb209562 --- /dev/null +++ b/backoffice/img/icons/download.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/download_white.svg b/backoffice/img/icons/download_white.svg new file mode 100644 index 00000000..100cebfc --- /dev/null +++ b/backoffice/img/icons/download_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/duplicate.svg b/backoffice/img/icons/duplicate.svg new file mode 100644 index 00000000..cebaad86 --- /dev/null +++ b/backoffice/img/icons/duplicate.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/duplicate_white.svg b/backoffice/img/icons/duplicate_white.svg new file mode 100644 index 00000000..a643c740 --- /dev/null +++ b/backoffice/img/icons/duplicate_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/edit.svg b/backoffice/img/icons/edit.svg new file mode 100644 index 00000000..c0bb9ac9 --- /dev/null +++ b/backoffice/img/icons/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/edit_white.svg b/backoffice/img/icons/edit_white.svg new file mode 100644 index 00000000..bbbe89ff --- /dev/null +++ b/backoffice/img/icons/edit_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/excel.svg b/backoffice/img/icons/excel.svg new file mode 100644 index 00000000..6c14cc2b --- /dev/null +++ b/backoffice/img/icons/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/excel_white.svg b/backoffice/img/icons/excel_white.svg new file mode 100644 index 00000000..7693393e --- /dev/null +++ b/backoffice/img/icons/excel_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/file.svg b/backoffice/img/icons/file.svg new file mode 100644 index 00000000..6df51bd3 --- /dev/null +++ b/backoffice/img/icons/file.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/file/dir.png b/backoffice/img/icons/file/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e3c0f7a86c11aa1fcf421ea51a3af8b34d1afa GIT binary patch literal 6937 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 literal 0 HcmV?d00001 diff --git a/backoffice/img/icons/file/doc.png b/backoffice/img/icons/file/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..8e43190813bc7f09fad8d4cc8d5998249b1ffa7e GIT binary patch literal 6455 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 + + + + + + + diff --git a/backoffice/img/icons/file/folderup_white.svg b/backoffice/img/icons/file/folderup_white.svg new file mode 100644 index 00000000..74fb0467 --- /dev/null +++ b/backoffice/img/icons/file/folderup_white.svg @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/backoffice/img/icons/file/jpg.png b/backoffice/img/icons/file/jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2999cdf8be9e71bee59468502897dbd743cbc1 GIT binary patch literal 6297 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 b>>2zY@w+S`gh`U%00000NkvXXu0mjfe506! literal 0 HcmV?d00001 diff --git a/backoffice/img/icons/file/xls.png b/backoffice/img/icons/file/xls.png new file mode 100644 index 0000000000000000000000000000000000000000..ceabc7d00786e914f82fd171b155f6a12460fe10 GIT binary patch literal 6065 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 UUWti#UWNdQvZ}DJ(&nN61KZCx`Tzg` literal 0 HcmV?d00001 diff --git a/backoffice/img/icons/file/xlsx.png b/backoffice/img/icons/file/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..ceabc7d00786e914f82fd171b155f6a12460fe10 GIT binary patch literal 6065 zcmb7H^-~*MuuYI4#exTS0>zBy^M^y zqKpiktGkPhy`wb%pb(Rn;iauLPZ~9j5JIS@5X7cUIM`{TDBvO#lDXJ2Y zFl|?uMshhOA9OXiL?*e8AvOZ2QMZosX-!>F_xo&G|!n9q3Si7+f9R|M6BID;TFppLlJ%KRO}K)*J(fa{@qh1gyH&*GrS$$f0DR_|L^VW)achZtvNVZ{m9ZPX%eM1`NCa_00I~vzvKi2-#0zalKsTX0@N0O#&)oJW68>2BCbq zsUBw>M*de>*7zdleBrMl!yaSn)+d`wtQ!d;gq`up<`A-N%$rueP8O>$xMHN_fXikb z#9vhq08Lrq+VaqP=g4W50_6+k-0%UcD*QA%nc~(T87CUX?;jg6AS9*b2xPWiv){XObQBL+G0F!;7diz7vs5v(v_Isx%UVs}-o4=`M z-#Ulw%j%^iV`X500~`0w@m&F4kc^rCxMt__@m~w?^Hkv!IIoPUkh6_%IjnDJY~A%1 zXR9FUh8E+|lZF)hkEt`7J53fgT>h5sZAPQf5K%OGmUN`#O+oeze(z)Hd}~I`!VP#L zLm#D#o#FFGAlFhemwLsK(FQP;}9uRP@9Y9tRbx)FV2bHKBt*IN_0>EEIMUjF=qq&*$u7(mP0bz7x#KDb)S%|FF%;=1bal1AUtA-fJ8G2PA4-&^*usA ziEv{{3N}oFY#~haPV|SYc?`=82)fjta_{in zUmLt#k#=S&p#Q_#rBTSP&yEH?A=Z644TZBCYj~GO>j`LIXd8dYtko~_hPf%6RuY>2 zREVkR(=aU4E`e+BMou;G>CDTCXp6}B)Vs%>q5qX9=ID=Jms!(@h2BGLp;p@ARch8+ zt<#>(Wd_GJw&c3}-{B(br1N)1Z+N(sN*NZ6>0C?`>Ob}#tuEbct- z#B?}y)O0%cSY`xgURKr4Y<>3md^)2vy)Yv;y;8|P9WafYZm#sI{DYLV&$JJB*nEF5 zDO`OD$8$;?raH<^5sBJfnhk$7D!?e9XLp38n#i4gyse|Dam9|yeQscI!v!)ESc(uPBZLgHB*j)M+$J_h-CZg7f{%Re1 z{Lvd1ns1)*`Zd1d67h#Es39onN$`mhXb4;i-U_ai9PCaH36Lr+M3l4StF{_{3d2>V9&z#FFPdFLF8^alMEK-yU8oQVZE^Ab-XmLE^IwH!) zaKUg%IsV1Ht;W>KlFllw^g(4M|8>@SzGm{7b~mZ^i~NeairKPG)fXy@1y^k1EC_Mb zPsy2X+6v%utb4vj{&T*l`jPtB`qJUtPlv{W%-DpltYzlozPI-a%#Tk8_rboK@?~#i zXr-RB2#H=Rty3?7cDy#O@+ppy^ z6z?2x84YO+Z?ty^f;Mn*aQnA%*_fy$>rQ4D*Ifqg8^w{t%JvHhwm5!Xj9!4w3AflE zl~<|IDtj}NDc2~!RQltx<=lCbKB|{)7O;@gVEt{R$Z=eEM0ag=e{rdq8mh-N&P}^W z^Bv)VVI}`F@srr6gAR2IJ&oqLZ_3}54I#$!Cf4eWje7x}N|y==dMbW3HizX4zuSG< zYY$H6kh&E*dWP4|wdTj8zFl`?ppwYgfXo1qdm2GGp{tS1 zfYHR!QO;~m>l)YUQqMEv|af^`6K25mQW5pt@C% zE0ONGx4XNEv_dHR9_Pl0d(?1uxSTjn%%5-jkLT@PAH4Bdx%^l6VvH=&^qt8;+oo%! zM|WW12F5+DD2N&)7DW}+#w})Y1j!fjUyr>{N9rMJ^V>;X52uFyC9myk{B~JUXrV{^ zY`@*ny{p-7_HZ6wGVmY^Xx_}9Ld4!@UsDDOJk*)&(TPj!iHn|?_k@XAE!DBUv3|M; z?AW2dwdfBYgPk)j$`7&xuyVgKz4891IGdVP(f{V&3M9#zDv z6$GMQho9fO0VDUHH6+MVSsn&>`p*gx6{*h%maBq+2LSMb=syPnvUACwK@7N}iY&$k z79Ji24$7E{z%vAa%j&~rT%4S&o#6l(cWVo{^*cH*d$=8)yrPP_UI-o;0D!Zk2$RzG zUO3FN_a>I57<`%$muG=Qs?vcm3A@q$CTWp{d!8B^tQio1)eSNjQId0p(vt{K=n2Tw z(TM2_3*9+}iclEX89wdEB{Al@w-j24*tpx4SGQlGvVd|EQ(IGbFN5+QwFfVzYpYk9 zoqv#rwHqSt^6cja6U(uRF}Wmdc_h)8K%1kPB00Bzg~S#8+3(TNG+>-@=xC)|DU6a| zM?rh8!7;@N1k$94NA`jEJaq&RC75H_+h?5^GgRHfAzwABu0*ceco;>A4W{w#cdZHI zu6?D#Tcy)o7r(M;h}Ek{ASTrZu_KpdP?}~r6ubSyA%)G`0=X)2$**QcC1fBR7#z-D z48owlup&PY%G%7)4^dl^HCOXD4y!RoJRbE@c5Jzi)cA4z zD7P7$?_^~ogyAOu400$T8jxE}RkAnIT2N!Y^TDcxFRlluOU4_STrya!p>6fdPj2;= zSa$hXY7f+0`frAXP)BEerdmYx`D*o@RMt6j$RYDd>Po=i-AiBkSIo~%GUbp9xeGi$D6|a9 z##U5SpIEIywdx7C=p{6ikdA zRIqf%W110EHZW___TxYw4>h;*v4RH4^jBtjCmZb5UMEnj^zgyPw(VG&Yp^MsHo6v3 zN-{4iu8@oIH6jX|j^hj7yQtnFpzqJWwR&9=q+P8eE?u`ua-xp9`!%DS^CH`I^bV{z zELw;@li|$L7w&ASQl;sT@S-78oDj5uBPIq+p1lMKAG7(etjk{ub5l+sZH@9DQnnXA zAWd3){<_bWZGcJhCjZ8-%u-_@c{xUQAW%QzQFCke^DNxO;Y`2qcqw%0KSQcffYhtOsmk>Ez55vekzHgqxk`!P9kjp z=6=K~nN8u?*@;tjB&V&yZcDRzaiM3u7?9Zax0S?5Cz8VKeR#%s@ZqxrRC0 z!Sg~Bo$)>~$0zfj4oh?#dtCq=#kclRo;79C{YjdG`Q1lAo}E2v9u zyJ{7XY;;pL%-vXeucYD)IJv8+2J7~&`OL&*wJ@SrxO3S>=Dave4==236y;MSf1&|*D)85N6uJ!(Ak4M(1=;{CMz~0~i4Ce=s;Bu^GyA9N+glV@k zR%{Opwu!lA9on7eu_kC3u2-Nc`K{-+xQfA#SI*fe zT744JY@~#LKr-VR&}V+l=W2{jS%>jmTBBIlTsUdfl-h#0KW|$SZn4~`2jm0D$9-k= z9Mmj*O|re@Kmx-#Tp~LyK*XF?|G^B7+8;1?9W>3p#b4%mkzyCDMkYnxI|&nLOTRz? zyWGFwgz>+1<_K)&+jIXtw9m-fh(>L5;79wZMkL#f<+TI>W+%eRB|VO(Y9BBva6j%J zbvf_XGI{<=5|D%@9_gY`%QIFbZ;Ha%tg{!=ZdCY$x{$xEMOh)^UT@})rPk8v`8 z`jEZ$(DsiS{bJClNsa5ruY9dn8;=g#N}FVJ!klJ{-HY#wdP1?p$Tsw=xm0_@(8QZ0 zKE(t%XD7&k6WpGbM{@^W!ilZUR!9P?15Vd!ipZAQhf0GNhBMd*2`>1AB3B0_X|3PS zprQq*3e}n~%tmA`JLDoy~EOjNGLO*KOn-g3r zIEm1?=1gctv7EO%K^w$q`*!#gp*hBQudJg);9R*8`!ae9tfF41sahclJeX<`_x1E%zrF=# zE(T%0OCG<{dBF+-I3^l@2@2FL>#RBqn40u>5XgK$*s*cH5X8^TwulGit`Vt~Bs%!MpCXoE}5p&^ksi>Z#r*P}8Fw;Er#JDz$^9d>Qo*bPK!~ z{a3;zXlN27sPo|zA4<9-AFCS%C57-uf>qpZ8c}|IKbZ7jMe{0nZ-MH>{Kl$(6+W77 zXM`V=7(j-{*wxZ)-$HCDrTIIE?xUE1&O|t0B+0TCm|28YvDNMYQfI{4V;TD+I$>9z zf8zE6Il?Nx+Fge#oa+baTp1lB?@dETF4IV{LD_z!*qY3d-u4I2s;%bxYGj*kNB`BL%c4m4Xbq7ya5xza zQnT9nAShB4O^SZPD6X$hMQ9oz%z!|NMG|_Jfh_GpEAF;T3-^ao; zHsU2XVVDvY5w;~$!CO)jTI6KI!St`m-Wo8Q`$VV}C>l45YnfYqOpYY&p(iCK+q(S< z`!`zf7Z_-ziV5u&mXBZvR$wHtI6APN{4WZzs_0-H|TcZfK$A;oJOfscS zl=!RJ2!e_r(T^FpdB1-^D``>|FZ=iZ1Z|$FvYHX+cAcM9;xYlQ@Sn&VaTXfa5r`c6 z9R_3HBHdw7QS^Hka+N)P(pG76+GHIk0DF9q^)eJ5YhMeINAK-6Ik#{-l|(F50nKQT zorqz&os)i#xCe=mt0=TgZh+q)!ek9t<+eX%u4!D5#R8N3i2t&4^lXweZ$h9Ld@U_r z9l-9pvJ86JHA&<7sWSef>QO{piUX%79=LaA{DNPdG&KR0+V62q@xvga~;qs zEQyyy2K>L7`ii9R*A20~BNJ}6u$AjrQP0ic zP_B~#`uq34)2{_c@jp$J!($@cLRfJf`zu2`N+tl2@FoiUEESb3i8wQWfervzD2pgp z*gYi#Y%;wTocr4sqs2-x^j7ZMm`ky2q!x;KMaq$1mXnwuijv$mq z3Cz)@tMoVU!%?sOZS~lJLl9WrVU}J{ur1PkZ`c64sw){9AKqX#M1M~JiFrb$o|@KG UUWti#UWNdQvZ}DJ(&nN61KZCx`Tzg` literal 0 HcmV?d00001 diff --git a/backoffice/img/icons/file_white.svg b/backoffice/img/icons/file_white.svg new file mode 100644 index 00000000..3e04bdaf --- /dev/null +++ b/backoffice/img/icons/file_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/folder.svg b/backoffice/img/icons/folder.svg new file mode 100644 index 00000000..f1f6e4ac --- /dev/null +++ b/backoffice/img/icons/folder.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/folder_add.svg b/backoffice/img/icons/folder_add.svg new file mode 100644 index 00000000..4f8b21e5 --- /dev/null +++ b/backoffice/img/icons/folder_add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/folder_add_white.svg b/backoffice/img/icons/folder_add_white.svg new file mode 100644 index 00000000..728bbaea --- /dev/null +++ b/backoffice/img/icons/folder_add_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/folder_white.svg b/backoffice/img/icons/folder_white.svg new file mode 100644 index 00000000..25baa239 --- /dev/null +++ b/backoffice/img/icons/folder_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/globe.svg b/backoffice/img/icons/globe.svg new file mode 100644 index 00000000..9af64dc0 --- /dev/null +++ b/backoffice/img/icons/globe.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/globe_white.svg b/backoffice/img/icons/globe_white.svg new file mode 100644 index 00000000..f0c2dea3 --- /dev/null +++ b/backoffice/img/icons/globe_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/group.svg b/backoffice/img/icons/group.svg new file mode 100644 index 00000000..a74f7ad8 --- /dev/null +++ b/backoffice/img/icons/group.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/group_white.svg b/backoffice/img/icons/group_white.svg new file mode 100644 index 00000000..72dd9db2 --- /dev/null +++ b/backoffice/img/icons/group_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/inbox.svg b/backoffice/img/icons/inbox.svg new file mode 100644 index 00000000..034e942d --- /dev/null +++ b/backoffice/img/icons/inbox.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/inbox_white.svg b/backoffice/img/icons/inbox_white.svg new file mode 100644 index 00000000..1d98ae9c --- /dev/null +++ b/backoffice/img/icons/inbox_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/library.svg b/backoffice/img/icons/library.svg new file mode 100644 index 00000000..0a917f34 --- /dev/null +++ b/backoffice/img/icons/library.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/library_white.svg b/backoffice/img/icons/library_white.svg new file mode 100644 index 00000000..3928fdd3 --- /dev/null +++ b/backoffice/img/icons/library_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/license.svg b/backoffice/img/icons/license.svg new file mode 100644 index 00000000..54f0fec7 --- /dev/null +++ b/backoffice/img/icons/license.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/license_white.svg b/backoffice/img/icons/license_white.svg new file mode 100644 index 00000000..2563f36f --- /dev/null +++ b/backoffice/img/icons/license_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/list.svg b/backoffice/img/icons/list.svg new file mode 100644 index 00000000..ea3f0e23 --- /dev/null +++ b/backoffice/img/icons/list.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/list_white.svg b/backoffice/img/icons/list_white.svg new file mode 100644 index 00000000..b57b7522 --- /dev/null +++ b/backoffice/img/icons/list_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/log.svg b/backoffice/img/icons/log.svg new file mode 100644 index 00000000..886dd3d8 --- /dev/null +++ b/backoffice/img/icons/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/log_white.svg b/backoffice/img/icons/log_white.svg new file mode 100644 index 00000000..3e443fa8 --- /dev/null +++ b/backoffice/img/icons/log_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/logout.svg b/backoffice/img/icons/logout.svg new file mode 100644 index 00000000..da64de0e --- /dev/null +++ b/backoffice/img/icons/logout.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/logout_white.svg b/backoffice/img/icons/logout_white.svg new file mode 100644 index 00000000..3feb1b78 --- /dev/null +++ b/backoffice/img/icons/logout_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/menu.svg b/backoffice/img/icons/menu.svg new file mode 100644 index 00000000..1a247ab7 --- /dev/null +++ b/backoffice/img/icons/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/menu_white.svg b/backoffice/img/icons/menu_white.svg new file mode 100644 index 00000000..222cc94b --- /dev/null +++ b/backoffice/img/icons/menu_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/newspaper.svg b/backoffice/img/icons/newspaper.svg new file mode 100644 index 00000000..420b45ad --- /dev/null +++ b/backoffice/img/icons/newspaper.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/newspaper_white.svg b/backoffice/img/icons/newspaper_white.svg new file mode 100644 index 00000000..472b3898 --- /dev/null +++ b/backoffice/img/icons/newspaper_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/numberlist.svg b/backoffice/img/icons/numberlist.svg new file mode 100644 index 00000000..33ac90cd --- /dev/null +++ b/backoffice/img/icons/numberlist.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/numberlist_white.svg b/backoffice/img/icons/numberlist_white.svg new file mode 100644 index 00000000..e98d4aaa --- /dev/null +++ b/backoffice/img/icons/numberlist_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/package.svg b/backoffice/img/icons/package.svg new file mode 100644 index 00000000..0b6a94d5 --- /dev/null +++ b/backoffice/img/icons/package.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/package_white.svg b/backoffice/img/icons/package_white.svg new file mode 100644 index 00000000..9a40a7bf --- /dev/null +++ b/backoffice/img/icons/package_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/pdf.svg b/backoffice/img/icons/pdf.svg new file mode 100644 index 00000000..43a58e1b --- /dev/null +++ b/backoffice/img/icons/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/pdf_white.svg b/backoffice/img/icons/pdf_white.svg new file mode 100644 index 00000000..94dbd956 --- /dev/null +++ b/backoffice/img/icons/pdf_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/pdfexport.svg b/backoffice/img/icons/pdfexport.svg new file mode 100644 index 00000000..49169f98 --- /dev/null +++ b/backoffice/img/icons/pdfexport.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/pdfexport_white.svg b/backoffice/img/icons/pdfexport_white.svg new file mode 100644 index 00000000..49169f98 --- /dev/null +++ b/backoffice/img/icons/pdfexport_white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/pictures.svg b/backoffice/img/icons/pictures.svg new file mode 100644 index 00000000..97bb690b --- /dev/null +++ b/backoffice/img/icons/pictures.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/pictures_white.svg b/backoffice/img/icons/pictures_white.svg new file mode 100644 index 00000000..9142d7f0 --- /dev/null +++ b/backoffice/img/icons/pictures_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/plus.svg b/backoffice/img/icons/plus.svg new file mode 100644 index 00000000..08e85b5e --- /dev/null +++ b/backoffice/img/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/plus_white.svg b/backoffice/img/icons/plus_white.svg new file mode 100644 index 00000000..22714fee --- /dev/null +++ b/backoffice/img/icons/plus_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/projects.svg b/backoffice/img/icons/projects.svg new file mode 100644 index 00000000..1e8e1e7d --- /dev/null +++ b/backoffice/img/icons/projects.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/projects_white.svg b/backoffice/img/icons/projects_white.svg new file mode 100644 index 00000000..ddbd36cf --- /dev/null +++ b/backoffice/img/icons/projects_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/remove.svg b/backoffice/img/icons/remove.svg new file mode 100644 index 00000000..e459477f --- /dev/null +++ b/backoffice/img/icons/remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/remove_white.svg b/backoffice/img/icons/remove_white.svg new file mode 100644 index 00000000..77e856e2 --- /dev/null +++ b/backoffice/img/icons/remove_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/squares.svg b/backoffice/img/icons/squares.svg new file mode 100644 index 00000000..8e084a05 --- /dev/null +++ b/backoffice/img/icons/squares.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/squares_white.svg b/backoffice/img/icons/squares_white.svg new file mode 100644 index 00000000..489f802c --- /dev/null +++ b/backoffice/img/icons/squares_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/target.svg b/backoffice/img/icons/target.svg new file mode 100644 index 00000000..72b5eb0f --- /dev/null +++ b/backoffice/img/icons/target.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/target_white.svg b/backoffice/img/icons/target_white.svg new file mode 100644 index 00000000..b02c6c44 --- /dev/null +++ b/backoffice/img/icons/target_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/upload.svg b/backoffice/img/icons/upload.svg new file mode 100644 index 00000000..20dfeb07 --- /dev/null +++ b/backoffice/img/icons/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backoffice/img/icons/upload_white.svg b/backoffice/img/icons/upload_white.svg new file mode 100644 index 00000000..367855a4 --- /dev/null +++ b/backoffice/img/icons/upload_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/backoffice/img/icons/user.svg b/backoffice/img/icons/user.svg new file mode 100644 index 00000000..37b4e3dd --- /dev/null +++ b/backoffice/img/icons/user.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/icons/user_white.svg b/backoffice/img/icons/user_white.svg new file mode 100644 index 00000000..78d94ca8 --- /dev/null +++ b/backoffice/img/icons/user_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/backoffice/img/logo_512.png b/backoffice/img/logo_512.png new file mode 100644 index 0000000000000000000000000000000000000000..b82da90b4d4f1d326c712fb74a53447b5740ec38 GIT binary patch literal 14719 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 N$V)3pl}i};|1SN3pCF4 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 literal 0 HcmV?d00001 diff --git a/backoffice/img/no-news-img.png b/backoffice/img/no-news-img.png new file mode 100644 index 0000000000000000000000000000000000000000..3411fda1b33cdbefcf0d0219fd0b1a9569ff7571 GIT binary patch literal 17922 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 CpQ{)E literal 0 HcmV?d00001 diff --git a/backoffice/img/toplogo.png b/backoffice/img/toplogo.png new file mode 100644 index 0000000000000000000000000000000000000000..4f04687d3c9e391e5bc1417d7c874e8b02e869f2 GIT binary patch literal 44729 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

fC%cXpJlmg-yCX`vf@e;982 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 W5|w5~`~17FO+`^dq2h&k`2PX<4uK&6 literal 0 HcmV?d00001 diff --git a/backoffice/img/toplogo.svg b/backoffice/img/toplogo.svg new file mode 100644 index 00000000..9e2ec89b --- /dev/null +++ b/backoffice/img/toplogo.svg @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backoffice/index.cgi b/backoffice/index.cgi new file mode 100644 index 00000000..91b7ce8f --- /dev/null +++ b/backoffice/index.cgi @@ -0,0 +1,184 @@ +#!/usr/bin/perl + +use strict; +use lib ('api/lib/perl5'); +use lib ('api/lib'); +use File::Basename qw/dirname basename/; +use Template; +# use Template::Constants qw( :debug ); +use CGI; +#use CGI::Carp qw(fatalsToBrowser); +use CGI::Cookie; +use Data::Dumper; +use JSON::PP; + +use dksconfig qw/$sitecfg/; +use session; + +my $skl = "skeleton/index.tt"; +my $cgi = new CGI(); +my $p=(); +my $cookie; +my $vars = $sitecfg; + +$vars->{filepath} = substr($cgi->url({-absolute=>1}),length($vars->{basepath})+1); +$vars->{baseurl} = $cgi->url({-base=>1}).$vars->{basepath}; + +if ($vars->{basepath} eq "/"){ + $vars->{siteurl} = $cgi->url({-base=>1}); +}else { + $vars->{siteurl} = $cgi->url({-base=>1}).dirname($vars->{basepath}); + $vars->{docroot} = $vars->{docroot}.dirname($vars->{basepath}); + #$vars->{sitepath} = dirname($vars->{basepath}); +} + + +if ($vars->{filepath} ne ""){ + $vars->{suffix} = substr($vars->{filepath},rindex($vars->{filepath},'.')); + $vars->{page} = $vars->{filepath}; + $vars->{page} =~ s/html$/tt/; +} +$vars->{abspath} = ""; + +my $sess = (); +my $se = session->new(); +$p->{sid} = $cgi->cookie($vars->{cookiename}); +if ($cgi->request_method() eq "GET"){ + my @params = $cgi->param(); + foreach my $pp (@params){ + $p->{$pp} = $cgi->param($pp); + } + +} + +if ($cgi->request_method() eq "POST"){ + + my @params = $cgi->param(); + foreach my $pp (@params){ + $p->{$pp} = $cgi->param($pp); + } + $vars->{hasposts} = $p; + if (exists($p->{'btnlogin'})){ + my $ret = $se->checklogin($p->{login},$p->{password}); + if ($ret->{sid} ne ""){ + $p->{sid} = $ret->{sid}; + $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>$p->{sid},-httponly => 1); + }else { + $vars->{message} = $ret->{message}; + $vars->{messagetype} = $ret->{messagetype}; + $vars->{page} = "message.tt"; + } + } + if (exists($p->{'btnregister'})){ + + my $ret = $se->registeruser($p); + + $vars->{message} = $ret->{message}; + $vars->{messagetype} = $ret->{messagetype}; + $vars->{page} = $ret->{page}; + } + if (exists($p->{'btnforgotpassword'})){ + my $ret = $se->passwordforgotten($p->{email}); + $vars->{message} = $ret->{message}; + $vars->{messagetype} = $ret->{messagetype}; + $vars->{page} = "message.tt"; + } + if (exists($p->{'btnvalidateemail'})){ + my $ret = $se->validateaccount($p); + $vars->{message} = $ret->{message}; + $vars->{messagetype} = $ret->{messagetype}; + $vars->{page} = "message.tt"; + } + if (exists($p->{'btnresendcode'})){ + my $ret = $se->resendcode($p->{email}); + $vars->{message} = $ret->{message}; + $vars->{messagetype} = $ret->{messagetype}; + $vars->{page} = "message.tt"; + } + + if (exists($p->{logout})){ + $se->deletesession($p->{sid}); + $p->{sid} = ""; + $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>"",-httponly => 1); + } + # if (exists($p->{btndeleteprofile})){ + # my $ret = $se->deleteprofile($p->{deleteprofile}); + # $vars->{message} = $ret->{message}; + # $vars->{messagetype} = $ret->{messagetype}; + # $vars->{page} = "message.tt"; + # if (exists($ret->{sid})){ + # $p->{sid} = ""; + # } + # $cookie = CGI::Cookie->new(-name=>$vars->{cookiename},-value=>"",-httponly => 1); + # } +} + +if ($p->{sid} ne ""){ + $sess = $se->getsession($p->{sid}); +} + + +#$vars->{beforex} = $vars->{page}; +if (!exists($sess->{id}) || (!exists($p->{sid})) || $p->{sid} eq ""){ + $skl = "skeleton/login.tt"; +} +# if ($vars->{page} eq "deleteprofile.tt") { +# $skl = "skeleton/login.tt"; +# } +# my ($appname) = $ENV{REQUEST_URI} =~ /.*\/module\/(\w+)\/.*/; +if ($p->{sid} ne ""){ + $vars->{session} = $sess; +} +#SESSION - End +# #BEGIN - Browser Blocking +# if (($ENV{HTTP_USER_AGENT} !~ /Chrome/) || ($ENV{HTTP_USER_AGENT} =~ /Edge/) || ($ENV{HTTP_USER_AGENT} =~ /Firefox/)){ +# $skl = "skeleton/browser.tt"; +# } +# #END - Browser Blocking +my $ctype = 'text/html'; +if ($vars->{suffix} eq ".js"){ + $ctype= "text/javascript"; +} elsif ($vars->{suffix} eq ".css"){ + $ctype = "text/css"; +} +print $cgi->header(-type=>$ctype, -charset=>"utf-8",-cookie => $cookie); +# print dirname($ENV{"SCRIPT_FILENAME"}); + +my $template = Template->new({INCLUDE_PATH => [dirname($ENV{"SCRIPT_FILENAME"}).'/tmpl']}); +#} + +my @lv = split(/\//,$vars->{filepath}); +my $absnum = scalar(@lv)-1; + +for (my $i=0;$i<$absnum;$i++){ + $vars->{abspath} .= "../"; +} + +# $vars->{page} = $vars->{page}; +if ($vars->{page} =~ /^module/){ + $vars->{module} = basename(dirname($vars->{page})); +} +$vars->{pagename} = basename($vars->{page}); +$vars->{pagename} =~ s/\.tt$//; +# my ($appname) = $ENV{REQUEST_URI} =~ /.*\/apps\/(\w+)\/.*/; +#$vars->{requri} = $ENV{REQUEST_URI}; + +#BEGIN - iFrame - Modules + +if ($skl ne "skeleton/login.tt" && $vars->{page} =~ /^module/){ + $skl = "skeleton/module.tt"; + if ($vars->{page} !~ /\.tt$/) { + $skl = "skeleton/module_file.tt"; + } + $vars->{params}= $p; +} + +#END - iFrame - Modules + +$template->process($skl,$vars) || die "Template process failed: ", $template->error(), "\n"; + +# if ($vars->{page} =~ /\.tt/){ +# print '

'.Dumper($p)."
";
+# } 
+
+
diff --git a/backoffice/js/.DS_Store b/backoffice/js/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6
GIT binary patch
literal 6148
zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3
zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ
zLs35+`xjp>T0 0) {
+            flds[field.getAttribute("name")] = vals;
+          } else {
+            flds[field.getAttribute("name")] = "";
+          }
+          
+        } else {
+          flds[field.getAttribute("name")] = field.value;
+        }
+        
+      }
+      
+    }
+  }
+  return flds;
+}
+
+function cleanform(frmname){
+  //console.log("Clean Form: " + frmname);
+  var frm = document.getElementById("frm_" + frmname);
+  
+  for (var f in frm){
+    //console.log(frm[f].id);
+    if (frm[f] && frm[f].id){
+    if (frm[f].tagName == 'INPUT'){
+      //console.log("is INPUT" + frm[f].id + " type:" + frm[f].type + " class:" + frm[f].classList);
+      if (frm[f].type == "checkbox"){
+        frm[f].checked = false;
+      } else if (frm[f].classList.contains("datefield")){
+          if (frm[f]._flatpickr){ frm[f]._flatpickr.clear(); }
+      } else if (frm[f].classList.contains("choices__input")){
+        if (choice[frmname][frm[f].id]){
+          choice[frmname][frm[f].id].removeActiveItems();
+        }
+      } else {
+        frm[f].value = "";
+      }
+    }
+    if (frm[f].tagName == 'SELECT'){
+      //console.log("is INPUT" + frm[f].id + " multiple:" + frm[f].multiple + " class:" + frm[f].classList);
+      if (frm[f].multiple == true){
+        if (frm[f].classList.contains("choices__input")){
+          choice[frmname][frm[f].id].removeActiveItems();
+        }
+      } else {
+        frm[f].value = "";
+      }
+      
+    }
+    if (frm[f].tagName == 'TEXTAREA'){
+      //console.log("is INPUT" + frm[f].id +  " class:" + frm[f].classList);
+      if (frm[f].classList.contains("richeditarea")){
+        tinymce.get(frm[f].id).setContent("");
+      } else {
+        frm[f].innerHTML = "";
+      } 
+    }
+  }
+  }
+  return false;
+}
+
+function fillformbydataclass(dataclass,data,readonly = false){
+  //console.log(data);
+  var frm = document.querySelectorAll('.data_'+ dataclass);
+  if (data){
+    for (var f in frm){
+      //console.log(frm[f]);
+      if (data[frm[f].id]){
+        //console.log(frm[f].id + " => " + data[frm[f].id]);
+        if (readonly){ frm[f].readonly = true;}
+        if (frm[f].tagName == 'INPUT'){
+          if (frm[f].type == "checkbox"){
+            if (data[frm[f].id] == "1"){
+              frm[f].checked = true;
+            } else {
+              frm[f].checked = false;
+            }
+          } else if (frm[f].classList.contains("datefield")){ 
+            frm[f]._flatpickr.setDate(data[frm[f].id]);
+          } else if (frm[f].classList.contains("choices__input")){  
+            if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')){
+              choice[dataclass][frm[f].id].setValue(JSON.parse(data[frm[f].id])); 
+            }
+          } else {
+            frm[f].value=data[frm[f].id];
+          }
+        }
+        if (frm[f].tagName == 'SELECT'){
+          if (frm[f].classList.contains("choices__input")){
+            if (frm[f].multiple == true){
+              //console.log(data[frm[f].id]);
+              choice[dataclass][frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
+            }else {
+              choice[dataclass][frm[f].id].setChoiceByValue(data[frm[f].id]);
+            }
+          } else {
+            frm[f].value=data[frm[f].id];
+          }
+          
+        }
+      }
+      
+    }
+  }
+}
+
+function fillselectlist(obj,data,vidcol,vvalcol){
+  var sellist = [];
+  obj.clearStore();
+  if (data){
+    for (var i in data){
+      sellist.push({value:data[i][vidcol],label:data[i][vvalcol]});
+    }
+  }
+  obj.setChoices(sellist, 'value', 'label', true);
+  return false;
+}
\ No newline at end of file
diff --git a/backoffice/js/module_global.js b/backoffice/js/module_global.js
new file mode 100644
index 00000000..ddc58c03
--- /dev/null
+++ b/backoffice/js/module_global.js
@@ -0,0 +1,37 @@
+document.addEventListener("DOMContentLoaded", function() {
+  //console.log( "Iframe "+ location.pathname.substring(location.pathname.lastIndexOf("/")) +" ready!" );
+  initpage();
+});
+
+
+function table_setbounds(tblmodule){
+  // var cols =  $("#tbl_"+tblmodule+" > tbody > tr:first-child").children();
+  //   var colnum = cols.length -1;
+  //   console.log("childnum:" + colnum);
+  //   for (var i=1;i<=colnum;i++){
+  //     wx = $("#tbl_"+tblmodule+" > tbody > tr:first-child > td:nth-child("+ i +")").width();
+  //     // wx = wx +3;
+  //     $("#tbl_"+tblmodule+"_head > thead > tr > th:nth-child("+ i +")").width(wx);
+  //   }
+}
+
+function sectionload(sectionid,callback){
+  var sec = document.querySelectorAll('section');
+  for (var i in sec){
+    sec[i].style.display = 'none';
+  }
+  if (callback){
+    callback;
+  }
+  document.getElementById(sectionid).style.display = 'block';
+}
+
+
+function emptyform(id){
+  // $("#" + id + "> input,select,textarea").each(
+    // function(){
+      // console.log("Set Empty Value On" + $(this).id);
+    // }
+
+  // );
+}
\ No newline at end of file
diff --git a/backoffice/js/request.js b/backoffice/js/request.js
new file mode 100644
index 00000000..58ae6aad
--- /dev/null
+++ b/backoffice/js/request.js
@@ -0,0 +1,118 @@
+var api = location.origin + location.pathname.substring(0,location.pathname.lastIndexOf('/')) + '/api/';
+if (location.pathname.indexOf('module') > 0){
+  api = location.origin + location.pathname.substring(0, location.pathname.indexOf('module')) + 'api/';
+}
+// console.log(api);
+var req = {
+    multipartform: function(url,frmdata,callback=null){
+    var ret = null;
+    var rdata = null;
+    var async = false;
+    if (callback){
+      async=true;
+    }
+    
+    var request = new XMLHttpRequest();
+    
+    //console.log(frmdata);
+    var sendurl = api + url;
+    //console.log("sending URL: " + "POST" + " => " +sendurl);
+    request.open("POST", sendurl, true);
+    request.onload = function(){
+      if (request.status >= 200 && request.status <= 400){
+        console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
+        if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){
+          var xparse = JSON.parse(request.responseText);
+          ret = xparse.result;
+          console.log(ret);
+        }
+        else {
+          ret = request.responseText;
+        }
+        if (async){
+          callback(ret);
+        }
+      } else {
+        alert("ServerERROR:" + request.status + "\n" + request.responseText);
+      }
+    };
+    request.onerror = function(){
+      alert("Connection ERROR!\n" + url);
+    };
+  
+      request.setRequestHeader('Content-Type','multipart/form-data; charset=UTF-8');
+      request.send(frmdata);
+    return ret;
+  },
+  reqdata: function(method,url,data,callback=null){
+    
+    var ret = null;
+    var rdata = null;
+    var async = false;
+    if (callback){
+      async=true;
+    }
+    
+    var request = new XMLHttpRequest();
+    if (typeof data == 'object'){
+      var xdata = [];
+      for (var i in data){
+         var value = '';
+         if (typeof(data[i]) == 'object'){
+           value = encodeURIComponent(JSON.stringify(data[i]));
+         } else {
+           value = encodeURIComponent(data[i]);
+         }
+         xdata.push(i + "=" + value);
+      }
+      rdata = xdata.join("&");
+    }else {
+      rdata = data;
+    }
+    //console.log("Data to send: " + decodeURIComponent(rdata));
+    var sendurl = api + url;
+    if (method.toUpperCase() == 'GET'){
+      sendurl = sendurl + '?' + rdata;
+    }
+    //console.log("sending URL: " + method + " => " +sendurl + '?' + rdata);
+    request.open(method.toUpperCase(), sendurl, true);
+    request.onload = function(){
+      if (request.status >= 200 && request.status <= 400){
+        // console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
+        if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){
+          if (request.responseText){
+            var xparse = JSON.parse(request.responseText);
+            ret = xparse.result;
+          } else {
+            ret = null;  
+          }
+          
+        }else {
+          ret = request.responseText;
+        }
+        callback(ret);
+      } else {
+        //console.log("ServerERROR: " + request.status + "\n" + request.responseText);
+        alert("ServerERROR:" + request.status + "\n" + request.responseText);
+      }
+    };
+    request.onerror = function(){
+      //console.log("ERROR: connection ERROR\n" + url);
+      alert("Connection ERROR!\n" + url);
+    };
+    if (method.toUpperCase() == 'POST'){
+      request.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
+      request.send(rdata);
+    } else {
+      //request.withCredentials = true;
+      request.send();
+    }
+    return ret;
+  },
+  asyncNoEvent: function(data){
+    console.log("query done");
+    console.log(data);
+    console.log("done");
+  }
+  
+}
\ No newline at end of file
diff --git a/backoffice/tmpl/block/cgu.tt b/backoffice/tmpl/block/cgu.tt
new file mode 100644
index 00000000..51564c14
--- /dev/null
+++ b/backoffice/tmpl/block/cgu.tt
@@ -0,0 +1,216 @@
+
+

+1 : Objet

+

+Les présentes « conditions générales d'utilisation » +ont pour objet l'encadrement juridique des modalités de mise à +disposition des services du site solana-architecture.lu +et leur utilisation par « l'Utilisateur ».

+

+Les conditions générales d'utilisation doivent être acceptées par +tout Utilisateur souhaitant accéder au site. Elles constituent le +contrat entre le site et l'Utilisateur. L'accès au site par +l'Utilisateur signifie son acceptation des présentes conditions +générales d'utilisation.

+

+ En cas de non-acceptation des conditions générales d'utilisation + stipulées dans le présent contrat, l'Utilisateur se doit de + renoncer à l'accès des services proposés par le site.

+

Solana Architecture s.à r.l. se réserve le droit de modifier unilatéralement et + à tout moment le contenu des présentes conditions générales + d'utilisation.

+

+2 : Mentions légales

+

+L'édition du site solana-architecture.lu est +assurée par l'entreprise Solana Architecture s.à r.l. dont le +siège social est situé à 61, rue des Trévires - L- Luxembourg-Bonnevoie.

+

+Responsable de la publication Web est Martin Solana (Gérant).

+ + +

3 : +Définitions

+

+La présente clause a pour objet de définir les différents termes +essentiels du contrat :

+
  • + Utilisateur : ce terme désigne toute personne qui utilise le + site ou l'un des services proposés par le site.

    +
  • Contenu + utilisateur : ce sont les données transmises par l'Utilisateur + au sein du site.

    +
  • Membre : + l'Utilisateur qui est employé d'une entreprise qui aimerais transferer des soumissions proposé par Solana Architecture s.à r.l. et qui peut s'identifié au site.

    +
  • Identifiant + et mot de passe : c'est l'ensemble des informations nécessaires + à l'identification d'un Utilisateur sur le site. L'identifiant et + le mot de passe permettent à l'Utilisateur d'accéder à des + services réservés aux membres du site. Le mot de passe est + confidentiel.

    +

4 : +accès aux services

+

+Le site permet à l'Utilisateur un accès gratuit aux services +suivants :

+
  • + Modifier ses données personnelles est les données du club;

    +
  • Transférer et télécharger les documents nécessaires pour faire des soumissions;

    +
  • consulter les information et documents utiles et nécessaires pour faire des soumissions;

    +

+Le site est accessible gratuitement en tout lieu à tout Utilisateur +ayant un accès à Internet. Tous les frais supportés par +l'Utilisateur pour accéder au service (matériel informatique, +logiciels, connexion Internet, etc.) sont à sa charge.

+

+Selon le cas :

+

+L'Utilisateur non membre n'a pas accès aux services réservés aux +membres. Pour cela, il doit s'identifier à l'aide de son identifiant +et de son mot de passe.

+ +

+Le site met en œuvre tous les moyens mis à sa disposition pour +assurer un accès de qualité à ses services. L'obligation étant de +moyens, le site ne s'engage pas à atteindre ce résultat.

+

+Tout événement dû à un cas de force majeure ayant pour +conséquence un dysfonctionnement du réseau ou du serveur n'engage +pas la responsabilité de solana-architecture.lu.

+

+L'accès aux services du site peut à tout moment faire l'objet d'une +interruption, d'une suspension, d'une modification sans préavis pour +une maintenance ou pour tout autre cas. L'Utilisateur s'oblige à ne +réclamer aucune indemnisation suite à l'interruption, à la +suspension ou à la modification du présent contrat.

+

+L'Utilisateur a la possibilité de contacter le site par messagerie +électronique à l'adresse info [ at ] solana-architecture.lu. +

+

5 : +Propriété intellectuelle

+

+Les marques, logos, signes et tout autre contenu du site font l'objet +d'une protection par le Code de la propriété intellectuelle et plus +particulièrement par le droit d'auteur.

+

+L'Utilisateur sollicite l'autorisation préalable du site pour toute +reproduction, publication, copie des différents contenus.

+

+L'Utilisateur s'engage à une utilisation des contenus du site dans +un cadre strictement privé. Une utilisation des contenus à des fins +commerciales est strictement interdite.

+

+Tout contenu mis en ligne par l'Utilisateur est de sa seule +responsabilité. L'Utilisateur s'engage à ne pas mettre en ligne de +contenus pouvant porter atteinte aux intérêts de tierces personnes. +Tout recours en justice engagé par un tiers lésé contre le site +sera pris en charge par l'Utilisateur. +

+

+Le contenu de l'Utilisateur peut être à tout moment et pour +n'importe quelle raison supprimé ou modifié par le site. +L'Utilisateur ne reçoit aucune justification et notification +préalablement à la suppression ou à la modification du contenu +Utilisateur.

+

6 : +Données personnelles

+

+Les informations demandées à l'inscription au site sont +nécessaires et obligatoires pour la création du compte de +l'Utilisateur. En particulier, l'adresse électronique pourra être +utilisée par le site pour l'administration, la gestion et +l'animation du service.

+

+Le site assure à l'Utilisateur une collecte et un traitement +d'informations personnelles dans le respect de la vie privée +conformément à la loi européen des protection de données relative à +l'informatique, aux fichiers et aux libertés.

+

+L'Utilisateur dispose d'un droit d'accès, de rectification, de +suppression et d'opposition de ses données personnelles. +L'Utilisateur exerce ce droit via :

+
  • + Formulaire mis à disposition;

    + +
+

7 : +Responsabilité et force majeure

+

+Les sources des informations diffusées sur le site sont réputées +fiables. Toutefois, le site se réserve la faculté d'une +non-garantie de la fiabilité des sources. Les informations données +sur le site le sont à titre purement informatif. Ainsi, +l'Utilisateur assume seul l'entière responsabilité de l'utilisation +des informations et contenus du présent site.

+

+L'Utilisateur s'assure de garder son mot de passe secret. Toute +divulgation du mot de passe, quelle que soit sa forme, est interdite.

+

+L'Utilisateur assume les risques liés à l'utilisation de son +identifiant et mot de passe. Le site décline toute responsabilité.

+

+Tout usage du service par l'Utilisateur ayant directement ou +indirectement pour conséquence des dommages doit faire l'objet d'une +indemnisation au profit du site.

+

+Une garantie optimale de la sécurité et de la confidentialité des +données transmises n'est pas assurée par le site. Toutefois, le +site s'engage à mettre en œuvre tous les moyens nécessaires afin +de garantir au mieux la sécurité et la confidentialité des +données.

+

+La responsabilité du site ne peut être engagée en cas de force +majeure ou du fait imprévisible et insurmontable d'un tiers.

+

8 : +Liens hypertextes

+

+De nombreux liens hypertextes sortants sont présents sur le site, +cependant les pages web où mènent ces liens n'engagent en rien la +responsabilité de solana-architecture.lu qui n'a +pas le contrôle de ces liens.

+

+L'Utilisateur s'interdit donc à engager la responsabilité du site +concernant le contenu et les ressources relatives à ces liens +hypertextes sortants.

+

9 : +Évolution du contrat

+

+Le site se réserve à tout moment le droit de modifier les clauses +stipulées dans le présent contrat.

+

10 : +Durée

+

+La durée du présent contrat est indéterminée. Le contrat produit +ses effets à l'égard de l'Utilisateur à compter de l'utilisation +du service.

+

11 : +Droit applicable et juridiction compétente

+

+La législation luxembourgeoise s'applique au présent contrat. En cas +d'absence de résolution amiable d'un litige né entre les parties, +seuls les tribunaux luxembourgeoises +sont compétents.

+ +

12 : +Publication par l'Utilisateur

+

+Le site permet aux membres de télécharger des fichiers.

+

+Dans ses publications, le membre s'engage à respecter les règles +de la Netiquette et les règles de droit en vigueur.

+

+Le site exerce une modération sur les publications et se réserve le droit de +refuser leur mise en ligne, sans avoir à s'en justifier auprès du +membre.

+

+Le membre reste titulaire de l'intégralité de ses droits de +propriété intellectuelle. Mais en publiant une publication sur le +site, il cède à l' entreprise SOlana Architecture s.à r.l. le droit non exclusif et +gratuit de représenter, reproduire, adapter, modifier, diffuser et +distribuer sa publication, directement ou par un tiers autorisé, +dans le monde entier, sur tout support (numérique ou physique), pour +la durée de la propriété intellectuelle. Le Membre cède notamment +le droit d'utiliser sa publication sur internet et sur les réseaux +

+ \ No newline at end of file diff --git a/backoffice/tmpl/block/dlguploadfile.tt b/backoffice/tmpl/block/dlguploadfile.tt new file mode 100644 index 00000000..1126d3e1 --- /dev/null +++ b/backoffice/tmpl/block/dlguploadfile.tt @@ -0,0 +1,91 @@ +
+ +
+
+ × +

Fichier eroplueden

+
+
+
+ [% fieldhidden("table","upload",'','') %] + [% fieldhidden("row_id","upload","ident",'') %] + [% fieldhidden("filetype","upload",'','') %] + [% fieldfile("file","upload","Fichier auswielen",'','','') %] +
+
+
+ + [% formsavefilebutton('uploadfile','eroplueden','') %] +
+
+
+ \ No newline at end of file diff --git a/backoffice/tmpl/block/head.tt b/backoffice/tmpl/block/head.tt new file mode 100644 index 00000000..32d38589 --- /dev/null +++ b/backoffice/tmpl/block/head.tt @@ -0,0 +1,30 @@ + + + + + [% sitename %] - [% pagename %] + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backoffice/tmpl/block/snackbar.tt b/backoffice/tmpl/block/snackbar.tt new file mode 100644 index 00000000..464a1624 --- /dev/null +++ b/backoffice/tmpl/block/snackbar.tt @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/backoffice/tmpl/block/toolbars.tt b/backoffice/tmpl/block/toolbars.tt new file mode 100644 index 00000000..9c0073a2 --- /dev/null +++ b/backoffice/tmpl/block/toolbars.tt @@ -0,0 +1,9 @@ +[% MACRO tabletoolbar(ident) BLOCK -%] + +
+ + + + +
+[% END -%] \ No newline at end of file diff --git a/backoffice/tmpl/macro/fields.tt b/backoffice/tmpl/macro/fields.tt new file mode 100644 index 00000000..cb3d262f --- /dev/null +++ b/backoffice/tmpl/macro/fields.tt @@ -0,0 +1,118 @@ +[% MACRO fieldhidden(column,table,ident,value) BLOCK -%] + +[% END -%] +[% MACRO fieldeditbox(column,table,title,size,state,value,plhold) BLOCK -%] +
+ + 0 %][% state %][% END %]/> + +
+[% END -%] +[% MACRO fieldfile(column,table,title,size,state,value) BLOCK -%] +
+ + 0 %][% state %][% END %]/> + +
+[% END -%] +[% MACRO fieldpasswordbox(column,table,title,size,state,value) BLOCK -%] +
+ + 0 %][% state %][% END %]/> + +
+[% END -%] +[% MACRO fieldtagbox(column,table,title,size,state,value) BLOCK -%] +
+ + 0 %][% state %][% END %]/> + +
+[% END -%] +[% MACRO fieldcheckbox(column,table,title,size,state,value) BLOCK -%] +
+
+ 0 %][% state %][% END %]> + +
+[% END -%] + +[% MACRO fieldemailbox(column,table,title,size,state,value) BLOCK -%] +
+ + 0 %][% state %][% END %]/> +
+[% END -%] + +[% MACRO fieldselectbox(column,table,title,size,state,value) BLOCK -%] + [% IF state.length > 0 %] + [% fieldeditbox(column,table,title,size,state,value) %] + [% ELSE %] +
+ + + +
+ [% END %] +[% END -%] +[% MACRO fieldmultiselectbox(column,table,title,size,state,value) BLOCK -%] + [% IF state.length > 0 %] + [% fieldeditbox(column,table,title,size,state,value) %] + [% ELSE %] +
+ + + +
+ [% END %] +[% END -%] +[% MACRO fielddatebox(column,table,title,size,state,value) BLOCK -%] +
+ + 0 %][% state %][% END %]]/> + +
+[% END -%] +[% MACRO fieldtextarea(column,table,title,size,state,height,value) BLOCK -%] +
+ + +
+[% END -%] +[% MACRO fieldrichtextarea(column,table,title,size,state,height,value) BLOCK -%] +
+ + +
+[% END -%] + +[% MACRO formsavebutton(formname,btnname) BLOCK -%] +
+ +
+[% END -%] +[% MACRO formsavetextfilebutton(formname,btnname) BLOCK -%] +
+ +
+[% END -%] +[% MACRO formdlgsavebutton(formname,btnname,clbk) BLOCK -%] + +[% END -%] +[% MACRO formsavefilebutton(formname,btnname,container) BLOCK -%] +[% IF container.length > 0 %] +
+ [% END %] + +[% IF container.length > 0 %] +
+[% END %] +[% END -%] + + diff --git a/backoffice/tmpl/module/companies/index.js b/backoffice/tmpl/module/companies/index.js new file mode 100644 index 00000000..6bfb3538 --- /dev/null +++ b/backoffice/tmpl/module/companies/index.js @@ -0,0 +1,164 @@ +var tbl = null; +[% sid = session.id %] +[% IF (session.usergroups.search('admin') != 1) %] +[% qcompany = dksdb.query("select id_company from vw_userlist where id=$sid;") %] +[% company = qcompany.get_all() %] +var idcompany = "[% company.0.id_company %]"; +[% ELSE %] +var idcompany=null; +[% END %] +var choice = {"submissionaccess":{"projects":null,"cdm":null,"cdm_requests":null}}; +var tab_id_projects = null; +var tab_id_cdms = null; +var tab_id_cdm_requests = null; +function initpage(){ + [% IF (session.usergroups.search('admin') == 1) %] + // choice["submissionaccess"]["projects"] = new Choices('#projects',{ + // searchEnabled: false, + // itemSelectText: 'sélectionner...', + // removeItemButton: true, + // choices : [] + // }); + + // choice["submissionaccess"]["cdm"] = new Choices('#cdm',{ + // searchEnabled: false, + // itemSelectText: 'sélectionner...', + // removeItemButton: true, + // choices : [] + // }); + // [% END %] + // choice["submissionaccess"]["cdm_requests"] = new Choices('#cdm_requests',{ + // searchEnabled: false, + // itemSelectText: 'sélectionner...', + // removeItemButton: true, + // choices : [] + // }); + getprojects(); + getcdms(); + [% IF (session.usergroups.search('admin') == 1) %] + tbl = new Tabulator("#tbl_companies", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"entreprise", field:"company",headerFilter:"input"}, + {title:"address", field:"address",headerFilter:"input"}, + {title:"nbr. utilsateurs",field:"num_users"}, + {title:"pointeuese",field:"num_users"}, + ]}); + gettbldata(); + + [% ELSE %] + getcompanydata(idcompany); + [% END %] + + +} +[% IF (session.usergroups.search('admin') == 1) %] +function gettbldata(){ + req.reqdata("POST","db.cgi",{"get":"companylist"},loadtbldata); + +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +function edit(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + var uid = udata[0].id; + getcompanydata(uid); + document.getElementById("pnl_table").style.display = 'none'; + document.getElementById("pnl_company").style.display = 'block'; + } + +} + +function add(){ + cleanform('companies'); + viewtable(); +} + +function remove(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + if (confirm("Êtes vous sûre de supprimer l'entreprise selectionné?")){ + req.reqdata("POST","db.cgi",{"del":"1","ident_companies_id":udata[0].id},gettbldata); + } + } + +} +[% END %] + + +function getcompanydata(id){ + req.reqdata("POST","db.cgi",{"get":"companydata","filter":"id=" + id},fillformcompany); + req.reqdata("POST","db.cgi",{"get":"submissionaccess","filter":"id_company=" + id},fillsubmissionaccess); +} + + +function fillsubmissionaccess(data){ + console.log("FILL Submission Access!"); + console.log(data); + cleanform('submissionaccess'); + if (data && data.sqldata){ + //var frm = document.querySelectorAll('.data_submissionaccess'); + fillformbydataclass('submissionaccess',data.sqldata[0],false); + + } +} + +function fillformcompany(data){ + // console.log(data); + cleanform('companies'); + var isreadonly = false; + [% IF (session.usergroups.search('admin') != 1) %] + if (data.sqldata[0]["validated"] == 1){isreadonly = true;} + [% END %] + if (data && data.sqldata){ + fillformbydataclass('companies',data.sqldata[0],isreadonly); + } + if (isreadonly == true){ + document.getElementById("btnsave_companies").style.display = 'none'; + } +} + +function viewtable(){ + gettbldata(); + document.getElementById("pnl_table").style.display = 'block'; + document.getElementById("pnl_company").style.display = 'none'; +} + +[% IF (session.usergroups.search('admin') == 1) %] +function getprojects(){ + req.reqdata("POST","db.cgi",{"get":"projectlist"},fillprojectlist); +} + +function fillprojectlist(data){ + console.log("fill projectlist"); + fillselectlist(choice["submissionaccess"]["projects"],data.sqldata,'id','project'); + return false; +} + +[% END %] + +function getcdms(){ + req.reqdata("POST","db.cgi",{"get":"cdmlist"},fillcdmlist); +} + +function fillcdmlist(data){ + console.log("fill cdmlist"); + fillselectlist(choice["submissionaccess"]["cdm_requests"],data.sqldata,'id','cdm'); + //var cdmlist = []; + [% IF (session.usergroups.search('admin') == 1) %] + fillselectlist(choice["submissionaccess"]["cdm"],data.sqldata,'id','cdm'); + //choice["submissionaccess"]["cdm"].clearStore(); + [% END %] + + return false; +} \ No newline at end of file diff --git a/backoffice/tmpl/module/companies/index.tt b/backoffice/tmpl/module/companies/index.tt new file mode 100644 index 00000000..f27ad264 --- /dev/null +++ b/backoffice/tmpl/module/companies/index.tt @@ -0,0 +1,86 @@ +[% PROCESS macro/fields.tt %] +[% IF (session.usergroups.search('admin') == 1) %] +
+
+ + + + + + + +
+
+
+
+
+[% END %] +
+ +
+
+
+

données de l'entreprise

+
+
+ + [% fieldhidden('id','companies','ident') %] +
+ [% fieldeditbox('company','companies','Entreprise','w3-half','','','') %] + [% IF (session.usergroups.search('admin') == 1) %] + [% fieldcheckbox('validated','companies','validé','w3-half','','','') %] + [% END %] + [% fieldeditbox('address','companies','Adresse','','','','') %] + [% fieldeditbox('zip','companies','CP','w3-quarter','','','') %] + [% fieldeditbox('city','companies','Ville','w3-half','','','') %] + [% fieldeditbox('country','companies','Pays','w3-quarter','','','Luxembourg') %] +
+
+ [% fieldeditbox("tradetype",'companies',"Raison sociale",'w3-quarter','','','s.à r.l.') %] + [% fieldselectbox("site","companies","Siège",'w3-quarter','','') %] + [% fieldeditbox("nace",'companies',"Type d'entreprise",'w3-half','','','construction') %] +
+
+ [% fieldeditbox('autorisation','companies',"Auth. d'établ.",'w3-third','','','') %] + [% fieldeditbox('comregister','companies',"Reg. de Com.",'w3-third','','','B123456') %] + [% fieldeditbox('vatnumber','companies',"TVA Int.",'w3-third','','','LU12341234') %] + +
+
+ [% fieldeditbox('insurance_number','companies',"No. Assurance",'w3-half','','','') %] + [% fieldeditbox('insurance','companies',"Assureur",'w3-third','','','') %] +
+
+ + [% formsavebutton('companies','sauvegarder') %] +
+
+
+ +
+
+

accès soumissions

+
+
+ + [% fieldhidden('id','submissionaccess','ident') %] + [% fieldhidden('id_company','submissionaccess','') %] + [% %] +
+ [% dataeditable = "" %] + [% IF (session.usergroups.search('admin') != 1) %] + [% dataeditable = "readonly" %] + [% END %] + [% fieldmultiselectbox('projects','submissionaccess','Accès au projets','',dataeditable,'') %] + [% fieldmultiselectbox('cdm','submissionaccess','Accès au corps de métiers','',dataeditable,'') %] + [% fieldmultiselectbox('cdm_requests','submissionaccess',"Demande d'accès au corps de métiers",'','','') %] +
+ + [% formsavebutton('submissionaccess','sauvegarder') %] +
+ +
+
+
+
\ No newline at end of file diff --git a/backoffice/tmpl/module/dashboard/index.js b/backoffice/tmpl/module/dashboard/index.js new file mode 100644 index 00000000..12e871f9 --- /dev/null +++ b/backoffice/tmpl/module/dashboard/index.js @@ -0,0 +1,3 @@ +function initpage(){ + +} \ No newline at end of file diff --git a/backoffice/tmpl/module/dashboard/index.tt b/backoffice/tmpl/module/dashboard/index.tt new file mode 100644 index 00000000..a0c53771 --- /dev/null +++ b/backoffice/tmpl/module/dashboard/index.tt @@ -0,0 +1,19 @@ +[% appaccess = dksdb.prepare("select replace(ap.icon,'.svg','_white.svg') as icon,ap.app,ap.name,ug.usergroup from useringroups uig join apps ap on (uig.id_group=ap.id_usergroup) join usergroups ug on (uig.id_group=ug.id) where uig.id_user=? and ap.app != 'dashboard' order by ap.sort; ") %] + +
+
+
+
+
+
+ + [% FOREACH ap = appaccess.execute(session.id) %] +
+ +
+ [% END %] +
+
+
diff --git a/backoffice/tmpl/module/profile/dlgpassword.tt b/backoffice/tmpl/module/profile/dlgpassword.tt new file mode 100644 index 00000000..7c3d6e3c --- /dev/null +++ b/backoffice/tmpl/module/profile/dlgpassword.tt @@ -0,0 +1,81 @@ +
+ +
+
+ × +

changement mot de passe

+
+
+
+
+ Votre mot de passe doit avoir: +
    +
  • au moins 10 charatères
  • +
  • des lettres majuscule et minuscules
  • +
  • au moins 1 nombre
  • +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ \ No newline at end of file diff --git a/backoffice/tmpl/module/profile/dlgusername.tt b/backoffice/tmpl/module/profile/dlgusername.tt new file mode 100644 index 00000000..4879285b --- /dev/null +++ b/backoffice/tmpl/module/profile/dlgusername.tt @@ -0,0 +1,90 @@ + +
+
+
+ × +

Changement de l'email resp. login

+
+
+
+
+ [% fieldeditbox('newuseremail','onlydisplay','Nei E-Mail-Address','','','') %] +
+ +
+
+ + + +
+
+
+ \ No newline at end of file diff --git a/backoffice/tmpl/module/profile/index.js b/backoffice/tmpl/module/profile/index.js new file mode 100644 index 00000000..63fb0fa9 --- /dev/null +++ b/backoffice/tmpl/module/profile/index.js @@ -0,0 +1,64 @@ +var iduser="[% session.id %]"; + +function initpage(){ + flatpickr(".datefield",{altInput: true, + altFormat: "d.m.Y", + dateFormat: "Y-m-d", + "locale": "fr", + }); + loadmemberdata(iduser); + loadaccountdata(iduser); +} + +function loadaccountdata(id){ + req.reqdata("POST","db.cgi",{"get":"userdata","filter":"id="+id},fillformaccount); +} +function loadmemberdata(id){ + req.reqdata("POST","db.cgi",{"get":"memberdata","filter":"id_user="+id},fillformmember); +} +function fillformaccount(data){ + if (data && data.sqldata){ + var frm = document.querySelectorAll('.data_users'); + for (var f in frm){ + if (data.sqldata[0][frm[f].id]){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT')){ + if (frm[f].classList.contains("datefield")){ + frm[f]._flatpickr.setDate(data.sqldata[0][frm[f].id]); + } else { + frm[f].value=data.sqldata[0][frm[f].id]; + } + } + } + } + } +} + + +function fillformmember(data){ + // console.log(data); + if (data && data.sqldata){ + var frm = document.querySelectorAll('.data_members'); + for (var f in frm){ + // console.log(frm[f].tagName); + // console.log(frm[f].id); + if (data.sqldata[0][frm[f].id]){ + //console.log(frm[f].tagName + " " + frm[f].type + " " + frm[f].id); + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT')){ + if (frm[f].classList.contains("datefield")){ + frm[f]._flatpickr.setDate(data.sqldata[0][frm[f].id]); + } else { + frm[f].value=data.sqldata[0][frm[f].id]; + } + + } + } + + } + // if (document.getElementById("profile_photo").value != ""){ + // document.getElementById("img_profile_photo").src = '../../data/members/' + document.getElementById("profile_photo").value; + // } + // console.log(frm); + } +} + + diff --git a/backoffice/tmpl/module/profile/index.tt b/backoffice/tmpl/module/profile/index.tt new file mode 100644 index 00000000..41f21391 --- /dev/null +++ b/backoffice/tmpl/module/profile/index.tt @@ -0,0 +1,45 @@ + +[% PROCESS macro/fields.tt %] +
+
+
+

données d'accès

+
+
+ [% #fieldhidden('users','id','ident') %] + [% fieldeditbox('username','users','E-Mail (Login)','','readonly','') %] +
+ +
+
+
+ + +
+
+
+
+ +
+
+

données personelles

+
+
+ + [% fieldhidden('id','members','ident') %] + [% fieldeditbox('surname','members','Nom','w3-half','') %] + [% fieldeditbox('prename','members','Prénom','w3-half','') %] + [% fieldeditbox('job','members','Position','w3-half','') %] + [% fieldeditbox('phone','members','Téléphone','w3-half','') %] +
+ [% formsavebutton('members','sauvegarder') %] +
+
+
+
+ + [% #INCLUDE block/dlgcropper.tt %] + [% INCLUDE module/profile/dlgpassword.tt %] + [% INCLUDE module/profile/dlgusername.tt %] + + diff --git a/backoffice/tmpl/module/projects/cdm.js b/backoffice/tmpl/module/projects/cdm.js new file mode 100644 index 00000000..ad9a2a67 --- /dev/null +++ b/backoffice/tmpl/module/projects/cdm.js @@ -0,0 +1,93 @@ +var tbl= null; +//var sel_project = null; +var choice = {"cdm":{"project_ids":null}}; +function initpage(){ + choice["cdm"]["project_ids"] = new Choices('#project_ids',{ + searchEnabled: false, + itemSelectText: 'sélectionner...', + removeItemButton: true, + choices : [] + }); + tbl = new Tabulator("#tbl_cdm", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"corps de métier", field:"cdm",headerFilter:"input"}, + {title:"projets", field:"projectlist",headerFilter:"input"}, + + ], + }); + +gettbldata(); +getprojects(); +} + +function gettbldata(){ + req.reqdata("POST","db.cgi",{"get":"cdmlist"},loadtbldata); +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +function aftersavecdm(){ + gettbldata(); + document.getElementById('dlgcdm').style.display='none'; +} + +function add(){ + fillcdmform(null); +} + +function edit(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + var uid = udata[0].id; + req.reqdata("POST","db.cgi",{"get":"cdmlist","filter":"id=" + udata[0].id},fillcdmform); + } +} + +function fillcdmform(data){ + cleanform("cdm"); + if (data && data.sqldata){ + fillformbydataclass("cdm",data.sqldata[0],false); + } + + document.getElementById('dlgcdm').style.display='block'; +} + +function remove(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + if (confirm("êtes-vous sûre de supprimer le corps de métier sélectionné?")){ + req.reqdata("POST","db.cgi",{"del":"1","ident_cdm_id":udata[0].id},gettbldata); + } + } + +} + +function view_projects(){ + parent.admin.loadpage('module/[% module %]/index.html','Projets'); +} + +function view_cdm(){ + parent.admin.loadpage('module/[% module %]/cdm.html','Corps de métiers'); +} + + + +function getprojects(){ + req.reqdata("POST","db.cgi",{"get":"projectlist"},fillprojectlist); +} + +function fillprojectlist(data){ + fillselectlist(choice["cdm"]["project_ids"],data.sqldata,'id','project'); + + return false; +} + diff --git a/backoffice/tmpl/module/projects/cdm.tt b/backoffice/tmpl/module/projects/cdm.tt new file mode 100644 index 00000000..3f44a138 --- /dev/null +++ b/backoffice/tmpl/module/projects/cdm.tt @@ -0,0 +1,36 @@ +[% PROCESS macro/fields.tt %] +
+
+ + + + + +
+
+
+ + +
+
+
+ × +

Projet

+
+
+ +
+ [% fieldhidden("id","cdm","ident",'') %] + [% fieldeditbox("cdm","cdm","Corps de métier",'','','','') %] + [% fieldmultiselectbox('project_ids','cdm','Projets','','','') %] +
+
+
+ + [% formdlgsavebutton('cdm','sauvegarder','aftersavecdm') %] +
+
+
+ + \ No newline at end of file diff --git a/backoffice/tmpl/module/projects/index.js b/backoffice/tmpl/module/projects/index.js new file mode 100644 index 00000000..9384551b --- /dev/null +++ b/backoffice/tmpl/module/projects/index.js @@ -0,0 +1,105 @@ +var tbl= null; +function initpage(){ + tinymce.init({ + selector: '.richeditarea', + plugins: 'paste importcss searchreplace autolink autoresize directionality code visualblocks visualchars link charmap advlist lists textpattern noneditable charmap emoticons', + + menubar: false, + statusbar: false, + toolbar: 'undo redo | bold italic underline strikethrough | fontsizeselect | alignleft aligncenter alignright alignjustify | numlist bullist | forecolor removeformat | charmap', + toolbar_sticky: true, + min_height: 350, + language: 'de', + content_css: [ + '[% abspath %]css/w3pro.css' + ], + branding: false, + importcss_append: true, + contextmenu: "link", + }); + tbl = new Tabulator("#tbl_projects", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"projet", field:"project",headerFilter:"input"}, + {title:"description", field:"description",headerFilter:"input", formatter:"html"}, + {title:"corps de métiers", field:"cdmlist",headerFilter:"input"}, + ], + }); + +gettbldata(); +} + +function gettbldata(){ + req.reqdata("POST","db.cgi",{"get":"projectlist"},loadtbldata); +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +function aftersaveproject(){ + formsaved(); + gettbldata(); + document.getElementById('dlgprojects').style.display='none'; +} + +function add(){ + fillprojectform(null); +} + +function edit(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + var uid = udata[0].id; + req.reqdata("POST","db.cgi",{"get":"projectlist","filter":"id=" + udata[0].id},fillprojectform); + } +} + +function fillprojectform(data){ + var frm = document.querySelectorAll('.data_projects'); + for (var f in frm){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT') || (frm[f].tagName == 'TEXTAREA')){ + if (frm[f].classList.contains("richeditarea")){ + tinymce.get(frm[f].id).setContent(""); + }else { + frm[f].value=""; + } + } + } + if (data && data.sqldata){ + for (var f in frm){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT') || (frm[f].tagName == 'TEXTAREA')){ + if (frm[f].classList.contains("richeditarea")){ + tinymce.get(frm[f].id).setContent(data.sqldata[0][frm[f].id]); + }else { + frm[f].value=data.sqldata[0][frm[f].id]; + } + } + } + } + document.getElementById('dlgprojects').style.display='block'; +} + +function remove(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + if (confirm("êtes-vous sûre de supprimer le projet sélectionné?")){ + req.reqdata("POST","db.cgi",{"del":"1","ident_projects_id":udata[0].id},gettbldata); + } + } + +} + +function view_projects(){ + parent.admin.loadpage('module/[% module %]/index.html','Projets'); +} + +function view_cdm(){ + parent.admin.loadpage('module/[% module %]/cdm.html','Corps de métiers'); +} \ No newline at end of file diff --git a/backoffice/tmpl/module/projects/index.tt b/backoffice/tmpl/module/projects/index.tt new file mode 100644 index 00000000..10130f60 --- /dev/null +++ b/backoffice/tmpl/module/projects/index.tt @@ -0,0 +1,39 @@ +[% PROCESS macro/fields.tt %] +[% IF (session.usergroups.search('admin') == 1) %] +
+
+ + + + + + + + +
+
+
+[% END %] +
+[% IF (session.usergroups.search('admin') == 1) %] +
+
+
+ × +

Projet

+
+
+
+ [% fieldhidden("id","projects","ident",'') %] + [% fieldeditbox("project","projects","Projet",'','','','') %] + [% fieldrichtextarea("description","projects","Description",'','','300px','') %] +
+
+
+ + [% formdlgsavebutton('projects','sauvegarder','aftersaveproject') %] +
+
+
+[% END %] diff --git a/backoffice/tmpl/module/submissions/index.js b/backoffice/tmpl/module/submissions/index.js new file mode 100644 index 00000000..72d75224 --- /dev/null +++ b/backoffice/tmpl/module/submissions/index.js @@ -0,0 +1,105 @@ +var tbl= null; +function initpage(){ + tbl = new Tabulator("#tbl_submissions", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"projet", field:"project",headerFilter:"input",download:true}, + {title:"corps de métier", field:"cdm",headerFilter:"input",download:true}, + {title:"fichier", field:"file",headerFilter:"input",download:true}, + ], + }); + +//gettbldata(); +} + +function gettbldata(){ + [% IF (session.usergroups.search('admin') == 1) %] + req.reqdata("POST","db.cgi",{"get":"documentlist"},loadtbldata); + [% ELSE %] + req.reqdata("POST","db.cgi",{"get":"documentlist","filter":"userlist like '%\""+ session.id +"\"%"},loadtbldata); + [% END %] + +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +function add(){ + fillsubmissionform(null); +} + +function edit(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + var uid = udata[0].id; + req.reqdata("POST","db.cgi",{"get":"submissionlist","filter":"id=" + udata[0].id},fillsubmissionform); + } +} + +function fillsubmissionform(data){ + console.log(data); + var frm = document.querySelectorAll('.data_submissions'); + for (var f in frm){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT') || (frm[f].tagName == 'TEXTAREA')){ + frm[f].value=""; + } + } + if (data && data.sqldata){ + for (var f in frm){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT') || (frm[f].tagName == 'TEXTAREA')){ + frm[f].value=data.sqldata[0][frm[f].id]; + } + } + } + + document.getElementById('dlgsubmissions').style.display='block'; +} + +function remove(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + if (confirm("êtes-vous sûre de supprimer bordereau sélectionné?")){ + req.reqdata("POST","db.cgi",{"del":"1","ident_submissions_id":udata[0].id},gettbldata); + } + } + +} + + +// function xlsxexport(){ +// tbl.download("xlsx", "soumissions.xlsx", {sheetName:"soumissions"}); +// } + +// function pdfexport(){ +// tbl.download("pdf", "soumissions.pdf", { +// orientation:"landscape", + +// jsPDF:{ +// unit:"mm", +// }, +// autoTable(doc){ +// doc.text("Liste des soumissions sur solana-architecture.lu", 10, 10); +// // styles: { +// // fillColor: [100, 255, 255] +// // }, +// // columnStyles: { +// // id: {fillColor: 255} +// // }, +// return { +// margin: {top: 20}, +// } + +// }, +// documentProcessing:function(doc){ +// //carry out an action on the doc object +// } +// }); +// } + diff --git a/backoffice/tmpl/module/submissions/index.tt b/backoffice/tmpl/module/submissions/index.tt new file mode 100644 index 00000000..a234d40f --- /dev/null +++ b/backoffice/tmpl/module/submissions/index.tt @@ -0,0 +1,51 @@ +[% PROCESS macro/fields.tt %] +[% sid = session.id %] +[% company %] +[% IF (session.usergroups.search('admin') != 1) %] +[% qcompany = dksdb.query("select ul.id_company,cp.validated from vw_userlist ul join vw_companydata cp on (ul.id_company=cp.id) where ul.id=$sid;") %] +[% company = qcompany.get_all() %] +[% END %] +[% IF (session.usergroups.search('admin') == 1) || company.0.validated == "1" %] +
+
+ + + +
+
+ +
+ +
+
+
+ × +

Ajouter Soumission

+
+
+ [% fieldeditbox("project","display","Projet",'','','','') %] + [% fieldeditbox("cdm","display","Corps de Métier",'','','','') %] +
+ [% fieldhidden("id","submissions","ident",'') %] + [% fieldfile("filepdf","submissions","Fichier Bordereau (PDF)",'','','') %] + [% fieldfile("filexls","submissions","Fichier Bordereau (XLSX)",'','','') %] + [% fieldfile("fileother","submissions","Fichier",'','','') %] +
+
+
+ + +
+
+
+ +[% ELSE %] +
Votre Entreprise n'est pas validé, il se peux que vous données d'entreprise sont incomplètes!
+[% END %] diff --git a/backoffice/tmpl/module/upload/index.js b/backoffice/tmpl/module/upload/index.js new file mode 100644 index 00000000..f3db79c2 --- /dev/null +++ b/backoffice/tmpl/module/upload/index.js @@ -0,0 +1,45 @@ +var tbl= null; +function initpage(){ + tbl = new Tabulator("#tbl_upload", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"entreprise", field:"company",headerFilter:"input",download:true}, + {title:"projet", field:"project",headerFilter:"input",download:true}, + {title:"corps de métier", field:"cdm",headerFilter:"input",download:true}, + {title:"fichier", field:"file",headerFilter:"input",download:true}, + ], + }); + +gettbldata(); +} + +function gettbldata(){ + [% IF (session.usergroups.search('admin') == 1) %] + req.reqdata("POST","db.cgi",{"get":"documentlist"},loadtbldata); + [% ELSE %] + req.reqdata("POST","db.cgi",{"get":"documentlist","filter":"userlist like '%\""+ session.id +"\"%"},loadtbldata); + [% END %] + +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +function xlsxexport(){ + tbl.download("xlsx", "uploads.xlsx", {sheetName:"uploads"}); +} + +function add(){ + +} + +function remove(){ + +} \ No newline at end of file diff --git a/backoffice/tmpl/module/upload/index.tt b/backoffice/tmpl/module/upload/index.tt new file mode 100644 index 00000000..861c4e03 --- /dev/null +++ b/backoffice/tmpl/module/upload/index.tt @@ -0,0 +1,24 @@ +[% sid = session.id %] +[% company %] +[% IF (session.usergroups.search('admin') != 1) %] +[% qcompany = dksdb.query("select ul.id_company,cp.validated from vw_userlist ul join vw_companydata cp on (ul.id_company=cp.id) where ul.id=$sid;") %] +[% company = qcompany.get_all() %] +[% END %] +[% IF (session.usergroups.search('admin') == 1) || company.0.validated == "1" %] +
+
+ + +
+
+
+ +[% ELSE %] +
Votre Entreprise n'est pas validé, il se peux que vous données d'entreprise sont incomplètes!
+[% END %] \ No newline at end of file diff --git a/backoffice/tmpl/module/users/index.js b/backoffice/tmpl/module/users/index.js new file mode 100644 index 00000000..a9eaffe4 --- /dev/null +++ b/backoffice/tmpl/module/users/index.js @@ -0,0 +1,294 @@ +[% sid = session.id %] +[% IF (session.usergroups.search('admin') != 1) %] +[% qcompany = dksdb.query("select id_company from vw_userlist where id=$sid;") %] +[% company = qcompany.get_all() %] +[% END %] +var tbl= null; +var sel_usergroups = null; +var choice = {"members":{"id_company":null}}; + +function initpage(){ + [% IF (session.usergroups.search('admin') == 1) %] + sel_usergroups = new Choices('#usergroup_ids',{ + searchEnabled: false, + itemSelectText: 'auswielen...', + removeItemButton: true, + choices : [] + }); + choice["members"]["id_company"] = new Choices('#id_company',{ + searchEnabled: false, + itemSelectText: 'sélectionner...', + removeItemButton: true, + choices : [] + }); + tbl = new Tabulator("#tbl_users", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"Entreprise", field:"company",headerFilter:"input",download:true}, + {title:"Nom", field:"surname",headerFilter:"input",download:true}, + {title:"Prénom", field:"prename",headerFilter:"input",download:true}, + {title:"Accès",field:"group_ids",download:true,headerFilter:"input"}, + {title:"Position",field:"job",download:true}, + {title:"Téléphone",field:"phone",download:true}, + {title:"E-mail",field:"username",download:true}, + {title:"Bloqué", field:"blocked",download:true}, + ], +}); +getusergroups(); + [% ELSE %] + tbl = new Tabulator("#tbl_users", { + headerFilterPlaceholder:"filter...", + height: "95vh", + layout:"fitDataFill", + selectable:1, + responsiveLayout:"collapse", + columns:[ + {title:"Entreprise", field:"company",}, + {title:"Numm", field:"surname",headerFilter:"input"}, + {title:"Virnumm", field:"prename",headerFilter:"input"}, + {title:"Accès",field:"group_ids",download:true}, + {title:"Position",field:"job",download:true}, + {title:"Téléphone",field:"phone",download:true}, + {title:"E-mail",field:"username",download:true}, + ], +}); + [% END %] + gettbldata(); + getcompanies(); +} + +function gettbldata(){ + [% IF (session.usergroups.search('admin') == 1) %] + req.reqdata("POST","db.cgi",{"get":"userlist"},loadtbldata); + [% ELSE %] + req.reqdata("POST","db.cgi",{"get":"userlist","filter":"id_company=[% company.0.id_company %]"},loadtbldata); + [% END %] +} + +function loadtbldata(data){ + if (data && data.sqldata){ + tbl.setData(data.sqldata); + } +} + +// function xlsxexport(){ +// tbl.download("xlsx", "users.xlsx", {sheetName:"utilisateurs"}); +// } + +// function pdfexport(){ +// tbl.download("pdf", "users.pdf", { +// orientation:"landscape", + +// jsPDF:{ +// unit:"mm", +// }, +// autoTable(doc){ +// doc.text("Utilisateurs du site", 10, 10); +// // styles: { +// // fillColor: [100, 255, 255] +// // }, +// // columnStyles: { +// // id: {fillColor: 255} +// // }, +// return { +// margin: {top: 20}, +// } + +// }, +// documentProcessing:function(doc){ +// //carry out an action on the doc object +// } +// }); +// } +function edit(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + req.reqdata("POST","db.cgi",{"get":"userlist","filter":"id_member=" + udata[0].id_member},fillmemberform); + } +} + +function fillmemberform(data){ + cleanform("members"); + if (data && data.sqldata){ + fillformbydataclass("members",data.sqldata[0],false); + } + + document.getElementById('dlgmembers').style.display='block'; +} + +function getcompanies(){ + req.reqdata("POST","db.cgi",{"get":"companylist"},fillcompanylist); +} + +function fillcompanylist(data){ + fillselectlist(choice["members"]["id_company"],data.sqldata,'id','company'); + + return false; +} + + +function closedlgmembers(){ + gettbldata(); + document.getElementById('dlgmembers').style.display='none'; + return false; +} + +[% IF (session.usergroups.search('admin') == 1) %] +function remove(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + if (confirm("Êtes vous sûre de supprimer l'utilisateur selectionné?")){ + req.reqdata("POST","db.cgi",{"del":"1","ident_users_id":udata[0].id},gettbldata); + } + } + +} + function setusergroups(){ + var udata = tbl.getSelectedData(); + if (udata[0]){ + var uid = udata[0].id; + req.reqdata("POST","db.cgi",{"get":"userdata","filter":"id=" + uid},fillusergroupform); + } + } + function fillusergroupform(data){ + + if (data && data.sqldata){ + var frm = document.querySelectorAll('.data_users,.data_display,.data_useringroups'); + for (var f in frm){ + + if (data.sqldata[0][frm[f].id]){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT')) { + if (frm[f].id == "usergroup_ids"){ + + var argrp = data.sqldata[0][frm[f].id].split(","); + //console.log(argrp); + sel_usergroups.setChoiceByValue(argrp); + } else { + frm[f].value=data.sqldata[0][frm[f].id]; + } + } + } + } + document.getElementById('dlgusergroups').style.display='block'; + } + + } + + function getusergroups(){ + req.reqdata("POST","db.cgi",{"get":"usergroups"},fillusergroups); + return false; + } + function fillusergroups(data){ + var pug = []; + if (data && data.sqldata){ + for (var i in data.sqldata){ + pug.push({value:data.sqldata[i].id,label:data.sqldata[i].groupname}); + } + } + sel_usergroups.setChoices(pug, 'value', 'label', true); + + return false; + } + + function saveusergroupsform(){ + var flds = getformcontent("usergroups",{}); + //console.log(flds); + + req.reqdata("POST","db.cgi",{"fn":"setgroupaccess","params": flds.ident_users_id + ",'{" + flds.useringroups_usergroup_ids.join(',') +"}'"},ugsaved); + return false; + } + + function ugsaved(data){ + //console.log(data); + gettbldata(); + document.getElementById('dlgusergroups').style.display='none'; + formsaved(null); + } + + function setlogin(){ + var udata = tbl.getSelectedData(); + document.getElementById("nunmsg").innerHTML = '' + if (udata[0]){ + var uid = udata[0].id; + req.reqdata("POST","db.cgi",{"get":"userdata","filter":"id=" + uid},fillloginform); + } + } + function fillloginform(data){ + document.getElementById("blocked").checked = false; + document.getElementById("username").value = ""; + if (data && data.sqldata){ + var frm = document.querySelectorAll('.data_users,.data_display,.data_useringroups'); + for (var f in frm){ + + if (data.sqldata[0][frm[f].id]){ + if ((frm[f].tagName == 'INPUT') || (frm[f].tagName == 'SELECT')) { + + if (frm[f].type == "checkbox"){ + document.getElementById("blocked").checked = true; + } else { + frm[f].value=data.sqldata[0][frm[f].id]; + } + } + } + } + document.getElementById('dlglogin').style.display='block'; + } + } + + function setusername(){ + var flds = getformcontent("users",{}); + //console.log(flds); + flds["set"] = 1; + req.reqdata("POST","db.cgi",flds,loginsaved); + return false; + } + + function loginsaved(data){ + //console.log(data); + gettbldata(); + document.getElementById('dlglogin').style.display='none'; + formsaved(null); + } + function ugsaved(data){ + //console.log(data); + gettbldata(); + document.getElementById('dlgusergroups').style.display='none'; + formsaved(null); + } + + function sendnewpassword(){ + var flds = getformcontent("login",{}); + //console.log(flds); + return false; + } + + function checkemail(){ + var newusername = document.getElementById("username").value; + //console.log("username: " + newusername); + if (validateEmail(newusername)){ + req.reqdata("POST","db.cgi",{"get":"userdata","filter":"username='"+ newusername+ "' and id != " + document.getElementById("id").value},checkmailreturn); + }else { + document.getElementById("nunmsg").innerHTML= '
w.e.g. eng richteg email agin!
'; + } + return false; + } + + function checkmailreturn(data){ + //console.log(data); + if (data && data.sqldata.length > 0){ + document.getElementById("nunmsg").innerHTML= '
Et existéiert schon een aaneren Kont matt deser E-mail!
'; + } else { + setusername(); + } + return false; + } + + function validateEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email).toLowerCase()); + } +[% END %] \ No newline at end of file diff --git a/backoffice/tmpl/module/users/index.tt b/backoffice/tmpl/module/users/index.tt new file mode 100644 index 00000000..8f925249 --- /dev/null +++ b/backoffice/tmpl/module/users/index.tt @@ -0,0 +1,98 @@ +[% PROCESS macro/fields.tt %] +[% IF (session.usergroups.search('admin') == 1) %] +
+
+ + + + + + + + + + + +
+
+[% END %] +[% #inputdisabled = 'readonly' %] +[% #IF (session.usergroups.search('fld') == 1) %] +[% #inputdisabled = '' %] +[% #END %] +
+
+
+
+ × +

Benotzer Accès

+
+
+ [% fieldeditbox("surname","display","Nom",'w3-half','readonly','') %] + [% fieldeditbox("prename","display","Prénom",'w3-half','readonly','') %] +
+ [% fieldhidden("id","users","ident",'') %] + [% fieldmultiselectbox("usergroup_ids","useringroups","Accès",'','','') %] +
+
+
+ + + +
+
+
+
+
+
+ × +

Benotzer E-Mail

+
+
+
+ [% fieldeditbox("surname","display","Nom",'w3-half','readonly','') %] + [% fieldeditbox("prename","display","Prénom",'w3-half','readonly','') %] +
+ [% fieldhidden("id","users","ident",'') %] + [% fieldeditbox("username","users","Login / E-Mail",'','','') %] + [% fieldcheckbox("blocked","users","compte blocké",'','','1') %] +
+
+
+ + + +
+
+
+
+
+
+ × +

Donnée de l'utilsateur

+
+
+
+ [% fieldhidden('id','members','ident') %] + [% fieldeditbox('surname','members','Nom','','') %] + [% fieldeditbox('prename','members','Prénom','','') %] + [% fieldeditbox('job','members','Position','','') %] + [% fieldeditbox('phone','members','Téléphone','','') %] + [% fieldselectbox('id_company','members','Entreprise','','','')%] +
+
+
+ + + [% formdlgsavebutton('members','sauvegarder','closedlgmembers();') %] +
+
+
+[% #IF (session.usergroups.search('admin') != 1) %] +[% #INCLUDE "module/$module/javascript.tt" %] +[% #END %] + diff --git a/backoffice/tmpl/module/users/javascript.tt b/backoffice/tmpl/module/users/javascript.tt new file mode 100644 index 00000000..ea759be4 --- /dev/null +++ b/backoffice/tmpl/module/users/javascript.tt @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/backoffice/tmpl/skeleton/index.tt b/backoffice/tmpl/skeleton/index.tt new file mode 100644 index 00000000..68f33a62 --- /dev/null +++ b/backoffice/tmpl/skeleton/index.tt @@ -0,0 +1,47 @@ +[% USE dksdb = DBI(dsn, dbuser, dbpassword) %] +[% appaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,ug.usergroup from useringroups uig join apps ap on (uig.id_group=ap.id_usergroup) join usergroups ug on (uig.id_group=ug.id) where uig.id_user=? group by ap.id,ug.id order by ap.sort;")%] + + + [% INCLUDE block/head.tt %] + + + + +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+
+ + + + + + diff --git a/backoffice/tmpl/skeleton/login.tt b/backoffice/tmpl/skeleton/login.tt new file mode 100644 index 00000000..16747bb7 --- /dev/null +++ b/backoffice/tmpl/skeleton/login.tt @@ -0,0 +1,33 @@ + + + +[% INCLUDE block/head.tt %] + + + +
+
+
+
+ logo +
+ [% IF pagename == 'register' && registration_enabled == '1' %] + [% INCLUDE skeleton/login/register.tt %] + [% ELSIF pagename == 'forgotpassword' %] + [% INCLUDE skeleton/login/forgotpassword.tt %] + [% ELSIF pagename == 'message' %] + [% INCLUDE skeleton/login/message.tt %] + [% ELSIF pagename == 'validationcode' %] + [% INCLUDE skeleton/login/validationcode.tt %] + [% ELSE %] + [% INCLUDE skeleton/login/login.tt %] + [% END %] +
+
+ logo +
+
+
+ + + diff --git a/backoffice/tmpl/skeleton/login/forgotpassword.tt b/backoffice/tmpl/skeleton/login/forgotpassword.tt new file mode 100644 index 00000000..bf4feb58 --- /dev/null +++ b/backoffice/tmpl/skeleton/login/forgotpassword.tt @@ -0,0 +1,20 @@ +
+

Mot de passe oublié?

+
Demander un nouveau mot de passe
+
+
+
+ + + + +
+ +
+ +
+ + +
\ No newline at end of file diff --git a/backoffice/tmpl/skeleton/login/login.tt b/backoffice/tmpl/skeleton/login/login.tt new file mode 100644 index 00000000..7262df22 --- /dev/null +++ b/backoffice/tmpl/skeleton/login/login.tt @@ -0,0 +1,25 @@ +
+

Accès Client

+
Bienvenue de retour
+
+
+
+ + +
+
+ + +
+
+ +
+ + [% IF registration_enabled == '1' %] +
+ Vous n'avez pas encore de compte?
se régistrer +
+ [% END %] +
\ No newline at end of file diff --git a/backoffice/tmpl/skeleton/login/message.tt b/backoffice/tmpl/skeleton/login/message.tt new file mode 100644 index 00000000..ba1006fc --- /dev/null +++ b/backoffice/tmpl/skeleton/login/message.tt @@ -0,0 +1,12 @@ +
[% message %]
+ + [% IF registration_enabled == '1' %] + + [% END %] + \ No newline at end of file diff --git a/backoffice/tmpl/skeleton/login/register.tt b/backoffice/tmpl/skeleton/login/register.tt new file mode 100644 index 00000000..7c42fb09 --- /dev/null +++ b/backoffice/tmpl/skeleton/login/register.tt @@ -0,0 +1,49 @@ +[% PROCESS macro/fields.tt %] +
+

Vous n'avez pas un compte?

+
régistrez-vous maintenant!
+
+ +
+
+ [% fieldeditbox('company','companies','Entreprise','w3-half','','','') %] +
+
+ [% fieldeditbox('surname','members','Nom','w3-third','','','') %] + [% fieldeditbox('prename','members','Prénom','w3-third','','','') %] + [% fieldeditbox('job','members','Position','w3-quarter','','','gérant') %] +
+
+ [% fieldeditbox('email','users','E-Mail','w3-half','','','') %] + [% fieldeditbox('phone','members','Téléphone','w3-half','','','') %] +
+ +
+ + +
+
+ +
+
+ vous avez déjà un compte? Se Connecter +
+
+ +
+ + +
+ × +

Conditions générales d'utilisation du site solana-architecture.lu

+
+
+ [% INCLUDE block/cgu.tt %] +
+
+ + +
+
+
\ No newline at end of file diff --git a/backoffice/tmpl/skeleton/login/validationcode.tt b/backoffice/tmpl/skeleton/login/validationcode.tt new file mode 100644 index 00000000..87b36bea --- /dev/null +++ b/backoffice/tmpl/skeleton/login/validationcode.tt @@ -0,0 +1,23 @@ + +
+

Validation de votre addressee E-Mail

+
 
+
+
[% message %]
+
+
+ + + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/backoffice/tmpl/skeleton/module.tt b/backoffice/tmpl/skeleton/module.tt new file mode 100644 index 00000000..1b693998 --- /dev/null +++ b/backoffice/tmpl/skeleton/module.tt @@ -0,0 +1,57 @@ +[% USE dksdb = DBI(dsn, dbuser, dbpassword) %] + + + + + + + + + + [% adminname %] - [% module %] - [% pagename %] + + + + + + + + + + + + + + + +
+ [% IF session.id %] + [% INCLUDE $page %] +
+ + + + + + + + + + + + [% ELSE %] +
+

Du hues keen Accès op dëss Sait!

+
+ + [% END %] + [% INCLUDE block/snackbar.tt %] + + + + + + diff --git a/backoffice/tmpl/skeleton/module_file.tt b/backoffice/tmpl/skeleton/module_file.tt new file mode 100644 index 00000000..d7bc96a3 --- /dev/null +++ b/backoffice/tmpl/skeleton/module_file.tt @@ -0,0 +1,3 @@ +[% USE DBI %] +[% USE dksdb = DBI(dsn, dbuser, dbpassword) %] +[% INCLUDE $page %] diff --git a/backoffice/vendors/choices/base.css b/backoffice/vendors/choices/base.css new file mode 100644 index 00000000..2d090bd6 --- /dev/null +++ b/backoffice/vendors/choices/base.css @@ -0,0 +1,191 @@ +/*============================================= += Generic styling = +=============================================*/ +* { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +*, +*:before, +*:after { + box-sizing: border-box; +} + +html, +body { + position: relative; + margin: 0; + width: 100%; + height: 100%; +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-size: 16px; + line-height: 1.4; + color: #FFFFFF; + background-color: #333; + overflow-x: hidden; +} + +label { + display: block; + margin-bottom: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; +} + +p { + margin-top: 0; +} + +hr { + display: block; + margin: 30px 0; + border: 0; + border-bottom: 1px solid #eaeaea; + height: 1px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 12px; + font-weight: 400; + line-height: 1.2; +} + +a, +a:visited, +a:focus { + color: #FFFFFF; + text-decoration: none; + font-weight: 600; +} + +.form-control { + display: block; + width: 100%; + background-color: #f9f9f9; + padding: 12px; + border: 1px solid #ddd; + border-radius: 2.5px; + font-size: 14px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin-bottom: 24px; +} + +h1, +.h1 { + font-size: 32px; +} + +h2, +.h2 { + font-size: 24px; +} + +h3, +.h3 { + font-size: 20px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 16px; +} + +h6, +.h6 { + font-size: 14px; +} + +p { + margin-bottom: 8px; +} + +label + p { + margin-top: -4px; +} + +.container { + display: block; + margin: auto; + max-width: 40em; + padding: 48px; +} + +@media (max-width: 620px) { + .container { + padding: 0; + } +} + +.section { + background-color: #FFFFFF; + padding: 24px; + color: #333; +} + +.section a, +.section a:visited, +.section a:focus { + color: #00bcd4; +} + +.logo { + display: block; + margin-bottom: 12px; +} + +.logo__img { + width: 100%; + height: auto; + display: inline-block; + max-width: 100%; + vertical-align: top; + padding: 6px 0; +} + +.visible-ie { + display: none; +} + +.push-bottom { + margin-bottom: 24px; +} + +.zero-bottom { + margin-bottom: 0; +} + +.zero-top { + margin-top: 0; +} + +.text-center { + text-align: center; +} + +.is-hidden { + display: none; +} + +[data-test-hook] { + margin-bottom: 24px; +} + +/*===== End of Section comment block ======*/ diff --git a/backoffice/vendors/choices/base.min.css b/backoffice/vendors/choices/base.min.css new file mode 100644 index 00000000..7992056a --- /dev/null +++ b/backoffice/vendors/choices/base.min.css @@ -0,0 +1 @@ +*{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{box-sizing:border-box}body,html{position:relative;margin:0;width:100%;height:100%}body{font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:16px;line-height:1.4;color:#fff;background-color:#333;overflow-x:hidden}hr,label{display:block}label,p{margin-bottom:8px}label{font-size:14px;font-weight:500;cursor:pointer}p{margin-top:0}hr{margin:30px 0;border:0;border-bottom:1px solid #eaeaea;height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:12px;font-weight:400;line-height:1.2}a,a:focus,a:visited{color:#fff;text-decoration:none;font-weight:600}.form-control{display:block;width:100%;background-color:#f9f9f9;padding:12px;border:1px solid #ddd;border-radius:2.5px;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-bottom:24px}.h1,h1{font-size:32px}.h2,h2{font-size:24px}.h3,h3{font-size:20px}.h4,h4{font-size:18px}.h5,h5{font-size:16px}.h6,h6{font-size:14px}label+p{margin-top:-4px}.container{display:block;margin:auto;max-width:40em;padding:48px}@media (max-width:620px){.container{padding:0}}.section{background-color:#fff;padding:24px;color:#333}.section a,.section a:focus,.section a:visited{color:#00bcd4}.logo{display:block;margin-bottom:12px}.logo__img{width:100%;height:auto;display:inline-block;max-width:100%;vertical-align:top;padding:6px 0}.visible-ie{display:none}.push-bottom{margin-bottom:24px}.zero-bottom{margin-bottom:0}.zero-top{margin-top:0}.text-center{text-align:center}.is-hidden{display:none}[data-test-hook]{margin-bottom:24px} \ No newline at end of file diff --git a/backoffice/vendors/choices/choices.css b/backoffice/vendors/choices/choices.css new file mode 100644 index 00000000..e3bc0377 --- /dev/null +++ b/backoffice/vendors/choices/choices.css @@ -0,0 +1,368 @@ +/*=============================== += Choices = +===============================*/ +.choices { + position: relative; + margin-bottom: 24px; + font-size: 16px; +} + +.choices:focus { + outline: none; +} + +.choices:last-child { + margin-bottom: 0; +} + +.choices.is-disabled .choices__inner, +.choices.is-disabled .choices__input { + background-color: #EAEAEA; + cursor: not-allowed; + user-select: none; +} + +.choices.is-disabled .choices__item { + cursor: not-allowed; +} + +.choices[data-type*="select-one"] { + cursor: pointer; +} + +.choices[data-type*="select-one"] .choices__inner { + padding-bottom: 7.5px; + +} + +.choices[data-type*="select-one"] .choices__input { + display: block; + width: 100%; + padding: 10px; + border-bottom: 1px solid #DDDDDD; + background-color: #FFFFFF; + margin: 0; +} + +.choices[data-type*="select-one"] .choices__button { + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); + padding: 0; + background-size: 8px; + position: absolute; + top: 50%; + right: 0; + margin-top: -10px; + margin-right: 25px; + height: 20px; + width: 20px; + /* border-radius: 10em; */ + opacity: .5; +} + +.choices[data-type*="select-one"] .choices__button:hover, .choices[data-type*="select-one"] .choices__button:focus { + opacity: 1; +} + +.choices[data-type*="select-one"] .choices__button:focus { + box-shadow: 0px 0px 0px 2px #00BCD4; +} + +.choices[data-type*="select-one"]:after { + content: ""; + height: 0; + width: 0; + border-style: solid; + border-color: #333333 transparent transparent transparent; + border-width: 5px; + position: absolute; + right: 11.5px; + top: 50%; + margin-top: -2.5px; + pointer-events: none; +} + +.choices[data-type*="select-one"].is-open:after { + border-color: transparent transparent #333333 transparent; + margin-top: -7.5px; +} + +.choices[data-type*="select-one"][dir="rtl"]:after { + left: 11.5px; + right: auto; +} + +.choices[data-type*="select-one"][dir="rtl"] .choices__button { + right: auto; + left: 0; + margin-left: 25px; + margin-right: 0; +} + +.choices[data-type*="select-multiple"] .choices__inner, +.choices[data-type*="text"] .choices__inner { + cursor: text; +} + +.choices[data-type*="select-multiple"] .choices__button, +.choices[data-type*="text"] .choices__button { + position: relative; + display: inline-block; + margin-top: 0; + margin-right: -4px; + margin-bottom: 0; + margin-left: 8px; + padding-left: 16px; + border-left: 1px solid #008fa1; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); + background-size: 8px; + width: 8px; + line-height: 1; + opacity: .75; + border-radius: 0; +} + +.choices[data-type*="select-multiple"] .choices__button:hover, .choices[data-type*="select-multiple"] .choices__button:focus, +.choices[data-type*="text"] .choices__button:hover, +.choices[data-type*="text"] .choices__button:focus { + opacity: 1; +} + +.choices__inner { + display: inline-block; + vertical-align: top; + width: 100%; + background-color: #e8f0fe; + padding: 7.5px 7.5px 3.75px; + border: 1px solid #ccc; + /* border-radius: 2.5px; */ + /* font-size: 14px; */ + min-height: 44px; + overflow: hidden; + /* font-weight: bold; */ +} + +.is-focused .choices__inner, +.is-open .choices__inner { + border-color: #b7b7b7; +} + +.is-open .choices__inner { + /* border-radius: 2.5px 2.5px 0 0; */ +} + +.is-flipped.is-open .choices__inner { + /* border-radius: 0 0 2.5px 2.5px; */ +} + +.choices__list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.choices__list--single { + display: inline-block; + padding: 4px 16px 4px 4px; + width: 100%; +} + +[dir="rtl"] .choices__list--single { + padding-right: 4px; + padding-left: 16px; +} + +.choices__list--single .choices__item { + width: 100%; +} + +.choices__list--multiple { + display: inline; +} + +.choices__list--multiple .choices__item { + display: inline-block; + vertical-align: middle; + /* border-radius: 20px; */ + padding: 4px 6px; + font-size: 16px; + height: 40px; + /* font-size: 12px; */ + /* font-weight: 500; */ + margin-right: 3.75px; + /* margin-bottom: 3.75px; */ + background-color: #607d8b; + border: 1px solid #607d8b; + color: #FFFFFF; + /* font-weightfont-weight: bold; */ + word-break: break-all; +} + +.choices__list--multiple .choices__item[data-deletable] { + padding-right: 5px; +} + +[dir="rtl"] .choices__list--multiple .choices__item { + margin-right: 0; + margin-left: 3.75px; +} + +.choices__list--multiple .choices__item.is-highlighted { + background-color: #00a5bb; + border: 1px solid #008fa1; +} + +.is-disabled .choices__list--multiple .choices__item { + background-color: #aaaaaa; + border: 1px solid #919191; +} + +.choices__list--dropdown { + display: none; + z-index: 1; + position: absolute; + width: 100%; + background-color: #FFFFFF; + border: 1px solid #DDDDDD; + top: 100%; + margin-top: -1px; + /* border-bottom-left-radius: 2.5px; */ + /* border-bottom-right-radius: 2.5px; */ + overflow: hidden; + word-break: break-all; +} + +.choices__list--dropdown.is-active { + display: block; +} + +.is-open .choices__list--dropdown { + border-color: #b7b7b7; +} + +.is-flipped .choices__list--dropdown { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: -1px; + /* border-radius: .25rem .25rem 0 0; */ +} + +.choices__list--dropdown .choices__list { + position: relative; + max-height: 300px; + overflow: auto; + -webkit-overflow-scrolling: touch; + will-change: scroll-position; +} + +.choices__list--dropdown .choices__item { + position: relative; + padding: 10px; + font-size: 14px; +} + +[dir="rtl"] .choices__list--dropdown .choices__item { + text-align: right; +} + +@media (min-width: 640px) { + .choices__list--dropdown .choices__item--selectable { + padding-right: 100px; + } + .choices__list--dropdown .choices__item--selectable:after { + content: attr(data-select-text); + font-size: 12px; + opacity: 0; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable { + text-align: right; + padding-left: 100px; + padding-right: 10px; + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable:after { + right: auto; + left: 10px; + } +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted { + background-color: #f2f2f2; +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted:after { + opacity: .5; +} + +.choices__item { + cursor: default; +} + +.choices__item--selectable { + cursor: pointer; +} + +.choices__item--disabled { + cursor: not-allowed; + user-select: none; + opacity: .5; +} + +.choices__heading { + /* font-weight: 600; */ + font-size: 12px; + padding: 10px; + border-bottom: 1px solid #f7f7f7; + color: gray; +} + +.choices__button { + text-indent: -9999px; + -webkit-appearance: none; + appearance: none; + border: 0; + background-color: transparent; + background-repeat: no-repeat; + background-position: center; + cursor: pointer; +} + +.choices__button:focus { + outline: none; +} + +.choices__input { + display: inline-block; + vertical-align: baseline; + background-color: #f9f9f9; + font-size: 14px; + margin-bottom: 5px; + border: 0; + border-radius: 0; + max-width: 100%; + padding: 4px 0 4px 2px; +} + +.choices__input:focus { + outline: 0; +} + +[dir="rtl"] .choices__input { + padding-right: 2px; + padding-left: 0; +} + +.choices__placeholder { + opacity: .5; +} + +.choices__input.is-hidden, +.choices[data-type*="select-one"] .choices__input.is-hidden, +.choices[data-type*="select-multiple"] .choices__input.is-hidden { + display: none; +} + +/*===== End of Choices ======*/ diff --git a/backoffice/vendors/choices/choices.js b/backoffice/vendors/choices/choices.js new file mode 100644 index 00000000..93e8b4e7 --- /dev/null +++ b/backoffice/vendors/choices/choices.js @@ -0,0 +1,6787 @@ +(function webpackUniversalModuleDefinition(root, factory) { + //CommonJS2 + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + //AMD + else if(typeof define === 'function' && define.amd) + define([], factory); + //CommonJS + else if(typeof exports === 'object') + exports["Choices"] = factory(); + //Window + else + root["Choices"] = factory(); +})(window, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/public/assets/scripts/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 9); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.diff = exports.cloneObject = exports.existsInArray = exports.isIE11 = exports.fetchFromObject = exports.getWindowHeight = exports.dispatchEvent = exports.sortByScore = exports.sortByAlpha = exports.calcWidthOfInput = exports.strToEl = exports.sanitise = exports.isScrolledIntoView = exports.getAdjacentEl = exports.findAncestorByAttrName = exports.wrap = exports.isElement = exports.isType = exports.getType = exports.generateId = exports.generateChars = exports.getRandomNumber = void 0; + +var _this = void 0; + +var getRandomNumber = function getRandomNumber(min, max) { + return Math.floor(Math.random() * (max - min) + min); +}; + +exports.getRandomNumber = getRandomNumber; + +var generateChars = function generateChars(length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = getRandomNumber(0, 36); + chars += randomChar.toString(36); + } + + return chars; +}; + +exports.generateChars = generateChars; + +var generateId = function generateId(element, prefix) { + var id = element.id || element.name && "".concat(element.name, "-").concat(generateChars(2)) || generateChars(4); + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = "".concat(prefix, "-").concat(id); + return id; +}; + +exports.generateId = generateId; + +var getType = function getType(obj) { + return Object.prototype.toString.call(obj).slice(8, -1); +}; + +exports.getType = getType; + +var isType = function isType(type, obj) { + return obj !== undefined && obj !== null && getType(obj) === type; +}; + +exports.isType = isType; + +var isElement = function isElement(element) { + return element instanceof Element; +}; + +exports.isElement = isElement; + +var wrap = function wrap(element) { + var wrapper = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.createElement('div'); + + if (element.nextSibling) { + element.parentNode.insertBefore(wrapper, element.nextSibling); + } else { + element.parentNode.appendChild(wrapper); + } + + return wrapper.appendChild(element); +}; + +exports.wrap = wrap; + +var findAncestorByAttrName = function findAncestorByAttrName(el, attr) { + var target = el; + + while (target) { + if (target.hasAttribute(attr)) { + return target; + } + + target = target.parentElement; + } + + return null; +}; + +exports.findAncestorByAttrName = findAncestorByAttrName; + +var getAdjacentEl = function getAdjacentEl(startEl, className) { + var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + if (!startEl || !className) { + return; + } + + var parent = startEl.parentNode.parentNode; + var children = Array.from(parent.querySelectorAll(className)); + var startPos = children.indexOf(startEl); + var operatorDirection = direction > 0 ? 1 : -1; + return children[startPos + operatorDirection]; +}; + +exports.getAdjacentEl = getAdjacentEl; + +var isScrolledIntoView = function isScrolledIntoView(el, parent) { + var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + if (!el) { + return; + } + + var isVisible; + + if (direction > 0) { + // In view from bottom + isVisible = parent.scrollTop + parent.offsetHeight >= el.offsetTop + el.offsetHeight; + } else { + // In view from top + isVisible = el.offsetTop >= parent.scrollTop; + } + + return isVisible; +}; + +exports.isScrolledIntoView = isScrolledIntoView; + +var sanitise = function sanitise(value) { + if (!isType('String', value)) { + return value; + } + + return value.replace(/&/g, '&').replace(/>/g, '&rt;').replace(/".concat(sanitise(value), "")); + testEl.style.position = 'absolute'; + testEl.style.padding = '0'; + testEl.style.top = '-9999px'; + testEl.style.left = '-9999px'; + testEl.style.width = 'auto'; + testEl.style.whiteSpace = 'pre'; + + if (document.body.contains(input) && window.getComputedStyle) { + var inputStyle = window.getComputedStyle(input); + + if (inputStyle) { + testEl.style.fontSize = inputStyle.fontSize; + testEl.style.fontFamily = inputStyle.fontFamily; + testEl.style.fontWeight = inputStyle.fontWeight; + testEl.style.fontStyle = inputStyle.fontStyle; + testEl.style.letterSpacing = inputStyle.letterSpacing; + testEl.style.textTransform = inputStyle.textTransform; + testEl.style.padding = inputStyle.padding; + } + } + + document.body.appendChild(testEl); + requestAnimationFrame(function () { + if (value && testEl.offsetWidth !== input.offsetWidth) { + width = testEl.offsetWidth + 4; + } + + document.body.removeChild(testEl); + callback.call(_this, "".concat(width, "px")); + }); + } else { + callback.call(_this, "".concat(width, "px")); + } +}; + +exports.calcWidthOfInput = calcWidthOfInput; + +var sortByAlpha = function sortByAlpha(a, b) { + var labelA = "".concat(a.label || a.value).toLowerCase(); + var labelB = "".concat(b.label || b.value).toLowerCase(); + + if (labelA < labelB) { + return -1; + } + + if (labelA > labelB) { + return 1; + } + + return 0; +}; + +exports.sortByAlpha = sortByAlpha; + +var sortByScore = function sortByScore(a, b) { + return a.score - b.score; +}; + +exports.sortByScore = sortByScore; + +var dispatchEvent = function dispatchEvent(element, type) { + var customArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var event = new CustomEvent(type, { + detail: customArgs, + bubbles: true, + cancelable: true + }); + return element.dispatchEvent(event); +}; + +exports.dispatchEvent = dispatchEvent; + +var getWindowHeight = function getWindowHeight() { + var body = document.body; + var html = document.documentElement; + return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); +}; + +exports.getWindowHeight = getWindowHeight; + +var fetchFromObject = function fetchFromObject(object, path) { + var index = path.indexOf('.'); + + if (index > -1) { + return fetchFromObject(object[path.substring(0, index)], path.substr(index + 1)); + } + + return object[path]; +}; + +exports.fetchFromObject = fetchFromObject; + +var isIE11 = function isIE11() { + return !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv[ :]11/)); +}; + +exports.isIE11 = isIE11; + +var existsInArray = function existsInArray(array, value) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value'; + return array.some(function (item) { + if (isType('String', value)) { + return item[key] === value.trim(); + } + + return item[key] === value; + }); +}; + +exports.existsInArray = existsInArray; + +var cloneObject = function cloneObject(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +exports.cloneObject = cloneObject; + +var diff = function diff(a, b) { + var aKeys = Object.keys(a).sort(); + var bKeys = Object.keys(b).sort(); + return aKeys.filter(function (i) { + return bKeys.indexOf(i) < 0; + }); +}; + +exports.diff = diff; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SCROLLING_SPEED = exports.KEY_CODES = exports.ACTION_TYPES = exports.EVENTS = exports.DEFAULT_CONFIG = exports.DEFAULT_CLASSNAMES = void 0; + +var _utils = __webpack_require__(0); + +var DEFAULT_CLASSNAMES = { + containerOuter: 'choices', + containerInner: 'choices__inner', + input: 'choices__input', + inputCloned: 'choices__input--cloned', + list: 'choices__list', + listItems: 'choices__list--multiple', + listSingle: 'choices__list--single', + listDropdown: 'choices__list--dropdown', + item: 'choices__item', + itemSelectable: 'choices__item--selectable', + itemDisabled: 'choices__item--disabled', + itemChoice: 'choices__item--choice', + placeholder: 'choices__placeholder', + group: 'choices__group', + groupHeading: 'choices__heading', + button: 'choices__button', + activeState: 'is-active', + focusState: 'is-focused', + openState: 'is-open', + disabledState: 'is-disabled', + highlightedState: 'is-highlighted', + hiddenState: 'is-hidden', + flippedState: 'is-flipped', + loadingState: 'is-loading', + noResults: 'has-no-results', + noChoices: 'has-no-choices' +}; +exports.DEFAULT_CLASSNAMES = DEFAULT_CLASSNAMES; +var DEFAULT_CONFIG = { + items: [], + choices: [], + silent: false, + renderChoiceLimit: -1, + maxItemCount: -1, + addItems: true, + addItemFilterFn: null, + removeItems: true, + removeItemButton: false, + editItems: false, + duplicateItemsAllowed: true, + delimiter: ',', + paste: true, + searchEnabled: true, + searchChoices: true, + searchFloor: 1, + searchResultLimit: 4, + searchFields: ['label', 'value'], + position: 'auto', + resetScrollPosition: true, + shouldSort: true, + shouldSortItems: false, + sortFn: _utils.sortByAlpha, + placeholder: true, + placeholderValue: null, + searchPlaceholderValue: null, + prependValue: null, + appendValue: null, + renderSelectedChoices: 'auto', + loadingText: 'Loading...', + noResultsText: 'No results found', + noChoicesText: 'No choices to choose from', + itemSelectText: 'Press to select', + uniqueItemText: 'Only unique values can be added', + customAddItemText: 'Only values matching specific conditions can be added', + addItemText: function addItemText(value) { + return "Press Enter to add \"".concat((0, _utils.sanitise)(value), "\""); + }, + maxItemText: function maxItemText(maxItemCount) { + return "Only ".concat(maxItemCount, " values can be added"); + }, + itemComparer: function itemComparer(choice, item) { + return choice === item; + }, + fuseOptions: { + includeScore: true + }, + callbackOnInit: null, + callbackOnCreateTemplates: null, + classNames: DEFAULT_CLASSNAMES +}; +exports.DEFAULT_CONFIG = DEFAULT_CONFIG; +var EVENTS = { + showDropdown: 'showDropdown', + hideDropdown: 'hideDropdown', + change: 'change', + choice: 'choice', + search: 'search', + addItem: 'addItem', + removeItem: 'removeItem', + highlightItem: 'highlightItem', + highlightChoice: 'highlightChoice' +}; +exports.EVENTS = EVENTS; +var ACTION_TYPES = { + ADD_CHOICE: 'ADD_CHOICE', + FILTER_CHOICES: 'FILTER_CHOICES', + ACTIVATE_CHOICES: 'ACTIVATE_CHOICES', + CLEAR_CHOICES: 'CLEAR_CHOICES', + ADD_GROUP: 'ADD_GROUP', + ADD_ITEM: 'ADD_ITEM', + REMOVE_ITEM: 'REMOVE_ITEM', + HIGHLIGHT_ITEM: 'HIGHLIGHT_ITEM', + CLEAR_ALL: 'CLEAR_ALL' +}; +exports.ACTION_TYPES = ACTION_TYPES; +var KEY_CODES = { + BACK_KEY: 46, + DELETE_KEY: 8, + ENTER_KEY: 13, + A_KEY: 65, + ESC_KEY: 27, + UP_KEY: 38, + DOWN_KEY: 40, + PAGE_UP_KEY: 33, + PAGE_DOWN_KEY: 34 +}; +exports.KEY_CODES = KEY_CODES; +var SCROLLING_SPEED = 4; +exports.SCROLLING_SPEED = SCROLLING_SPEED; + +/***/ }), +/* 2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var _ponyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); +/* global window */ + + +var root; + +if (typeof self !== 'undefined') { + root = self; +} else if (typeof window !== 'undefined') { + root = window; +} else if (typeof global !== 'undefined') { + root = global; +} else if (true) { + root = module; +} else {} + +var result = Object(_ponyfill_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(root); +/* harmony default export */ __webpack_exports__["a"] = (result); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(14)(module))) + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var WrappedElement = +/*#__PURE__*/ +function () { + function WrappedElement(_ref) { + var element = _ref.element, + classNames = _ref.classNames; + + _classCallCheck(this, WrappedElement); + + Object.assign(this, { + element: element, + classNames: classNames + }); + + if (!(0, _utils.isElement)(element)) { + throw new TypeError('Invalid element passed'); + } + + this.isDisabled = false; + } + + _createClass(WrappedElement, [{ + key: "conceal", + value: function conceal() { + // Hide passed input + this.element.classList.add(this.classNames.input); + this.element.classList.add(this.classNames.hiddenState); // Remove element from tab index + + this.element.tabIndex = '-1'; // Backup original styles if any + + var origStyle = this.element.getAttribute('style'); + + if (origStyle) { + this.element.setAttribute('data-choice-orig-style', origStyle); + } + + this.element.setAttribute('aria-hidden', 'true'); + this.element.setAttribute('data-choice', 'active'); + } + }, { + key: "reveal", + value: function reveal() { + // Reinstate passed element + this.element.classList.remove(this.classNames.input); + this.element.classList.remove(this.classNames.hiddenState); + this.element.removeAttribute('tabindex'); // Recover original styles if any + + var origStyle = this.element.getAttribute('data-choice-orig-style'); + + if (origStyle) { + this.element.removeAttribute('data-choice-orig-style'); + this.element.setAttribute('style', origStyle); + } else { + this.element.removeAttribute('style'); + } + + this.element.removeAttribute('aria-hidden'); + this.element.removeAttribute('data-choice'); // Re-assign values - this is weird, I know + + this.element.value = this.element.value; + } + }, { + key: "enable", + value: function enable() { + this.element.removeAttribute('disabled'); + this.element.disabled = false; + this.isDisabled = false; + } + }, { + key: "disable", + value: function disable() { + this.element.setAttribute('disabled', ''); + this.element.disabled = true; + this.isDisabled = true; + } + }, { + key: "triggerEvent", + value: function triggerEvent(eventType, data) { + (0, _utils.dispatchEvent)(this.element, eventType, data); + } + }, { + key: "value", + get: function get() { + return this.element.value; + } + }]); + + return WrappedElement; +}(); + +exports.default = WrappedElement; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.TEMPLATES = void 0; + +var _classnames = _interopRequireDefault(__webpack_require__(27)); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var TEMPLATES = { + containerOuter: function containerOuter(globalClasses, direction, isSelectElement, isSelectOneElement, searchEnabled, passedElementType) { + var tabIndex = isSelectOneElement ? 'tabindex="0"' : ''; + var role = isSelectElement ? 'role="listbox"' : ''; + var ariaAutoComplete = ''; + + if (isSelectElement && searchEnabled) { + role = 'role="combobox"'; + ariaAutoComplete = 'aria-autocomplete="list"'; + } + + return (0, _utils.strToEl)("\n \n \n ")); + }, + containerInner: function containerInner(globalClasses) { + return (0, _utils.strToEl)("\n
\n ")); + }, + itemList: function itemList(globalClasses, isSelectOneElement) { + var _classNames; + + var localClasses = (0, _classnames.default)(globalClasses.list, (_classNames = {}, _defineProperty(_classNames, globalClasses.listSingle, isSelectOneElement), _defineProperty(_classNames, globalClasses.listItems, !isSelectOneElement), _classNames)); + return (0, _utils.strToEl)("\n
\n ")); + }, + placeholder: function placeholder(globalClasses, value) { + return (0, _utils.strToEl)("\n
\n ").concat(value, "\n
\n ")); + }, + item: function item(globalClasses, data, removeItemButton) { + var _classNames2; + + var ariaSelected = data.active ? 'aria-selected="true"' : ''; + var ariaDisabled = data.disabled ? 'aria-disabled="true"' : ''; + var localClasses = (0, _classnames.default)(globalClasses.item, (_classNames2 = {}, _defineProperty(_classNames2, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames2, globalClasses.itemSelectable, !data.highlighted), _defineProperty(_classNames2, globalClasses.placeholder, data.placeholder), _classNames2)); + + if (removeItemButton) { + var _classNames3; + + localClasses = (0, _classnames.default)(globalClasses.item, (_classNames3 = {}, _defineProperty(_classNames3, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames3, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames3, globalClasses.placeholder, data.placeholder), _classNames3)); + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n Remove item\n \n \n ")); + } + + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n \n ")); + }, + choiceList: function choiceList(globalClasses, isSelectOneElement) { + var ariaMultiSelectable = !isSelectOneElement ? 'aria-multiselectable="true"' : ''; + return (0, _utils.strToEl)("\n \n \n ")); + }, + choiceGroup: function choiceGroup(globalClasses, data) { + var ariaDisabled = data.disabled ? 'aria-disabled="true"' : ''; + var localClasses = (0, _classnames.default)(globalClasses.group, _defineProperty({}, globalClasses.itemDisabled, data.disabled)); + return (0, _utils.strToEl)("\n \n
").concat(data.value, "
\n \n ")); + }, + choice: function choice(globalClasses, data, itemSelectText) { + var _classNames5; + + var role = data.groupId > 0 ? 'role="treeitem"' : 'role="option"'; + var localClasses = (0, _classnames.default)(globalClasses.item, globalClasses.itemChoice, (_classNames5 = {}, _defineProperty(_classNames5, globalClasses.itemDisabled, data.disabled), _defineProperty(_classNames5, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames5, globalClasses.placeholder, data.placeholder), _classNames5)); + return (0, _utils.strToEl)("\n \n ").concat(data.label, "\n \n ")); + }, + input: function input(globalClasses) { + var localClasses = (0, _classnames.default)(globalClasses.input, globalClasses.inputCloned); + return (0, _utils.strToEl)("\n \n ")); + }, + dropdown: function dropdown(globalClasses) { + var localClasses = (0, _classnames.default)(globalClasses.list, globalClasses.listDropdown); + return (0, _utils.strToEl)("\n \n \n ")); + }, + notice: function notice(globalClasses, label) { + var _classNames6; + + var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var localClasses = (0, _classnames.default)(globalClasses.item, globalClasses.itemChoice, (_classNames6 = {}, _defineProperty(_classNames6, globalClasses.noResults, type === 'no-results'), _defineProperty(_classNames6, globalClasses.noChoices, type === 'no-choices'), _classNames6)); + return (0, _utils.strToEl)("\n
\n ").concat(label, "\n
\n ")); + }, + option: function option(data) { + return (0, _utils.strToEl)("\n \n ")); + } +}; +exports.TEMPLATES = TEMPLATES; +var _default = TEMPLATES; +exports.default = _default; + +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); + +// EXTERNAL MODULE: ./node_modules/lodash-es/_freeGlobal.js +var _freeGlobal = __webpack_require__(8); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_root.js + + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = _freeGlobal["a" /* default */] || freeSelf || Function('return this')(); + +/* harmony default export */ var _root = (root); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_Symbol.js + + +/** Built-in value references. */ +var Symbol = _root.Symbol; + +/* harmony default export */ var _Symbol = (Symbol); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_getRawTag.js + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var _getRawTag_hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = _getRawTag_hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +/* harmony default export */ var _getRawTag = (getRawTag); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_objectToString.js +/** Used for built-in method references. */ +var _objectToString_objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var _objectToString_nativeObjectToString = _objectToString_objectProto.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return _objectToString_nativeObjectToString.call(value); +} + +/* harmony default export */ var _objectToString = (objectToString); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_baseGetTag.js + + + + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var _baseGetTag_symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (_baseGetTag_symToStringTag && _baseGetTag_symToStringTag in Object(value)) + ? _getRawTag(value) + : _objectToString(value); +} + +/* harmony default export */ var _baseGetTag = (baseGetTag); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_overArg.js +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/* harmony default export */ var _overArg = (overArg); + +// CONCATENATED MODULE: ./node_modules/lodash-es/_getPrototype.js + + +/** Built-in value references. */ +var getPrototype = _overArg(Object.getPrototypeOf, Object); + +/* harmony default export */ var _getPrototype = (getPrototype); + +// CONCATENATED MODULE: ./node_modules/lodash-es/isObjectLike.js +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +/* harmony default export */ var lodash_es_isObjectLike = (isObjectLike); + +// CONCATENATED MODULE: ./node_modules/lodash-es/isPlainObject.js + + + + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + isPlainObject_objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var isPlainObject_hasOwnProperty = isPlainObject_objectProto.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!lodash_es_isObjectLike(value) || _baseGetTag(value) != objectTag) { + return false; + } + var proto = _getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = isPlainObject_hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +/* harmony default export */ var lodash_es_isPlainObject = (isPlainObject); + +// EXTERNAL MODULE: ./node_modules/symbol-observable/es/index.js +var es = __webpack_require__(2); + +// CONCATENATED MODULE: ./node_modules/redux/es/createStore.js + + + +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ +var ActionTypes = { + INIT: '@@redux/INIT' + + /** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [preloadedState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} [enhancer] The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ +};function createStore_createStore(reducer, preloadedState, enhancer) { + var _ref2; + + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { + enhancer = preloadedState; + preloadedState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error('Expected the enhancer to be a function.'); + } + + return enhancer(createStore_createStore)(reducer, preloadedState); + } + + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = preloadedState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error('Expected listener to be a function.'); + } + + var isSubscribed = true; + + ensureCanMutateNextListeners(); + nextListeners.push(listener); + + return function unsubscribe() { + if (!isSubscribed) { + return; + } + + isSubscribed = false; + + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!lodash_es_isPlainObject(action)) { + throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.'); + } + + if (typeof action.type === 'undefined') { + throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + var listeners = currentListeners = nextListeners; + for (var i = 0; i < listeners.length; i++) { + var listener = listeners[i]; + listener(); + } + + return action; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error('Expected the nextReducer to be a function.'); + } + + currentReducer = nextReducer; + dispatch({ type: ActionTypes.INIT }); + } + + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/tc39/proposal-observable + */ + function observable() { + var _ref; + + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + subscribe: function subscribe(observer) { + if (typeof observer !== 'object') { + throw new TypeError('Expected the observer to be an object.'); + } + + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { unsubscribe: unsubscribe }; + } + }, _ref[es["a" /* default */]] = function () { + return this; + }, _ref; + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[es["a" /* default */]] = observable, _ref2; +} +// CONCATENATED MODULE: ./node_modules/redux/es/utils/warning.js +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + /* eslint-disable no-empty */ + } catch (e) {} + /* eslint-enable no-empty */ +} +// CONCATENATED MODULE: ./node_modules/redux/es/combineReducers.js + + + + +function getUndefinedStateErrorMessage(key, action) { + var actionType = action && action.type; + var actionName = actionType && '"' + actionType.toString() + '"' || 'an action'; + + return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.'; +} + +function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { + var reducerKeys = Object.keys(reducers); + var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer'; + + if (reducerKeys.length === 0) { + return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; + } + + if (!lodash_es_isPlainObject(inputState)) { + return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"'); + } + + var unexpectedKeys = Object.keys(inputState).filter(function (key) { + return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; + }); + + unexpectedKeys.forEach(function (key) { + unexpectedKeyCache[key] = true; + }); + + if (unexpectedKeys.length > 0) { + return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.'); + } +} + +function assertReducerShape(reducers) { + Object.keys(reducers).forEach(function (key) { + var reducer = reducers[key]; + var initialState = reducer(undefined, { type: ActionTypes.INIT }); + + if (typeof initialState === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.'); + } + + var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.'); + if (typeof reducer(undefined, { type: type }) === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.'); + } + }); +} + +/** + * Turns an object whose values are different reducer functions, into a single + * reducer function. It will call every child reducer, and gather their results + * into a single state object, whose keys correspond to the keys of the passed + * reducer functions. + * + * @param {Object} reducers An object whose values correspond to different + * reducer functions that need to be combined into one. One handy way to obtain + * it is to use ES6 `import * as reducers` syntax. The reducers may never return + * undefined for any action. Instead, they should return their initial state + * if the state passed to them was undefined, and the current state for any + * unrecognized action. + * + * @returns {Function} A reducer function that invokes every reducer inside the + * passed object, and builds a state object with the same shape. + */ +function combineReducers(reducers) { + var reducerKeys = Object.keys(reducers); + var finalReducers = {}; + for (var i = 0; i < reducerKeys.length; i++) { + var key = reducerKeys[i]; + + if (false) {} + + if (typeof reducers[key] === 'function') { + finalReducers[key] = reducers[key]; + } + } + var finalReducerKeys = Object.keys(finalReducers); + + var unexpectedKeyCache = void 0; + if (false) {} + + var shapeAssertionError = void 0; + try { + assertReducerShape(finalReducers); + } catch (e) { + shapeAssertionError = e; + } + + return function combination() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var action = arguments[1]; + + if (shapeAssertionError) { + throw shapeAssertionError; + } + + if (false) { var warningMessage; } + + var hasChanged = false; + var nextState = {}; + for (var _i = 0; _i < finalReducerKeys.length; _i++) { + var _key = finalReducerKeys[_i]; + var reducer = finalReducers[_key]; + var previousStateForKey = state[_key]; + var nextStateForKey = reducer(previousStateForKey, action); + if (typeof nextStateForKey === 'undefined') { + var errorMessage = getUndefinedStateErrorMessage(_key, action); + throw new Error(errorMessage); + } + nextState[_key] = nextStateForKey; + hasChanged = hasChanged || nextStateForKey !== previousStateForKey; + } + return hasChanged ? nextState : state; + }; +} +// CONCATENATED MODULE: ./node_modules/redux/es/bindActionCreators.js +function bindActionCreator(actionCreator, dispatch) { + return function () { + return dispatch(actionCreator.apply(undefined, arguments)); + }; +} + +/** + * Turns an object whose values are action creators, into an object with the + * same keys, but with every function wrapped into a `dispatch` call so they + * may be invoked directly. This is just a convenience method, as you can call + * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. + * + * For convenience, you can also pass a single function as the first argument, + * and get a function in return. + * + * @param {Function|Object} actionCreators An object whose values are action + * creator functions. One handy way to obtain it is to use ES6 `import * as` + * syntax. You may also pass a single function. + * + * @param {Function} dispatch The `dispatch` function available on your Redux + * store. + * + * @returns {Function|Object} The object mimicking the original object, but with + * every action creator wrapped into the `dispatch` call. If you passed a + * function as `actionCreators`, the return value will also be a single + * function. + */ +function bindActionCreators(actionCreators, dispatch) { + if (typeof actionCreators === 'function') { + return bindActionCreator(actionCreators, dispatch); + } + + if (typeof actionCreators !== 'object' || actionCreators === null) { + throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?'); + } + + var keys = Object.keys(actionCreators); + var boundActionCreators = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var actionCreator = actionCreators[key]; + if (typeof actionCreator === 'function') { + boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); + } + } + return boundActionCreators; +} +// CONCATENATED MODULE: ./node_modules/redux/es/compose.js +/** + * Composes single-argument functions from right to left. The rightmost + * function can take multiple arguments as it provides the signature for + * the resulting composite function. + * + * @param {...Function} funcs The functions to compose. + * @returns {Function} A function obtained by composing the argument functions + * from right to left. For example, compose(f, g, h) is identical to doing + * (...args) => f(g(h(...args))). + */ + +function compose() { + for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } + + if (funcs.length === 1) { + return funcs[0]; + } + + return funcs.reduce(function (a, b) { + return function () { + return a(b.apply(undefined, arguments)); + }; + }); +} +// CONCATENATED MODULE: ./node_modules/redux/es/applyMiddleware.js +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +/** + * Creates a store enhancer that applies middleware to the dispatch method + * of the Redux store. This is handy for a variety of tasks, such as expressing + * asynchronous actions in a concise manner, or logging every action payload. + * + * See `redux-thunk` package as an example of the Redux middleware. + * + * Because middleware is potentially asynchronous, this should be the first + * store enhancer in the composition chain. + * + * Note that each middleware will be given the `dispatch` and `getState` functions + * as named arguments. + * + * @param {...Function} middlewares The middleware chain to be applied. + * @returns {Function} A store enhancer applying the middleware. + */ +function applyMiddleware() { + for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) { + middlewares[_key] = arguments[_key]; + } + + return function (createStore) { + return function (reducer, preloadedState, enhancer) { + var store = createStore(reducer, preloadedState, enhancer); + var _dispatch = store.dispatch; + var chain = []; + + var middlewareAPI = { + getState: store.getState, + dispatch: function dispatch(action) { + return _dispatch(action); + } + }; + chain = middlewares.map(function (middleware) { + return middleware(middlewareAPI); + }); + _dispatch = compose.apply(undefined, chain)(store.dispatch); + + return _extends({}, store, { + dispatch: _dispatch + }); + }; + }; +} +// CONCATENATED MODULE: ./node_modules/redux/es/index.js +/* concated harmony reexport createStore */__webpack_require__.d(__webpack_exports__, "createStore", function() { return createStore_createStore; }); +/* concated harmony reexport combineReducers */__webpack_require__.d(__webpack_exports__, "combineReducers", function() { return combineReducers; }); +/* concated harmony reexport bindActionCreators */__webpack_require__.d(__webpack_exports__, "bindActionCreators", function() { return bindActionCreators; }); +/* concated harmony reexport applyMiddleware */__webpack_require__.d(__webpack_exports__, "applyMiddleware", function() { return applyMiddleware; }); +/* concated harmony reexport compose */__webpack_require__.d(__webpack_exports__, "compose", function() { return compose; }); + + + + + + + +/* +* This is a dummy function to check if the function name has been altered by minification. +* If the function has been minified and NODE_ENV !== 'production', warn the user. +*/ +function isCrushed() {} + +if (false) {} + + + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return symbolObservablePonyfill; }); +function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; +}; + + +/***/ }), +/* 8 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/* harmony default export */ __webpack_exports__["a"] = (freeGlobal); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3))) + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(10); + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _fuse = _interopRequireDefault(__webpack_require__(11)); + +var _deepmerge = _interopRequireDefault(__webpack_require__(12)); + +var _store = _interopRequireDefault(__webpack_require__(13)); + +var _components = __webpack_require__(20); + +var _constants = __webpack_require__(1); + +var _templates = __webpack_require__(5); + +var _choices = __webpack_require__(28); + +var _items = __webpack_require__(29); + +var _groups = __webpack_require__(30); + +var _misc = __webpack_require__(31); + +var _general = __webpack_require__(32); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +/** + * Choices + * @author Josh Johnson + */ +var Choices = +/*#__PURE__*/ +function () { + function Choices() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-choice]'; + var userConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Choices); + + if ((0, _utils.isType)('String', element)) { + var elements = Array.from(document.querySelectorAll(element)); // If there are multiple elements, create a new instance + // for each element besides the first one (as that already has an instance) + + if (elements.length > 1) { + return this._generateInstances(elements, userConfig); + } + } + + this.config = _deepmerge.default.all([_constants.DEFAULT_CONFIG, Choices.userDefaults, userConfig], // When merging array configs, replace with a copy of the userConfig array, + // instead of concatenating with the default array + { + arrayMerge: function arrayMerge(destinationArray, sourceArray) { + return [].concat(sourceArray); + } + }); + var invalidConfigOptions = (0, _utils.diff)(this.config, _constants.DEFAULT_CONFIG); + + if (invalidConfigOptions.length) { + console.warn('Unknown config option(s) passed', invalidConfigOptions.join(', ')); + } + + if (!['auto', 'always'].includes(this.config.renderSelectedChoices)) { + this.config.renderSelectedChoices = 'auto'; + } // Retrieve triggering element (i.e. element with 'data-choice' trigger) + + + var passedElement = (0, _utils.isType)('String', element) ? document.querySelector(element) : element; + + if (!passedElement) { + return console.error('Could not find passed element or passed element was of an invalid type'); + } + + this._isTextElement = passedElement.type === 'text'; + this._isSelectOneElement = passedElement.type === 'select-one'; + this._isSelectMultipleElement = passedElement.type === 'select-multiple'; + this._isSelectElement = this._isSelectOneElement || this._isSelectMultipleElement; + + if (this._isTextElement) { + this.passedElement = new _components.WrappedInput({ + element: passedElement, + classNames: this.config.classNames, + delimiter: this.config.delimiter + }); + } else if (this._isSelectElement) { + this.passedElement = new _components.WrappedSelect({ + element: passedElement, + classNames: this.config.classNames + }); + } + + if (!this.passedElement) { + return console.error('Passed element was of an invalid type'); + } + + if (this.config.shouldSortItems === true && this._isSelectOneElement && !this.config.silent) { + console.warn("shouldSortElements: Type of passed element is 'select-one', falling back to false."); + } + + this.initialised = false; + this._store = new _store.default(this.render); + this._initialState = {}; + this._currentState = {}; + this._prevState = {}; + this._currentValue = ''; + this._canSearch = this.config.searchEnabled; + this._isScrollingOnIe = false; + this._highlightPosition = 0; + this._wasTap = true; + this._placeholderValue = this._generatePlaceholderValue(); + this._baseId = (0, _utils.generateId)(this.passedElement.element, 'choices-'); + this._direction = this.passedElement.element.getAttribute('dir') || 'ltr'; + this._idNames = { + itemChoice: 'item-choice' + }; // Assign preset choices from passed object + + this._presetChoices = this.config.choices; // Assign preset items from passed object first + + this._presetItems = this.config.items; // Then add any values passed from attribute + + if (this.passedElement.value) { + this._presetItems = this._presetItems.concat(this.passedElement.value.split(this.config.delimiter)); + } + + this._render = this._render.bind(this); + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + this._onKeyUp = this._onKeyUp.bind(this); + this._onKeyDown = this._onKeyDown.bind(this); + this._onClick = this._onClick.bind(this); + this._onTouchMove = this._onTouchMove.bind(this); + this._onTouchEnd = this._onTouchEnd.bind(this); + this._onMouseDown = this._onMouseDown.bind(this); + this._onMouseOver = this._onMouseOver.bind(this); + this._onFormReset = this._onFormReset.bind(this); + this._onAKey = this._onAKey.bind(this); + this._onEnterKey = this._onEnterKey.bind(this); + this._onEscapeKey = this._onEscapeKey.bind(this); + this._onDirectionKey = this._onDirectionKey.bind(this); + this._onDeleteKey = this._onDeleteKey.bind(this); // If element has already been initialised with Choices, fail silently + + if (this.passedElement.element.getAttribute('data-choice') === 'active') { + console.warn('Trying to initialise Choices on element already initialised'); + } // Let's go + + + this.init(); + } + /* ======================================== + = Public functions = + ======================================== */ + + + _createClass(Choices, [{ + key: "init", + value: function init() { + if (this.initialised) { + return; + } + + this._createTemplates(); + + this._createElements(); + + this._createStructure(); // Set initial state (We need to clone the state because some reducers + // modify the inner objects properties in the state) 🤢 + + + this._initialState = (0, _utils.cloneObject)(this._store.state); + + this._store.subscribe(this._render); + + this._render(); + + this._addEventListeners(); + + var shouldDisable = !this.config.addItems || this.passedElement.element.hasAttribute('disabled'); + + if (shouldDisable) { + this.disable(); + } + + this.initialised = true; + var callbackOnInit = this.config.callbackOnInit; // Run callback if it is a function + + if (callbackOnInit && (0, _utils.isType)('Function', callbackOnInit)) { + callbackOnInit.call(this); + } + } + }, { + key: "destroy", + value: function destroy() { + if (!this.initialised) { + return; + } + + this._removeEventListeners(); + + this.passedElement.reveal(); + this.containerOuter.unwrap(this.passedElement.element); + + if (this._isSelectElement) { + this.passedElement.options = this._presetChoices; + } + + this.clearStore(); + this.config.templates = null; + this.initialised = false; + } + }, { + key: "enable", + value: function enable() { + if (this.passedElement.isDisabled) { + this.passedElement.enable(); + } + + if (this.containerOuter.isDisabled) { + this._addEventListeners(); + + this.input.enable(); + this.containerOuter.enable(); + } + + return this; + } + }, { + key: "disable", + value: function disable() { + if (!this.passedElement.isDisabled) { + this.passedElement.disable(); + } + + if (!this.containerOuter.isDisabled) { + this._removeEventListeners(); + + this.input.disable(); + this.containerOuter.disable(); + } + + return this; + } + }, { + key: "highlightItem", + value: function highlightItem(item) { + var runEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!item) { + return this; + } + + var id = item.id, + _item$groupId = item.groupId, + groupId = _item$groupId === void 0 ? -1 : _item$groupId, + _item$value = item.value, + value = _item$value === void 0 ? '' : _item$value, + _item$label = item.label, + label = _item$label === void 0 ? '' : _item$label; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.highlightItem)(id, true)); + + if (runEvent) { + this.passedElement.triggerEvent(_constants.EVENTS.highlightItem, { + id: id, + value: value, + label: label, + groupValue: group && group.value ? group.value : null + }); + } + + return this; + } + }, { + key: "unhighlightItem", + value: function unhighlightItem(item) { + if (!item) { + return this; + } + + var id = item.id, + _item$groupId2 = item.groupId, + groupId = _item$groupId2 === void 0 ? -1 : _item$groupId2, + _item$value2 = item.value, + value = _item$value2 === void 0 ? '' : _item$value2, + _item$label2 = item.label, + label = _item$label2 === void 0 ? '' : _item$label2; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.highlightItem)(id, false)); + + this.passedElement.triggerEvent(_constants.EVENTS.highlightItem, { + id: id, + value: value, + label: label, + groupValue: group && group.value ? group.value : null + }); + return this; + } + }, { + key: "highlightAll", + value: function highlightAll() { + var _this = this; + + this._store.items.forEach(function (item) { + return _this.highlightItem(item); + }); + + return this; + } + }, { + key: "unhighlightAll", + value: function unhighlightAll() { + var _this2 = this; + + this._store.items.forEach(function (item) { + return _this2.unhighlightItem(item); + }); + + return this; + } + }, { + key: "removeActiveItemsByValue", + value: function removeActiveItemsByValue(value) { + var _this3 = this; + + this._store.activeItems.filter(function (item) { + return item.value === value; + }).forEach(function (item) { + return _this3._removeItem(item); + }); + + return this; + } + }, { + key: "removeActiveItems", + value: function removeActiveItems(excludedId) { + var _this4 = this; + + this._store.activeItems.filter(function (_ref) { + var id = _ref.id; + return id !== excludedId; + }).forEach(function (item) { + return _this4._removeItem(item); + }); + + return this; + } + }, { + key: "removeHighlightedItems", + value: function removeHighlightedItems() { + var _this5 = this; + + var runEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this._store.highlightedActiveItems.forEach(function (item) { + _this5._removeItem(item); // If this action was performed by the user + // trigger the event + + + if (runEvent) { + _this5._triggerChange(item.value); + } + }); + + return this; + } + }, { + key: "showDropdown", + value: function showDropdown(preventInputFocus) { + var _this6 = this; + + if (this.dropdown.isActive) { + return this; + } + + requestAnimationFrame(function () { + _this6.dropdown.show(); + + _this6.containerOuter.open(_this6.dropdown.distanceFromTopWindow()); + + if (!preventInputFocus && _this6._canSearch) { + _this6.input.focus(); + } + + _this6.passedElement.triggerEvent(_constants.EVENTS.showDropdown, {}); + }); + return this; + } + }, { + key: "hideDropdown", + value: function hideDropdown(preventInputBlur) { + var _this7 = this; + + if (!this.dropdown.isActive) { + return this; + } + + requestAnimationFrame(function () { + _this7.dropdown.hide(); + + _this7.containerOuter.close(); + + if (!preventInputBlur && _this7._canSearch) { + _this7.input.removeActiveDescendant(); + + _this7.input.blur(); + } + + _this7.passedElement.triggerEvent(_constants.EVENTS.hideDropdown, {}); + }); + return this; + } + }, { + key: "getValue", + value: function getValue() { + var valueOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var values = this._store.activeItems.reduce(function (selectedItems, item) { + var itemValue = valueOnly ? item.value : item; + selectedItems.push(itemValue); + return selectedItems; + }, []); + + return this._isSelectOneElement ? values[0] : values; + } + }, { + key: "setValue", + value: function setValue(args) { + var _this8 = this; + + if (!this.initialised) { + return this; + } + + [].concat(args).forEach(function (value) { + return _this8._setChoiceOrItem(value); + }); + return this; + } + }, { + key: "setChoiceByValue", + value: function setChoiceByValue(value) { + var _this9 = this; + + if (!this.initialised || this._isTextElement) { + return this; + } // If only one value has been passed, convert to array + + + var choiceValue = (0, _utils.isType)('Array', value) ? value : [value]; // Loop through each value and + + choiceValue.forEach(function (val) { + return _this9._findAndSelectChoiceByValue(val); + }); + return this; + } + }, { + key: "setChoices", + value: function setChoices() { + var _this10 = this; + + var choices = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var replaceChoices = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (!this._isSelectElement || !value) { + return this; + } // Clear choices if needed + + + if (replaceChoices) { + this.clearChoices(); + } + + this.containerOuter.removeLoadingState(); + + var addGroupsAndChoices = function addGroupsAndChoices(groupOrChoice) { + if (groupOrChoice.choices) { + _this10._addGroup({ + group: groupOrChoice, + id: groupOrChoice.id || null, + valueKey: value, + labelKey: label + }); + } else { + _this10._addChoice({ + value: groupOrChoice[value], + label: groupOrChoice[label], + isSelected: groupOrChoice.selected, + isDisabled: groupOrChoice.disabled, + customProperties: groupOrChoice.customProperties, + placeholder: groupOrChoice.placeholder + }); + } + }; + + this._setLoading(true); + + choices.forEach(addGroupsAndChoices); + + this._setLoading(false); + + return this; + } + }, { + key: "clearChoices", + value: function clearChoices() { + this._store.dispatch((0, _choices.clearChoices)()); + } + }, { + key: "clearStore", + value: function clearStore() { + this._store.dispatch((0, _misc.clearAll)()); + + return this; + } + }, { + key: "clearInput", + value: function clearInput() { + var shouldSetInputWidth = !this._isSelectOneElement; + this.input.clear(shouldSetInputWidth); + + if (!this._isTextElement && this._canSearch) { + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } + + return this; + } + }, { + key: "ajax", + value: function ajax(fn) { + var _this11 = this; + + if (!this.initialised || !this._isSelectElement || !fn) { + return this; + } + + requestAnimationFrame(function () { + return _this11._handleLoadingState(true); + }); + fn(this._ajaxCallback()); + return this; + } + /* ===== End of Public functions ====== */ + + /* ============================================= + = Private functions = + ============================================= */ + + }, { + key: "_render", + value: function _render() { + if (this._store.isLoading()) { + return; + } + + this._currentState = this._store.state; + var stateChanged = this._currentState.choices !== this._prevState.choices || this._currentState.groups !== this._prevState.groups || this._currentState.items !== this._prevState.items; + var shouldRenderChoices = this._isSelectElement; + var shouldRenderItems = this._currentState.items !== this._prevState.items; + + if (!stateChanged) { + return; + } + + if (shouldRenderChoices) { + this._renderChoices(); + } + + if (shouldRenderItems) { + this._renderItems(); + } + + this._prevState = this._currentState; + } + }, { + key: "_renderChoices", + value: function _renderChoices() { + var _this12 = this; + + var _this$_store = this._store, + activeGroups = _this$_store.activeGroups, + activeChoices = _this$_store.activeChoices; + var choiceListFragment = document.createDocumentFragment(); + this.choiceList.clear(); + + if (this.config.resetScrollPosition) { + requestAnimationFrame(function () { + return _this12.choiceList.scrollToTop(); + }); + } // If we have grouped options + + + if (activeGroups.length >= 1 && !this._isSearching) { + // If we have a placeholder choice along with groups + var activePlaceholders = activeChoices.filter(function (activeChoice) { + return activeChoice.placeholder === true && activeChoice.groupId === -1; + }); + + if (activePlaceholders.length >= 1) { + choiceListFragment = this._createChoicesFragment(activePlaceholders, choiceListFragment); + } + + choiceListFragment = this._createGroupsFragment(activeGroups, activeChoices, choiceListFragment); + } else if (activeChoices.length >= 1) { + choiceListFragment = this._createChoicesFragment(activeChoices, choiceListFragment); + } // If we have choices to show + + + if (choiceListFragment.childNodes && choiceListFragment.childNodes.length > 0) { + var activeItems = this._store.activeItems; + + var canAddItem = this._canAddItem(activeItems, this.input.value); // ...and we can select them + + + if (canAddItem.response) { + // ...append them and highlight the first choice + this.choiceList.append(choiceListFragment); + + this._highlightChoice(); + } else { + // ...otherwise show a notice + this.choiceList.append(this._getTemplate('notice', canAddItem.notice)); + } + } else { + // Otherwise show a notice + var dropdownItem; + var notice; + + if (this._isSearching) { + notice = (0, _utils.isType)('Function', this.config.noResultsText) ? this.config.noResultsText() : this.config.noResultsText; + dropdownItem = this._getTemplate('notice', notice, 'no-results'); + } else { + notice = (0, _utils.isType)('Function', this.config.noChoicesText) ? this.config.noChoicesText() : this.config.noChoicesText; + dropdownItem = this._getTemplate('notice', notice, 'no-choices'); + } + + this.choiceList.append(dropdownItem); + } + } + }, { + key: "_renderItems", + value: function _renderItems() { + var activeItems = this._store.activeItems || []; + this.itemList.clear(); // Create a fragment to store our list items + // (so we don't have to update the DOM for each item) + + var itemListFragment = this._createItemsFragment(activeItems); // If we have items to add, append them + + + if (itemListFragment.childNodes) { + this.itemList.append(itemListFragment); + } + } + }, { + key: "_createGroupsFragment", + value: function _createGroupsFragment(groups, choices, fragment) { + var _this13 = this; + + var groupFragment = fragment || document.createDocumentFragment(); + + var getGroupChoices = function getGroupChoices(group) { + return choices.filter(function (choice) { + if (_this13._isSelectOneElement) { + return choice.groupId === group.id; + } + + return choice.groupId === group.id && (_this13.config.renderSelectedChoices === 'always' || !choice.selected); + }); + }; // If sorting is enabled, filter groups + + + if (this.config.shouldSort) { + groups.sort(this.config.sortFn); + } + + groups.forEach(function (group) { + var groupChoices = getGroupChoices(group); + + if (groupChoices.length >= 1) { + var dropdownGroup = _this13._getTemplate('choiceGroup', group); + + groupFragment.appendChild(dropdownGroup); + + _this13._createChoicesFragment(groupChoices, groupFragment, true); + } + }); + return groupFragment; + } + }, { + key: "_createChoicesFragment", + value: function _createChoicesFragment(choices, fragment) { + var _this14 = this; + + var withinGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + // Create a fragment to store our list items (so we don't have to update the DOM for each item) + var choicesFragment = fragment || document.createDocumentFragment(); + var _this$config = this.config, + renderSelectedChoices = _this$config.renderSelectedChoices, + searchResultLimit = _this$config.searchResultLimit, + renderChoiceLimit = _this$config.renderChoiceLimit; + var filter = this._isSearching ? _utils.sortByScore : this.config.sortFn; + + var appendChoice = function appendChoice(choice) { + var shouldRender = renderSelectedChoices === 'auto' ? _this14._isSelectOneElement || !choice.selected : true; + + if (shouldRender) { + var dropdownItem = _this14._getTemplate('choice', choice, _this14.config.itemSelectText); + + choicesFragment.appendChild(dropdownItem); + } + }; + + var rendererableChoices = choices; + + if (renderSelectedChoices === 'auto' && !this._isSelectOneElement) { + rendererableChoices = choices.filter(function (choice) { + return !choice.selected; + }); + } // Split array into placeholders and "normal" choices + + + var _rendererableChoices$ = rendererableChoices.reduce(function (acc, choice) { + if (choice.placeholder) { + acc.placeholderChoices.push(choice); + } else { + acc.normalChoices.push(choice); + } + + return acc; + }, { + placeholderChoices: [], + normalChoices: [] + }), + placeholderChoices = _rendererableChoices$.placeholderChoices, + normalChoices = _rendererableChoices$.normalChoices; // If sorting is enabled or the user is searching, filter choices + + + if (this.config.shouldSort || this._isSearching) { + normalChoices.sort(filter); + } + + var choiceLimit = rendererableChoices.length; // Prepend placeholeder + + var sortedChoices = [].concat(placeholderChoices, normalChoices); + + if (this._isSearching) { + choiceLimit = searchResultLimit; + } else if (renderChoiceLimit > 0 && !withinGroup) { + choiceLimit = renderChoiceLimit; + } // Add each choice to dropdown within range + + + for (var i = 0; i < choiceLimit; i += 1) { + if (sortedChoices[i]) { + appendChoice(sortedChoices[i]); + } + } + + return choicesFragment; + } + }, { + key: "_createItemsFragment", + value: function _createItemsFragment(items) { + var _this15 = this; + + var fragment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + // Create fragment to add elements to + var _this$config2 = this.config, + shouldSortItems = _this$config2.shouldSortItems, + sortFn = _this$config2.sortFn, + removeItemButton = _this$config2.removeItemButton; + var itemListFragment = fragment || document.createDocumentFragment(); // If sorting is enabled, filter items + + if (shouldSortItems && !this._isSelectOneElement) { + items.sort(sortFn); + } + + if (this._isTextElement) { + // Update the value of the hidden input + this.passedElement.value = items; + } else { + // Update the options of the hidden input + this.passedElement.options = items; + } + + var addItemToFragment = function addItemToFragment(item) { + // Create new list element + var listItem = _this15._getTemplate('item', item, removeItemButton); // Append it to list + + + itemListFragment.appendChild(listItem); + }; // Add each list item to list + + + items.forEach(function (item) { + return addItemToFragment(item); + }); + return itemListFragment; + } + }, { + key: "_triggerChange", + value: function _triggerChange(value) { + if (value === undefined || value === null) { + return; + } + + this.passedElement.triggerEvent(_constants.EVENTS.change, { + value: value + }); + } + }, { + key: "_selectPlaceholderChoice", + value: function _selectPlaceholderChoice() { + var placeholderChoice = this._store.placeholderChoice; + + if (placeholderChoice) { + this._addItem({ + value: placeholderChoice.value, + label: placeholderChoice.label, + choiceId: placeholderChoice.id, + groupId: placeholderChoice.groupId, + placeholder: placeholderChoice.placeholder + }); + + this._triggerChange(placeholderChoice.value); + } + } + }, { + key: "_handleButtonAction", + value: function _handleButtonAction(activeItems, element) { + if (!activeItems || !element || !this.config.removeItems || !this.config.removeItemButton) { + return; + } + + var itemId = element.parentNode.getAttribute('data-id'); + var itemToRemove = activeItems.find(function (item) { + return item.id === parseInt(itemId, 10); + }); // Remove item associated with button + + this._removeItem(itemToRemove); + + this._triggerChange(itemToRemove.value); + + if (this._isSelectOneElement) { + this._selectPlaceholderChoice(); + } + } + }, { + key: "_handleItemAction", + value: function _handleItemAction(activeItems, element) { + var _this16 = this; + + var hasShiftKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (!activeItems || !element || !this.config.removeItems || this._isSelectOneElement) { + return; + } + + var passedId = element.getAttribute('data-id'); // We only want to select one item with a click + // so we deselect any items that aren't the target + // unless shift is being pressed + + activeItems.forEach(function (item) { + if (item.id === parseInt(passedId, 10) && !item.highlighted) { + _this16.highlightItem(item); + } else if (!hasShiftKey && item.highlighted) { + _this16.unhighlightItem(item); + } + }); // Focus input as without focus, a user cannot do anything with a + // highlighted item + + this.input.focus(); + } + }, { + key: "_handleChoiceAction", + value: function _handleChoiceAction(activeItems, element) { + if (!activeItems || !element) { + return; + } // If we are clicking on an option + + + var id = element.getAttribute('data-id'); + + var choice = this._store.getChoiceById(id); + + var passedKeyCode = activeItems[0] && activeItems[0].keyCode ? activeItems[0].keyCode : null; + var hasActiveDropdown = this.dropdown.isActive; // Update choice keyCode + + choice.keyCode = passedKeyCode; + this.passedElement.triggerEvent(_constants.EVENTS.choice, { + choice: choice + }); + + if (choice && !choice.selected && !choice.disabled) { + var canAddItem = this._canAddItem(activeItems, choice.value); + + if (canAddItem.response) { + this._addItem({ + value: choice.value, + label: choice.label, + choiceId: choice.id, + groupId: choice.groupId, + customProperties: choice.customProperties, + placeholder: choice.placeholder, + keyCode: choice.keyCode + }); + + this._triggerChange(choice.value); + } + } + + this.clearInput(); // We wont to close the dropdown if we are dealing with a single select box + + if (hasActiveDropdown && this._isSelectOneElement) { + this.hideDropdown(true); + this.containerOuter.focus(); + } + } + }, { + key: "_handleBackspace", + value: function _handleBackspace(activeItems) { + if (!this.config.removeItems || !activeItems) { + return; + } + + var lastItem = activeItems[activeItems.length - 1]; + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); // If editing the last item is allowed and there are not other selected items, + // we can edit the item value. Otherwise if we can remove items, remove all selected items + + if (this.config.editItems && !hasHighlightedItems && lastItem) { + this.input.value = lastItem.value; + this.input.setWidth(); + + this._removeItem(lastItem); + + this._triggerChange(lastItem.value); + } else { + if (!hasHighlightedItems) { + // Highlight last item if none already highlighted + this.highlightItem(lastItem, false); + } + + this.removeHighlightedItems(true); + } + } + }, { + key: "_setLoading", + value: function _setLoading(isLoading) { + this._store.dispatch((0, _general.setIsLoading)(isLoading)); + } + }, { + key: "_handleLoadingState", + value: function _handleLoadingState() { + var setLoading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var placeholderItem = this.itemList.getChild(".".concat(this.config.classNames.placeholder)); + + if (setLoading) { + this.disable(); + this.containerOuter.addLoadingState(); + + if (this._isSelectOneElement) { + if (!placeholderItem) { + placeholderItem = this._getTemplate('placeholder', this.config.loadingText); + this.itemList.append(placeholderItem); + } else { + placeholderItem.innerHTML = this.config.loadingText; + } + } else { + this.input.placeholder = this.config.loadingText; + } + } else { + this.enable(); + this.containerOuter.removeLoadingState(); + + if (this._isSelectOneElement) { + placeholderItem.innerHTML = this._placeholderValue || ''; + } else { + this.input.placeholder = this._placeholderValue || ''; + } + } + } + }, { + key: "_handleSearch", + value: function _handleSearch(value) { + if (!value || !this.input.isFocussed) { + return; + } + + var choices = this._store.choices; + var _this$config3 = this.config, + searchFloor = _this$config3.searchFloor, + searchChoices = _this$config3.searchChoices; + var hasUnactiveChoices = choices.some(function (option) { + return !option.active; + }); // Check that we have a value to search and the input was an alphanumeric character + + if (value && value.length >= searchFloor) { + var resultCount = searchChoices ? this._searchChoices(value) : 0; // Trigger search event + + this.passedElement.triggerEvent(_constants.EVENTS.search, { + value: value, + resultCount: resultCount + }); + } else if (hasUnactiveChoices) { + // Otherwise reset choices to active + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } + } + }, { + key: "_canAddItem", + value: function _canAddItem(activeItems, value) { + var canAddItem = true; + var notice = (0, _utils.isType)('Function', this.config.addItemText) ? this.config.addItemText(value) : this.config.addItemText; + + if (!this._isSelectOneElement) { + var isDuplicateValue = (0, _utils.existsInArray)(activeItems, value); + + if (this.config.maxItemCount > 0 && this.config.maxItemCount <= activeItems.length) { + // If there is a max entry limit and we have reached that limit + // don't update + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.maxItemText) ? this.config.maxItemText(this.config.maxItemCount) : this.config.maxItemText; + } + + if (!this.config.duplicateItemsAllowed && isDuplicateValue && canAddItem) { + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.uniqueItemText) ? this.config.uniqueItemText(value) : this.config.uniqueItemText; + } + + if (this._isTextElement && this.config.addItems && canAddItem && (0, _utils.isType)('Function', this.config.addItemFilterFn) && !this.config.addItemFilterFn(value)) { + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.customAddItemText) ? this.config.customAddItemText(value) : this.config.customAddItemText; + } + } + + return { + response: canAddItem, + notice: notice + }; + } + }, { + key: "_ajaxCallback", + value: function _ajaxCallback() { + var _this17 = this; + + return function (results, value, label) { + if (!results || !value) { + return; + } + + var parsedResults = (0, _utils.isType)('Object', results) ? [results] : results; + + if (parsedResults && (0, _utils.isType)('Array', parsedResults) && parsedResults.length) { + // Remove loading states/text + _this17._handleLoadingState(false); + + _this17._setLoading(true); // Add each result as a choice + + + parsedResults.forEach(function (result) { + if (result.choices) { + _this17._addGroup({ + group: result, + id: result.id || null, + valueKey: value, + labelKey: label + }); + } else { + _this17._addChoice({ + value: (0, _utils.fetchFromObject)(result, value), + label: (0, _utils.fetchFromObject)(result, label), + isSelected: result.selected, + isDisabled: result.disabled, + customProperties: result.customProperties, + placeholder: result.placeholder + }); + } + }); + + _this17._setLoading(false); + + if (_this17._isSelectOneElement) { + _this17._selectPlaceholderChoice(); + } + } else { + // No results, remove loading state + _this17._handleLoadingState(false); + } + }; + } + }, { + key: "_searchChoices", + value: function _searchChoices(value) { + var newValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var currentValue = (0, _utils.isType)('String', this._currentValue) ? this._currentValue.trim() : this._currentValue; + + if (newValue.length < 1 && newValue === "".concat(currentValue, " ")) { + return 0; + } // If new value matches the desired length and is not the same as the current value with a space + + + var haystack = this._store.searchableChoices; + var needle = newValue; + var keys = [].concat(this.config.searchFields); + var options = Object.assign(this.config.fuseOptions, { + keys: keys + }); + var fuse = new _fuse.default(haystack, options); + var results = fuse.search(needle); + this._currentValue = newValue; + this._highlightPosition = 0; + this._isSearching = true; + + this._store.dispatch((0, _choices.filterChoices)(results)); + + return results.length; + } + }, { + key: "_addEventListeners", + value: function _addEventListeners() { + document.addEventListener('keyup', this._onKeyUp); + document.addEventListener('keydown', this._onKeyDown); + document.addEventListener('click', this._onClick); + document.addEventListener('touchmove', this._onTouchMove); + document.addEventListener('touchend', this._onTouchEnd); + document.addEventListener('mousedown', this._onMouseDown); + document.addEventListener('mouseover', this._onMouseOver); + + if (this._isSelectOneElement) { + this.containerOuter.element.addEventListener('focus', this._onFocus); + this.containerOuter.element.addEventListener('blur', this._onBlur); + } + + this.input.element.addEventListener('focus', this._onFocus); + this.input.element.addEventListener('blur', this._onBlur); + + if (this.input.element.form) { + this.input.element.form.addEventListener('reset', this._onFormReset); + } + + this.input.addEventListeners(); + } + }, { + key: "_removeEventListeners", + value: function _removeEventListeners() { + document.removeEventListener('keyup', this._onKeyUp); + document.removeEventListener('keydown', this._onKeyDown); + document.removeEventListener('click', this._onClick); + document.removeEventListener('touchmove', this._onTouchMove); + document.removeEventListener('touchend', this._onTouchEnd); + document.removeEventListener('mousedown', this._onMouseDown); + document.removeEventListener('mouseover', this._onMouseOver); + + if (this._isSelectOneElement) { + this.containerOuter.element.removeEventListener('focus', this._onFocus); + this.containerOuter.element.removeEventListener('blur', this._onBlur); + } + + this.input.element.removeEventListener('focus', this._onFocus); + this.input.element.removeEventListener('blur', this._onBlur); + + if (this.input.element.form) { + this.input.element.form.removeEventListener('reset', this._onFormReset); + } + + this.input.removeEventListeners(); + } + }, { + key: "_onKeyDown", + value: function _onKeyDown(event) { + var _keyDownActions; + + var target = event.target, + keyCode = event.keyCode, + ctrlKey = event.ctrlKey, + metaKey = event.metaKey; + + if (target !== this.input.element && !this.containerOuter.element.contains(target)) { + return; + } + + var activeItems = this._store.activeItems; + var hasFocusedInput = this.input.isFocussed; + var hasActiveDropdown = this.dropdown.isActive; + var hasItems = this.itemList.hasChildren; + var keyString = String.fromCharCode(keyCode); + var BACK_KEY = _constants.KEY_CODES.BACK_KEY, + DELETE_KEY = _constants.KEY_CODES.DELETE_KEY, + ENTER_KEY = _constants.KEY_CODES.ENTER_KEY, + A_KEY = _constants.KEY_CODES.A_KEY, + ESC_KEY = _constants.KEY_CODES.ESC_KEY, + UP_KEY = _constants.KEY_CODES.UP_KEY, + DOWN_KEY = _constants.KEY_CODES.DOWN_KEY, + PAGE_UP_KEY = _constants.KEY_CODES.PAGE_UP_KEY, + PAGE_DOWN_KEY = _constants.KEY_CODES.PAGE_DOWN_KEY; + var hasCtrlDownKeyPressed = ctrlKey || metaKey; // If a user is typing and the dropdown is not active + + if (!this._isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString)) { + this.showDropdown(); + } // Map keys to key actions + + + var keyDownActions = (_keyDownActions = {}, _defineProperty(_keyDownActions, A_KEY, this._onAKey), _defineProperty(_keyDownActions, ENTER_KEY, this._onEnterKey), _defineProperty(_keyDownActions, ESC_KEY, this._onEscapeKey), _defineProperty(_keyDownActions, UP_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, PAGE_UP_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, DOWN_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, PAGE_DOWN_KEY, this._onDirectionKey), _defineProperty(_keyDownActions, DELETE_KEY, this._onDeleteKey), _defineProperty(_keyDownActions, BACK_KEY, this._onDeleteKey), _keyDownActions); // If keycode has a function, run it + + if (keyDownActions[keyCode]) { + keyDownActions[keyCode]({ + event: event, + target: target, + keyCode: keyCode, + metaKey: metaKey, + activeItems: activeItems, + hasFocusedInput: hasFocusedInput, + hasActiveDropdown: hasActiveDropdown, + hasItems: hasItems, + hasCtrlDownKeyPressed: hasCtrlDownKeyPressed + }); + } + } + }, { + key: "_onKeyUp", + value: function _onKeyUp(_ref2) { + var target = _ref2.target, + keyCode = _ref2.keyCode; + + if (target !== this.input.element) { + return; + } + + var value = this.input.value; + var activeItems = this._store.activeItems; + + var canAddItem = this._canAddItem(activeItems, value); + + var backKey = _constants.KEY_CODES.BACK_KEY, + deleteKey = _constants.KEY_CODES.DELETE_KEY; // We are typing into a text input and have a value, we want to show a dropdown + // notice. Otherwise hide the dropdown + + if (this._isTextElement) { + var canShowDropdownNotice = canAddItem.notice && value; + + if (canShowDropdownNotice) { + var dropdownItem = this._getTemplate('notice', canAddItem.notice); + + this.dropdown.element.innerHTML = dropdownItem.outerHTML; + this.showDropdown(true); + } else { + this.hideDropdown(true); + } + } else { + var userHasRemovedValue = (keyCode === backKey || keyCode === deleteKey) && !target.value; + var canReactivateChoices = !this._isTextElement && this._isSearching; + var canSearch = this._canSearch && canAddItem.response; + + if (userHasRemovedValue && canReactivateChoices) { + this._isSearching = false; + + this._store.dispatch((0, _choices.activateChoices)(true)); + } else if (canSearch) { + this._handleSearch(this.input.value); + } + } + + this._canSearch = this.config.searchEnabled; + } + }, { + key: "_onAKey", + value: function _onAKey(_ref3) { + var hasItems = _ref3.hasItems, + hasCtrlDownKeyPressed = _ref3.hasCtrlDownKeyPressed; + + // If CTRL + A or CMD + A have been pressed and there are items to select + if (hasCtrlDownKeyPressed && hasItems) { + this._canSearch = false; + var shouldHightlightAll = this.config.removeItems && !this.input.value && this.input.element === document.activeElement; + + if (shouldHightlightAll) { + this.highlightAll(); + } + } + } + }, { + key: "_onEnterKey", + value: function _onEnterKey(_ref4) { + var event = _ref4.event, + target = _ref4.target, + activeItems = _ref4.activeItems, + hasActiveDropdown = _ref4.hasActiveDropdown; + var enterKey = _constants.KEY_CODES.ENTER_KEY; + var targetWasButton = target.hasAttribute('data-button'); + + if (this._isTextElement && target.value) { + var value = this.input.value; + + var canAddItem = this._canAddItem(activeItems, value); + + if (canAddItem.response) { + this.hideDropdown(true); + + this._addItem({ + value: value + }); + + this._triggerChange(value); + + this.clearInput(); + } + } + + if (targetWasButton) { + this._handleButtonAction(activeItems, target); + + event.preventDefault(); + } + + if (hasActiveDropdown) { + var highlightedChoice = this.dropdown.getChild(".".concat(this.config.classNames.highlightedState)); + + if (highlightedChoice) { + // add enter keyCode value + if (activeItems[0]) { + activeItems[0].keyCode = enterKey; // eslint-disable-line no-param-reassign + } + + this._handleChoiceAction(activeItems, highlightedChoice); + } + + event.preventDefault(); + } else if (this._isSelectOneElement) { + this.showDropdown(); + event.preventDefault(); + } + } + }, { + key: "_onEscapeKey", + value: function _onEscapeKey(_ref5) { + var hasActiveDropdown = _ref5.hasActiveDropdown; + + if (hasActiveDropdown) { + this.hideDropdown(true); + this.containerOuter.focus(); + } + } + }, { + key: "_onDirectionKey", + value: function _onDirectionKey(_ref6) { + var event = _ref6.event, + hasActiveDropdown = _ref6.hasActiveDropdown, + keyCode = _ref6.keyCode, + metaKey = _ref6.metaKey; + var downKey = _constants.KEY_CODES.DOWN_KEY, + pageUpKey = _constants.KEY_CODES.PAGE_UP_KEY, + pageDownKey = _constants.KEY_CODES.PAGE_DOWN_KEY; // If up or down key is pressed, traverse through options + + if (hasActiveDropdown || this._isSelectOneElement) { + this.showDropdown(); + this._canSearch = false; + var directionInt = keyCode === downKey || keyCode === pageDownKey ? 1 : -1; + var skipKey = metaKey || keyCode === pageDownKey || keyCode === pageUpKey; + var selectableChoiceIdentifier = '[data-choice-selectable]'; + var nextEl; + + if (skipKey) { + if (directionInt > 0) { + nextEl = Array.from(this.dropdown.element.querySelectorAll(selectableChoiceIdentifier)).pop(); + } else { + nextEl = this.dropdown.element.querySelector(selectableChoiceIdentifier); + } + } else { + var currentEl = this.dropdown.element.querySelector(".".concat(this.config.classNames.highlightedState)); + + if (currentEl) { + nextEl = (0, _utils.getAdjacentEl)(currentEl, selectableChoiceIdentifier, directionInt); + } else { + nextEl = this.dropdown.element.querySelector(selectableChoiceIdentifier); + } + } + + if (nextEl) { + // We prevent default to stop the cursor moving + // when pressing the arrow + if (!(0, _utils.isScrolledIntoView)(nextEl, this.choiceList.element, directionInt)) { + this.choiceList.scrollToChoice(nextEl, directionInt); + } + + this._highlightChoice(nextEl); + } // Prevent default to maintain cursor position whilst + // traversing dropdown options + + + event.preventDefault(); + } + } + }, { + key: "_onDeleteKey", + value: function _onDeleteKey(_ref7) { + var event = _ref7.event, + target = _ref7.target, + hasFocusedInput = _ref7.hasFocusedInput, + activeItems = _ref7.activeItems; + + // If backspace or delete key is pressed and the input has no value + if (hasFocusedInput && !target.value && !this._isSelectOneElement) { + this._handleBackspace(activeItems); + + event.preventDefault(); + } + } + }, { + key: "_onTouchMove", + value: function _onTouchMove() { + if (this._wasTap) { + this._wasTap = false; + } + } + }, { + key: "_onTouchEnd", + value: function _onTouchEnd(event) { + var _ref8 = event || event.touches[0], + target = _ref8.target; + + var touchWasWithinContainer = this._wasTap && this.containerOuter.element.contains(target); + + if (touchWasWithinContainer) { + var containerWasExactTarget = target === this.containerOuter.element || target === this.containerInner.element; + + if (containerWasExactTarget) { + if (this._isTextElement) { + this.input.focus(); + } else if (this._isSelectMultipleElement) { + this.showDropdown(); + } + } // Prevents focus event firing + + + event.stopPropagation(); + } + + this._wasTap = true; + } + }, { + key: "_onMouseDown", + value: function _onMouseDown(event) { + var target = event.target, + shiftKey = event.shiftKey; // If we have our mouse down on the scrollbar and are on IE11... + + if (this.choiceList.element.contains(target) && (0, _utils.isIE11)()) { + this._isScrollingOnIe = true; + } + + if (!this.containerOuter.element.contains(target) || target === this.input.element) { + return; + } + + var activeItems = this._store.activeItems; + var hasShiftKey = shiftKey; + var buttonTarget = (0, _utils.findAncestorByAttrName)(target, 'data-button'); + var itemTarget = (0, _utils.findAncestorByAttrName)(target, 'data-item'); + var choiceTarget = (0, _utils.findAncestorByAttrName)(target, 'data-choice'); + + if (buttonTarget) { + this._handleButtonAction(activeItems, buttonTarget); + } else if (itemTarget) { + this._handleItemAction(activeItems, itemTarget, hasShiftKey); + } else if (choiceTarget) { + this._handleChoiceAction(activeItems, choiceTarget); + } + + event.preventDefault(); + } + }, { + key: "_onMouseOver", + value: function _onMouseOver(_ref9) { + var target = _ref9.target; + var targetWithinDropdown = target === this.dropdown || this.dropdown.element.contains(target); + var shouldHighlightChoice = targetWithinDropdown && target.hasAttribute('data-choice'); + + if (shouldHighlightChoice) { + this._highlightChoice(target); + } + } + }, { + key: "_onClick", + value: function _onClick(_ref10) { + var target = _ref10.target; + var clickWasWithinContainer = this.containerOuter.element.contains(target); + + if (clickWasWithinContainer) { + if (!this.dropdown.isActive && !this.containerOuter.isDisabled) { + if (this._isTextElement) { + if (document.activeElement !== this.input.element) { + this.input.focus(); + } + } else { + this.showDropdown(); + this.containerOuter.focus(); + } + } else if (this._isSelectOneElement && target !== this.input.element && !this.dropdown.element.contains(target)) { + this.hideDropdown(); + } + } else { + var hasHighlightedItems = this._store.highlightedActiveItems; + + if (hasHighlightedItems) { + this.unhighlightAll(); + } + + this.containerOuter.removeFocusState(); + this.hideDropdown(true); + } + } + }, { + key: "_onFocus", + value: function _onFocus(_ref11) { + var _this18 = this; + + var target = _ref11.target; + var focusWasWithinContainer = this.containerOuter.element.contains(target); + + if (!focusWasWithinContainer) { + return; + } + + var focusActions = { + text: function text() { + if (target === _this18.input.element) { + _this18.containerOuter.addFocusState(); + } + }, + 'select-one': function selectOne() { + _this18.containerOuter.addFocusState(); + + if (target === _this18.input.element) { + _this18.showDropdown(true); + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this18.input.element) { + _this18.showDropdown(true); // If element is a select box, the focused element is the container and the dropdown + // isn't already open, focus and show dropdown + + + _this18.containerOuter.addFocusState(); + } + } + }; + focusActions[this.passedElement.element.type](); + } + }, { + key: "_onBlur", + value: function _onBlur(_ref12) { + var _this19 = this; + + var target = _ref12.target; + var blurWasWithinContainer = this.containerOuter.element.contains(target); + + if (blurWasWithinContainer && !this._isScrollingOnIe) { + var activeItems = this._store.activeItems; + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); + var blurActions = { + text: function text() { + if (target === _this19.input.element) { + _this19.containerOuter.removeFocusState(); + + if (hasHighlightedItems) { + _this19.unhighlightAll(); + } + + _this19.hideDropdown(true); + } + }, + 'select-one': function selectOne() { + _this19.containerOuter.removeFocusState(); + + if (target === _this19.input.element || target === _this19.containerOuter.element && !_this19._canSearch) { + _this19.hideDropdown(true); + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this19.input.element) { + _this19.containerOuter.removeFocusState(); + + _this19.hideDropdown(true); + + if (hasHighlightedItems) { + _this19.unhighlightAll(); + } + } + } + }; + blurActions[this.passedElement.element.type](); + } else { + // On IE11, clicking the scollbar blurs our input and thus + // closes the dropdown. To stop this, we refocus our input + // if we know we are on IE *and* are scrolling. + this._isScrollingOnIe = false; + this.input.element.focus(); + } + } + }, { + key: "_onFormReset", + value: function _onFormReset() { + this._store.dispatch((0, _misc.resetTo)(this._initialState)); + } + }, { + key: "_highlightChoice", + value: function _highlightChoice() { + var _this20 = this; + + var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var choices = Array.from(this.dropdown.element.querySelectorAll('[data-choice-selectable]')); + + if (!choices.length) { + return; + } + + var passedEl = el; + var highlightedChoices = Array.from(this.dropdown.element.querySelectorAll(".".concat(this.config.classNames.highlightedState))); // Remove any highlighted choices + + highlightedChoices.forEach(function (choice) { + choice.classList.remove(_this20.config.classNames.highlightedState); + choice.setAttribute('aria-selected', 'false'); + }); + + if (passedEl) { + this._highlightPosition = choices.indexOf(passedEl); + } else { + // Highlight choice based on last known highlight location + if (choices.length > this._highlightPosition) { + // If we have an option to highlight + passedEl = choices[this._highlightPosition]; + } else { + // Otherwise highlight the option before + passedEl = choices[choices.length - 1]; + } + + if (!passedEl) { + passedEl = choices[0]; + } + } + + passedEl.classList.add(this.config.classNames.highlightedState); + passedEl.setAttribute('aria-selected', 'true'); + this.passedElement.triggerEvent(_constants.EVENTS.highlightChoice, { + el: passedEl + }); + + if (this.dropdown.isActive) { + // IE11 ignores aria-label and blocks virtual keyboard + // if aria-activedescendant is set without a dropdown + this.input.setActiveDescendant(passedEl.id); + this.containerOuter.setActiveDescendant(passedEl.id); + } + } + }, { + key: "_addItem", + value: function _addItem(_ref13) { + var value = _ref13.value, + _ref13$label = _ref13.label, + label = _ref13$label === void 0 ? null : _ref13$label, + _ref13$choiceId = _ref13.choiceId, + choiceId = _ref13$choiceId === void 0 ? -1 : _ref13$choiceId, + _ref13$groupId = _ref13.groupId, + groupId = _ref13$groupId === void 0 ? -1 : _ref13$groupId, + _ref13$customProperti = _ref13.customProperties, + customProperties = _ref13$customProperti === void 0 ? null : _ref13$customProperti, + _ref13$placeholder = _ref13.placeholder, + placeholder = _ref13$placeholder === void 0 ? false : _ref13$placeholder, + _ref13$keyCode = _ref13.keyCode, + keyCode = _ref13$keyCode === void 0 ? null : _ref13$keyCode; + var passedValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var passedKeyCode = keyCode; + var passedCustomProperties = customProperties; + var items = this._store.items; + var passedLabel = label || passedValue; + var passedOptionId = parseInt(choiceId, 10) || -1; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + var id = items ? items.length + 1 : 1; // If a prepended value has been passed, prepend it + + if (this.config.prependValue) { + passedValue = this.config.prependValue + passedValue.toString(); + } // If an appended value has been passed, append it + + + if (this.config.appendValue) { + passedValue += this.config.appendValue.toString(); + } + + this._store.dispatch((0, _items.addItem)({ + value: passedValue, + label: passedLabel, + id: id, + choiceId: passedOptionId, + groupId: groupId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: passedKeyCode + })); + + if (this._isSelectOneElement) { + this.removeActiveItems(id); + } // Trigger change event + + + this.passedElement.triggerEvent(_constants.EVENTS.addItem, { + id: id, + value: passedValue, + label: passedLabel, + customProperties: passedCustomProperties, + groupValue: group && group.value ? group.value : undefined, + keyCode: passedKeyCode + }); + return this; + } + }, { + key: "_removeItem", + value: function _removeItem(item) { + if (!item || !(0, _utils.isType)('Object', item)) { + return this; + } + + var id = item.id, + value = item.value, + label = item.label, + choiceId = item.choiceId, + groupId = item.groupId; + var group = groupId >= 0 ? this._store.getGroupById(groupId) : null; + + this._store.dispatch((0, _items.removeItem)(id, choiceId)); + + if (group && group.value) { + this.passedElement.triggerEvent(_constants.EVENTS.removeItem, { + id: id, + value: value, + label: label, + groupValue: group.value + }); + } else { + this.passedElement.triggerEvent(_constants.EVENTS.removeItem, { + id: id, + value: value, + label: label + }); + } + + return this; + } + }, { + key: "_addChoice", + value: function _addChoice(_ref14) { + var value = _ref14.value, + _ref14$label = _ref14.label, + label = _ref14$label === void 0 ? null : _ref14$label, + _ref14$isSelected = _ref14.isSelected, + isSelected = _ref14$isSelected === void 0 ? false : _ref14$isSelected, + _ref14$isDisabled = _ref14.isDisabled, + isDisabled = _ref14$isDisabled === void 0 ? false : _ref14$isDisabled, + _ref14$groupId = _ref14.groupId, + groupId = _ref14$groupId === void 0 ? -1 : _ref14$groupId, + _ref14$customProperti = _ref14.customProperties, + customProperties = _ref14$customProperti === void 0 ? null : _ref14$customProperti, + _ref14$placeholder = _ref14.placeholder, + placeholder = _ref14$placeholder === void 0 ? false : _ref14$placeholder, + _ref14$keyCode = _ref14.keyCode, + keyCode = _ref14$keyCode === void 0 ? null : _ref14$keyCode; + + if (typeof value === 'undefined' || value === null) { + return; + } // Generate unique id + + + var choices = this._store.choices; + var choiceLabel = label || value; + var choiceId = choices ? choices.length + 1 : 1; + var choiceElementId = "".concat(this._baseId, "-").concat(this._idNames.itemChoice, "-").concat(choiceId); + + this._store.dispatch((0, _choices.addChoice)({ + value: value, + label: choiceLabel, + id: choiceId, + groupId: groupId, + disabled: isDisabled, + elementId: choiceElementId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + })); + + if (isSelected) { + this._addItem({ + value: value, + label: choiceLabel, + choiceId: choiceId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }); + } + } + }, { + key: "_addGroup", + value: function _addGroup(_ref15) { + var _this21 = this; + + var group = _ref15.group, + id = _ref15.id, + _ref15$valueKey = _ref15.valueKey, + valueKey = _ref15$valueKey === void 0 ? 'value' : _ref15$valueKey, + _ref15$labelKey = _ref15.labelKey, + labelKey = _ref15$labelKey === void 0 ? 'label' : _ref15$labelKey; + var groupChoices = (0, _utils.isType)('Object', group) ? group.choices : Array.from(group.getElementsByTagName('OPTION')); + var groupId = id || Math.floor(new Date().valueOf() * Math.random()); + var isDisabled = group.disabled ? group.disabled : false; + + if (groupChoices) { + this._store.dispatch((0, _groups.addGroup)(group.label, groupId, true, isDisabled)); + + var addGroupChoices = function addGroupChoices(choice) { + var isOptDisabled = choice.disabled || choice.parentNode && choice.parentNode.disabled; + + _this21._addChoice({ + value: choice[valueKey], + label: (0, _utils.isType)('Object', choice) ? choice[labelKey] : choice.innerHTML, + isSelected: choice.selected, + isDisabled: isOptDisabled, + groupId: groupId, + customProperties: choice.customProperties, + placeholder: choice.placeholder + }); + }; + + groupChoices.forEach(addGroupChoices); + } else { + this._store.dispatch((0, _groups.addGroup)(group.label, group.id, false, group.disabled)); + } + } + }, { + key: "_getTemplate", + value: function _getTemplate(template) { + var _templates$template; + + if (!template) { + return null; + } + + var _this$config4 = this.config, + templates = _this$config4.templates, + classNames = _this$config4.classNames; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return (_templates$template = templates[template]).call.apply(_templates$template, [this, classNames].concat(args)); + } + }, { + key: "_createTemplates", + value: function _createTemplates() { + var callbackOnCreateTemplates = this.config.callbackOnCreateTemplates; + var userTemplates = {}; + + if (callbackOnCreateTemplates && (0, _utils.isType)('Function', callbackOnCreateTemplates)) { + userTemplates = callbackOnCreateTemplates.call(this, _utils.strToEl); + } + + this.config.templates = (0, _deepmerge.default)(_templates.TEMPLATES, userTemplates); + } + }, { + key: "_createElements", + value: function _createElements() { + this.containerOuter = new _components.Container({ + element: this._getTemplate('containerOuter', this._direction, this._isSelectElement, this._isSelectOneElement, this.config.searchEnabled, this.passedElement.element.type), + classNames: this.config.classNames, + type: this.passedElement.element.type, + position: this.config.position + }); + this.containerInner = new _components.Container({ + element: this._getTemplate('containerInner'), + classNames: this.config.classNames, + type: this.passedElement.element.type, + position: this.config.position + }); + this.input = new _components.Input({ + element: this._getTemplate('input'), + classNames: this.config.classNames, + type: this.passedElement.element.type + }); + this.choiceList = new _components.List({ + element: this._getTemplate('choiceList', this._isSelectOneElement) + }); + this.itemList = new _components.List({ + element: this._getTemplate('itemList', this._isSelectOneElement) + }); + this.dropdown = new _components.Dropdown({ + element: this._getTemplate('dropdown'), + classNames: this.config.classNames, + type: this.passedElement.element.type + }); + } + }, { + key: "_createStructure", + value: function _createStructure() { + // Hide original element + this.passedElement.conceal(); // Wrap input in container preserving DOM ordering + + this.containerInner.wrap(this.passedElement.element); // Wrapper inner container with outer container + + this.containerOuter.wrap(this.containerInner.element); + + if (this._isSelectOneElement) { + this.input.placeholder = this.config.searchPlaceholderValue || ''; + } else if (this._placeholderValue) { + this.input.placeholder = this._placeholderValue; + this.input.setWidth(true); + } + + this.containerOuter.element.appendChild(this.containerInner.element); + this.containerOuter.element.appendChild(this.dropdown.element); + this.containerInner.element.appendChild(this.itemList.element); + + if (!this._isTextElement) { + this.dropdown.element.appendChild(this.choiceList.element); + } + + if (!this._isSelectOneElement) { + this.containerInner.element.appendChild(this.input.element); + } else if (this.config.searchEnabled) { + this.dropdown.element.insertBefore(this.input.element, this.dropdown.element.firstChild); + } + + if (this._isSelectElement) { + this._addPredefinedChoices(); + } else if (this._isTextElement) { + this._addPredefinedItems(); + } + } + }, { + key: "_addPredefinedChoices", + value: function _addPredefinedChoices() { + var _this22 = this; + + var passedGroups = this.passedElement.optionGroups; + this._highlightPosition = 0; + this._isSearching = false; + + this._setLoading(true); + + if (passedGroups && passedGroups.length) { + // If we have a placeholder option + var placeholderChoice = this.passedElement.placeholderOption; + + if (placeholderChoice && placeholderChoice.parentNode.tagName === 'SELECT') { + this._addChoice({ + value: placeholderChoice.value, + label: placeholderChoice.innerHTML, + isSelected: placeholderChoice.selected, + isDisabled: placeholderChoice.disabled, + placeholder: true + }); + } + + passedGroups.forEach(function (group) { + return _this22._addGroup({ + group: group, + id: group.id || null + }); + }); + } else { + var passedOptions = this.passedElement.options; + var filter = this.config.sortFn; + var allChoices = this._presetChoices; // Create array of options from option elements + + passedOptions.forEach(function (o) { + allChoices.push({ + value: o.value, + label: o.innerHTML, + selected: o.selected, + disabled: o.disabled || o.parentNode.disabled, + placeholder: o.hasAttribute('placeholder'), + customProperties: o.getAttribute('data-custom-properties') + }); + }); // If sorting is enabled or the user is searching, filter choices + + if (this.config.shouldSort) allChoices.sort(filter); // Determine whether there is a selected choice + + var hasSelectedChoice = allChoices.some(function (choice) { + return choice.selected; + }); + + var handleChoice = function handleChoice(choice, index) { + var value = choice.value, + label = choice.label, + customProperties = choice.customProperties, + placeholder = choice.placeholder; + + if (_this22._isSelectElement) { + // If the choice is actually a group + if (choice.choices) { + _this22._addGroup({ + group: choice, + id: choice.id || null + }); + } else { + // If there is a selected choice already or the choice is not + // the first in the array, add each choice normally + // Otherwise pre-select the first choice in the array if it's a single select + var shouldPreselect = _this22._isSelectOneElement && !hasSelectedChoice && index === 0; + var isSelected = shouldPreselect ? true : choice.selected; + var isDisabled = shouldPreselect ? false : choice.disabled; + + _this22._addChoice({ + value: value, + label: label, + isSelected: isSelected, + isDisabled: isDisabled, + customProperties: customProperties, + placeholder: placeholder + }); + } + } else { + _this22._addChoice({ + value: value, + label: label, + isSelected: choice.selected, + isDisabled: choice.disabled, + customProperties: customProperties, + placeholder: placeholder + }); + } + }; // Add each choice + + + allChoices.forEach(function (choice, index) { + return handleChoice(choice, index); + }); + } + + this._setLoading(false); + } + }, { + key: "_addPredefinedItems", + value: function _addPredefinedItems() { + var _this23 = this; + + var handlePresetItem = function handlePresetItem(item) { + var itemType = (0, _utils.getType)(item); + + if (itemType === 'Object' && item.value) { + _this23._addItem({ + value: item.value, + label: item.label, + choiceId: item.id, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } else if (itemType === 'String') { + _this23._addItem({ + value: item + }); + } + }; + + this._presetItems.forEach(function (item) { + return handlePresetItem(item); + }); + } + }, { + key: "_setChoiceOrItem", + value: function _setChoiceOrItem(item) { + var _this24 = this; + + var itemType = (0, _utils.getType)(item).toLowerCase(); + var handleType = { + object: function object() { + if (!item.value) { + return; + } // If we are dealing with a select input, we need to create an option first + // that is then selected. For text inputs we can just add items normally. + + + if (!_this24._isTextElement) { + _this24._addChoice({ + value: item.value, + label: item.label, + isSelected: true, + isDisabled: false, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } else { + _this24._addItem({ + value: item.value, + label: item.label, + choiceId: item.id, + customProperties: item.customProperties, + placeholder: item.placeholder + }); + } + }, + string: function string() { + if (!_this24._isTextElement) { + _this24._addChoice({ + value: item, + label: item, + isSelected: true, + isDisabled: false + }); + } else { + _this24._addItem({ + value: item + }); + } + } + }; + handleType[itemType](); + } + }, { + key: "_findAndSelectChoiceByValue", + value: function _findAndSelectChoiceByValue(val) { + var _this25 = this; + + var choices = this._store.choices; // Check 'value' property exists and the choice isn't already selected + + var foundChoice = choices.find(function (choice) { + return _this25.config.itemComparer(choice.value, val); + }); + + if (foundChoice && !foundChoice.selected) { + this._addItem({ + value: foundChoice.value, + label: foundChoice.label, + choiceId: foundChoice.id, + groupId: foundChoice.groupId, + customProperties: foundChoice.customProperties, + placeholder: foundChoice.placeholder, + keyCode: foundChoice.keyCode + }); + } + } + }, { + key: "_generateInstances", + value: function _generateInstances(elements, config) { + return elements.reduce(function (instances, element) { + instances.push(new Choices(element, config)); + return instances; + }, [this]); + } + }, { + key: "_generatePlaceholderValue", + value: function _generatePlaceholderValue() { + if (this._isSelectOneElement) { + return false; + } + + return this.config.placeholder ? this.config.placeholderValue || this.passedElement.element.getAttribute('placeholder') : false; + } + /* ===== End of Private functions ====== */ + + }]); + + return Choices; +}(); + +Choices.userDefaults = {}; // We cannot export default here due to Webpack: https://github.com/webpack/webpack/issues/3929 + +module.exports = Choices; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +/*! + * Fuse.js v3.4.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2012-2017 Kirollos Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(); + else {} +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/bitap/bitap_matched_indices.js": +/*!********************************************!*\ + !*** ./src/bitap/bitap_matched_indices.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function () { + var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + var matchedIndices = []; + var start = -1; + var end = -1; + var i = 0; + + for (var len = matchmask.length; i < len; i += 1) { + var match = matchmask[i]; + + if (match && start === -1) { + start = i; + } else if (!match && start !== -1) { + end = i - 1; + + if (end - start + 1 >= minMatchCharLength) { + matchedIndices.push([start, end]); + } + + start = -1; + } + } // (i-1 - start) + 1 => i - start + + + if (matchmask[i - 1] && i - start >= minMatchCharLength) { + matchedIndices.push([start, i - 1]); + } + + return matchedIndices; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_pattern_alphabet.js": +/*!*********************************************!*\ + !*** ./src/bitap/bitap_pattern_alphabet.js ***! + \*********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (pattern) { + var mask = {}; + var len = pattern.length; + + for (var i = 0; i < len; i += 1) { + mask[pattern.charAt(i)] = 0; + } + + for (var _i = 0; _i < len; _i += 1) { + mask[pattern.charAt(_i)] |= 1 << len - _i - 1; + } + + return mask; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_regex_search.js": +/*!*****************************************!*\ + !*** ./src/bitap/bitap_regex_search.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var SPECIAL_CHARS_REGEX = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g; + +module.exports = function (text, pattern) { + var tokenSeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : / +/g; + var regex = new RegExp(pattern.replace(SPECIAL_CHARS_REGEX, '\\$&').replace(tokenSeparator, '|')); + var matches = text.match(regex); + var isMatch = !!matches; + var matchedIndices = []; + + if (isMatch) { + for (var i = 0, matchesLen = matches.length; i < matchesLen; i += 1) { + var match = matches[i]; + matchedIndices.push([text.indexOf(match), match.length - 1]); + } + } + + return { + // TODO: revisit this score + score: isMatch ? 0.5 : 1, + isMatch: isMatch, + matchedIndices: matchedIndices + }; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_score.js": +/*!**********************************!*\ + !*** ./src/bitap/bitap_score.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (pattern, _ref) { + var _ref$errors = _ref.errors, + errors = _ref$errors === void 0 ? 0 : _ref$errors, + _ref$currentLocation = _ref.currentLocation, + currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, + _ref$expectedLocation = _ref.expectedLocation, + expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance; + var accuracy = errors / pattern.length; + var proximity = Math.abs(expectedLocation - currentLocation); + + if (!distance) { + // Dodge divide by zero error. + return proximity ? 1.0 : accuracy; + } + + return accuracy + proximity / distance; +}; + +/***/ }), + +/***/ "./src/bitap/bitap_search.js": +/*!***********************************!*\ + !*** ./src/bitap/bitap_search.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var bitapScore = __webpack_require__(/*! ./bitap_score */ "./src/bitap/bitap_score.js"); + +var matchedIndices = __webpack_require__(/*! ./bitap_matched_indices */ "./src/bitap/bitap_matched_indices.js"); + +module.exports = function (text, pattern, patternAlphabet, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng; + var expectedLocation = location; // Set starting location at beginning text and initialize the alphabet. + + var textLen = text.length; // Highest score beyond which we give up. + + var currentThreshold = threshold; // Is there a nearby exact match? (speedup) + + var bestLocation = text.indexOf(pattern, expectedLocation); + var patternLen = pattern.length; // a mask of the matches + + var matchMask = []; + + for (var i = 0; i < textLen; i += 1) { + matchMask[i] = 0; + } + + if (bestLocation !== -1) { + var score = bitapScore(pattern, { + errors: 0, + currentLocation: bestLocation, + expectedLocation: expectedLocation, + distance: distance + }); + currentThreshold = Math.min(score, currentThreshold); // What about in the other direction? (speed up) + + bestLocation = text.lastIndexOf(pattern, expectedLocation + patternLen); + + if (bestLocation !== -1) { + var _score = bitapScore(pattern, { + errors: 0, + currentLocation: bestLocation, + expectedLocation: expectedLocation, + distance: distance + }); + + currentThreshold = Math.min(_score, currentThreshold); + } + } // Reset the best location + + + bestLocation = -1; + var lastBitArr = []; + var finalScore = 1; + var binMax = patternLen + textLen; + var mask = 1 << patternLen - 1; + + for (var _i = 0; _i < patternLen; _i += 1) { + // Scan for the best match; each iteration allows for one more error. + // Run a binary search to determine how far from the match location we can stray + // at this error level. + var binMin = 0; + var binMid = binMax; + + while (binMin < binMid) { + var _score3 = bitapScore(pattern, { + errors: _i, + currentLocation: expectedLocation + binMid, + expectedLocation: expectedLocation, + distance: distance + }); + + if (_score3 <= currentThreshold) { + binMin = binMid; + } else { + binMax = binMid; + } + + binMid = Math.floor((binMax - binMin) / 2 + binMin); + } // Use the result from this iteration as the maximum for the next. + + + binMax = binMid; + var start = Math.max(1, expectedLocation - binMid + 1); + var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array + + var bitArr = Array(finish + 2); + bitArr[finish + 1] = (1 << _i) - 1; + + for (var j = finish; j >= start; j -= 1) { + var currentLocation = j - 1; + var charMatch = patternAlphabet[text.charAt(currentLocation)]; + + if (charMatch) { + matchMask[currentLocation] = 1; + } // First pass: exact match + + + bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match + + if (_i !== 0) { + bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; + } + + if (bitArr[j] & mask) { + finalScore = bitapScore(pattern, { + errors: _i, + currentLocation: currentLocation, + expectedLocation: expectedLocation, + distance: distance + }); // This match will almost certainly be better than any existing match. + // But check anyway. + + if (finalScore <= currentThreshold) { + // Indeed it is + currentThreshold = finalScore; + bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. + + if (bestLocation <= expectedLocation) { + break; + } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. + + + start = Math.max(1, 2 * expectedLocation - bestLocation); + } + } + } // No hope for a (better) match at greater error levels. + + + var _score2 = bitapScore(pattern, { + errors: _i + 1, + currentLocation: expectedLocation, + expectedLocation: expectedLocation, + distance: distance + }); // console.log('score', score, finalScore) + + + if (_score2 > currentThreshold) { + break; + } + + lastBitArr = bitArr; + } // console.log('FINAL SCORE', finalScore) + // Count exact matches (those with a score of 0) to be "almost" exact + + + return { + isMatch: bestLocation >= 0, + score: finalScore === 0 ? 0.001 : finalScore, + matchedIndices: matchedIndices(matchMask, minMatchCharLength) + }; +}; + +/***/ }), + +/***/ "./src/bitap/index.js": +/*!****************************!*\ + !*** ./src/bitap/index.js ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var bitapRegexSearch = __webpack_require__(/*! ./bitap_regex_search */ "./src/bitap/bitap_regex_search.js"); + +var bitapSearch = __webpack_require__(/*! ./bitap_search */ "./src/bitap/bitap_search.js"); + +var patternAlphabet = __webpack_require__(/*! ./bitap_pattern_alphabet */ "./src/bitap/bitap_pattern_alphabet.js"); + +var Bitap = +/*#__PURE__*/ +function () { + function Bitap(pattern, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$maxPatternLength = _ref.maxPatternLength, + maxPatternLength = _ref$maxPatternLength === void 0 ? 32 : _ref$maxPatternLength, + _ref$isCaseSensitive = _ref.isCaseSensitive, + isCaseSensitive = _ref$isCaseSensitive === void 0 ? false : _ref$isCaseSensitive, + _ref$tokenSeparator = _ref.tokenSeparator, + tokenSeparator = _ref$tokenSeparator === void 0 ? / +/g : _ref$tokenSeparator, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng; + + _classCallCheck(this, Bitap); + + this.options = { + location: location, + distance: distance, + threshold: threshold, + maxPatternLength: maxPatternLength, + isCaseSensitive: isCaseSensitive, + tokenSeparator: tokenSeparator, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength + }; + this.pattern = this.options.isCaseSensitive ? pattern : pattern.toLowerCase(); + + if (this.pattern.length <= maxPatternLength) { + this.patternAlphabet = patternAlphabet(this.pattern); + } + } + + _createClass(Bitap, [{ + key: "search", + value: function search(text) { + if (!this.options.isCaseSensitive) { + text = text.toLowerCase(); + } // Exact match + + + if (this.pattern === text) { + return { + isMatch: true, + score: 0, + matchedIndices: [[0, text.length - 1]] + }; + } // When pattern length is greater than the machine word length, just do a a regex comparison + + + var _this$options = this.options, + maxPatternLength = _this$options.maxPatternLength, + tokenSeparator = _this$options.tokenSeparator; + + if (this.pattern.length > maxPatternLength) { + return bitapRegexSearch(text, this.pattern, tokenSeparator); + } // Otherwise, use Bitap algorithm + + + var _this$options2 = this.options, + location = _this$options2.location, + distance = _this$options2.distance, + threshold = _this$options2.threshold, + findAllMatches = _this$options2.findAllMatches, + minMatchCharLength = _this$options2.minMatchCharLength; + return bitapSearch(text, this.pattern, this.patternAlphabet, { + location: location, + distance: distance, + threshold: threshold, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength + }); + } + }]); + + return Bitap; +}(); // let x = new Bitap("od mn war", {}) +// let result = x.search("Old Man's War") +// console.log(result) + + +module.exports = Bitap; + +/***/ }), + +/***/ "./src/helpers/deep_value.js": +/*!***********************************!*\ + !*** ./src/helpers/deep_value.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isArray = __webpack_require__(/*! ./is_array */ "./src/helpers/is_array.js"); + +var deepValue = function deepValue(obj, path, list) { + if (!path) { + // If there's no path left, we've gotten to the object we care about. + list.push(obj); + } else { + var dotIndex = path.indexOf('.'); + var firstSegment = path; + var remaining = null; + + if (dotIndex !== -1) { + firstSegment = path.slice(0, dotIndex); + remaining = path.slice(dotIndex + 1); + } + + var value = obj[firstSegment]; + + if (value !== null && value !== undefined) { + if (!remaining && (typeof value === 'string' || typeof value === 'number')) { + list.push(value.toString()); + } else if (isArray(value)) { + // Search each item in the array. + for (var i = 0, len = value.length; i < len; i += 1) { + deepValue(value[i], remaining, list); + } + } else if (remaining) { + // An object. Recurse further. + deepValue(value, remaining, list); + } + } + } + + return list; +}; + +module.exports = function (obj, path) { + return deepValue(obj, path, []); +}; + +/***/ }), + +/***/ "./src/helpers/is_array.js": +/*!*********************************!*\ + !*** ./src/helpers/is_array.js ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (obj) { + return !Array.isArray ? Object.prototype.toString.call(obj) === '[object Array]' : Array.isArray(obj); +}; + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Bitap = __webpack_require__(/*! ./bitap */ "./src/bitap/index.js"); + +var deepValue = __webpack_require__(/*! ./helpers/deep_value */ "./src/helpers/deep_value.js"); + +var isArray = __webpack_require__(/*! ./helpers/is_array */ "./src/helpers/is_array.js"); + +var Fuse = +/*#__PURE__*/ +function () { + function Fuse(list, _ref) { + var _ref$location = _ref.location, + location = _ref$location === void 0 ? 0 : _ref$location, + _ref$distance = _ref.distance, + distance = _ref$distance === void 0 ? 100 : _ref$distance, + _ref$threshold = _ref.threshold, + threshold = _ref$threshold === void 0 ? 0.6 : _ref$threshold, + _ref$maxPatternLength = _ref.maxPatternLength, + maxPatternLength = _ref$maxPatternLength === void 0 ? 32 : _ref$maxPatternLength, + _ref$caseSensitive = _ref.caseSensitive, + caseSensitive = _ref$caseSensitive === void 0 ? false : _ref$caseSensitive, + _ref$tokenSeparator = _ref.tokenSeparator, + tokenSeparator = _ref$tokenSeparator === void 0 ? / +/g : _ref$tokenSeparator, + _ref$findAllMatches = _ref.findAllMatches, + findAllMatches = _ref$findAllMatches === void 0 ? false : _ref$findAllMatches, + _ref$minMatchCharLeng = _ref.minMatchCharLength, + minMatchCharLength = _ref$minMatchCharLeng === void 0 ? 1 : _ref$minMatchCharLeng, + _ref$id = _ref.id, + id = _ref$id === void 0 ? null : _ref$id, + _ref$keys = _ref.keys, + keys = _ref$keys === void 0 ? [] : _ref$keys, + _ref$shouldSort = _ref.shouldSort, + shouldSort = _ref$shouldSort === void 0 ? true : _ref$shouldSort, + _ref$getFn = _ref.getFn, + getFn = _ref$getFn === void 0 ? deepValue : _ref$getFn, + _ref$sortFn = _ref.sortFn, + sortFn = _ref$sortFn === void 0 ? function (a, b) { + return a.score - b.score; + } : _ref$sortFn, + _ref$tokenize = _ref.tokenize, + tokenize = _ref$tokenize === void 0 ? false : _ref$tokenize, + _ref$matchAllTokens = _ref.matchAllTokens, + matchAllTokens = _ref$matchAllTokens === void 0 ? false : _ref$matchAllTokens, + _ref$includeMatches = _ref.includeMatches, + includeMatches = _ref$includeMatches === void 0 ? false : _ref$includeMatches, + _ref$includeScore = _ref.includeScore, + includeScore = _ref$includeScore === void 0 ? false : _ref$includeScore, + _ref$verbose = _ref.verbose, + verbose = _ref$verbose === void 0 ? false : _ref$verbose; + + _classCallCheck(this, Fuse); + + this.options = { + location: location, + distance: distance, + threshold: threshold, + maxPatternLength: maxPatternLength, + isCaseSensitive: caseSensitive, + tokenSeparator: tokenSeparator, + findAllMatches: findAllMatches, + minMatchCharLength: minMatchCharLength, + id: id, + keys: keys, + includeMatches: includeMatches, + includeScore: includeScore, + shouldSort: shouldSort, + getFn: getFn, + sortFn: sortFn, + verbose: verbose, + tokenize: tokenize, + matchAllTokens: matchAllTokens + }; + this.setCollection(list); + } + + _createClass(Fuse, [{ + key: "setCollection", + value: function setCollection(list) { + this.list = list; + return list; + } + }, { + key: "search", + value: function search(pattern) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + limit: false + }; + + this._log("---------\nSearch pattern: \"".concat(pattern, "\"")); + + var _this$_prepareSearche = this._prepareSearchers(pattern), + tokenSearchers = _this$_prepareSearche.tokenSearchers, + fullSearcher = _this$_prepareSearche.fullSearcher; + + var _this$_search = this._search(tokenSearchers, fullSearcher), + weights = _this$_search.weights, + results = _this$_search.results; + + this._computeScore(weights, results); + + if (this.options.shouldSort) { + this._sort(results); + } + + if (opts.limit && typeof opts.limit === 'number') { + results = results.slice(0, opts.limit); + } + + return this._format(results); + } + }, { + key: "_prepareSearchers", + value: function _prepareSearchers() { + var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tokenSearchers = []; + + if (this.options.tokenize) { + // Tokenize on the separator + var tokens = pattern.split(this.options.tokenSeparator); + + for (var i = 0, len = tokens.length; i < len; i += 1) { + tokenSearchers.push(new Bitap(tokens[i], this.options)); + } + } + + var fullSearcher = new Bitap(pattern, this.options); + return { + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }; + } + }, { + key: "_search", + value: function _search() { + var tokenSearchers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var fullSearcher = arguments.length > 1 ? arguments[1] : undefined; + var list = this.list; + var resultMap = {}; + var results = []; // Check the first item in the list, if it's a string, then we assume + // that every item in the list is also a string, and thus it's a flattened array. + + if (typeof list[0] === 'string') { + // Iterate over every item + for (var i = 0, len = list.length; i < len; i += 1) { + this._analyze({ + key: '', + value: list[i], + record: i, + index: i + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + + return { + weights: null, + results: results + }; + } // Otherwise, the first item is an Object (hopefully), and thus the searching + // is done on the values of the keys of each item. + + + var weights = {}; + + for (var _i = 0, _len = list.length; _i < _len; _i += 1) { + var item = list[_i]; // Iterate over every key + + for (var j = 0, keysLen = this.options.keys.length; j < keysLen; j += 1) { + var key = this.options.keys[j]; + + if (typeof key !== 'string') { + weights[key.name] = { + weight: 1 - key.weight || 1 + }; + + if (key.weight <= 0 || key.weight > 1) { + throw new Error('Key weight has to be > 0 and <= 1'); + } + + key = key.name; + } else { + weights[key] = { + weight: 1 + }; + } + + this._analyze({ + key: key, + value: this.options.getFn(item, key), + record: item, + index: _i + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + } + + return { + weights: weights, + results: results + }; + } + }, { + key: "_analyze", + value: function _analyze(_ref2, _ref3) { + var key = _ref2.key, + _ref2$arrayIndex = _ref2.arrayIndex, + arrayIndex = _ref2$arrayIndex === void 0 ? -1 : _ref2$arrayIndex, + value = _ref2.value, + record = _ref2.record, + index = _ref2.index; + var _ref3$tokenSearchers = _ref3.tokenSearchers, + tokenSearchers = _ref3$tokenSearchers === void 0 ? [] : _ref3$tokenSearchers, + _ref3$fullSearcher = _ref3.fullSearcher, + fullSearcher = _ref3$fullSearcher === void 0 ? [] : _ref3$fullSearcher, + _ref3$resultMap = _ref3.resultMap, + resultMap = _ref3$resultMap === void 0 ? {} : _ref3$resultMap, + _ref3$results = _ref3.results, + results = _ref3$results === void 0 ? [] : _ref3$results; + + // Check if the texvaluet can be searched + if (value === undefined || value === null) { + return; + } + + var exists = false; + var averageScore = -1; + var numTextMatches = 0; + + if (typeof value === 'string') { + this._log("\nKey: ".concat(key === '' ? '-' : key)); + + var mainSearchResult = fullSearcher.search(value); + + this._log("Full text: \"".concat(value, "\", score: ").concat(mainSearchResult.score)); + + if (this.options.tokenize) { + var words = value.split(this.options.tokenSeparator); + var scores = []; + + for (var i = 0; i < tokenSearchers.length; i += 1) { + var tokenSearcher = tokenSearchers[i]; + + this._log("\nPattern: \"".concat(tokenSearcher.pattern, "\"")); // let tokenScores = [] + + + var hasMatchInText = false; + + for (var j = 0; j < words.length; j += 1) { + var word = words[j]; + var tokenSearchResult = tokenSearcher.search(word); + var obj = {}; + + if (tokenSearchResult.isMatch) { + obj[word] = tokenSearchResult.score; + exists = true; + hasMatchInText = true; + scores.push(tokenSearchResult.score); + } else { + obj[word] = 1; + + if (!this.options.matchAllTokens) { + scores.push(1); + } + } + + this._log("Token: \"".concat(word, "\", score: ").concat(obj[word])); // tokenScores.push(obj) + + } + + if (hasMatchInText) { + numTextMatches += 1; + } + } + + averageScore = scores[0]; + var scoresLen = scores.length; + + for (var _i2 = 1; _i2 < scoresLen; _i2 += 1) { + averageScore += scores[_i2]; + } + + averageScore = averageScore / scoresLen; + + this._log('Token score average:', averageScore); + } + + var finalScore = mainSearchResult.score; + + if (averageScore > -1) { + finalScore = (finalScore + averageScore) / 2; + } + + this._log('Score average:', finalScore); + + var checkTextMatches = this.options.tokenize && this.options.matchAllTokens ? numTextMatches >= tokenSearchers.length : true; + + this._log("\nCheck Matches: ".concat(checkTextMatches)); // If a match is found, add the item to , including its score + + + if ((exists || mainSearchResult.isMatch) && checkTextMatches) { + // Check if the item already exists in our results + var existingResult = resultMap[index]; + + if (existingResult) { + // Use the lowest score + // existingResult.score, bitapResult.score + existingResult.output.push({ + key: key, + arrayIndex: arrayIndex, + value: value, + score: finalScore, + matchedIndices: mainSearchResult.matchedIndices + }); + } else { + // Add it to the raw result list + resultMap[index] = { + item: record, + output: [{ + key: key, + arrayIndex: arrayIndex, + value: value, + score: finalScore, + matchedIndices: mainSearchResult.matchedIndices + }] + }; + results.push(resultMap[index]); + } + } + } else if (isArray(value)) { + for (var _i3 = 0, len = value.length; _i3 < len; _i3 += 1) { + this._analyze({ + key: key, + arrayIndex: _i3, + value: value[_i3], + record: record, + index: index + }, { + resultMap: resultMap, + results: results, + tokenSearchers: tokenSearchers, + fullSearcher: fullSearcher + }); + } + } + } + }, { + key: "_computeScore", + value: function _computeScore(weights, results) { + this._log('\n\nComputing score:\n'); + + for (var i = 0, len = results.length; i < len; i += 1) { + var output = results[i].output; + var scoreLen = output.length; + var currScore = 1; + var bestScore = 1; + + for (var j = 0; j < scoreLen; j += 1) { + var weight = weights ? weights[output[j].key].weight : 1; + var score = weight === 1 ? output[j].score : output[j].score || 0.001; + var nScore = score * weight; + + if (weight !== 1) { + bestScore = Math.min(bestScore, nScore); + } else { + output[j].nScore = nScore; + currScore *= nScore; + } + } + + results[i].score = bestScore === 1 ? currScore : bestScore; + + this._log(results[i]); + } + } + }, { + key: "_sort", + value: function _sort(results) { + this._log('\n\nSorting....'); + + results.sort(this.options.sortFn); + } + }, { + key: "_format", + value: function _format(results) { + var finalOutput = []; + + if (this.options.verbose) { + var cache = []; + + this._log('\n\nOutput:\n\n', JSON.stringify(results, function (key, value) { + if (_typeof(value) === 'object' && value !== null) { + if (cache.indexOf(value) !== -1) { + // Circular reference found, discard key + return; + } // Store value in our collection + + + cache.push(value); + } + + return value; + })); + + cache = null; + } + + var transformers = []; + + if (this.options.includeMatches) { + transformers.push(function (result, data) { + var output = result.output; + data.matches = []; + + for (var i = 0, len = output.length; i < len; i += 1) { + var item = output[i]; + + if (item.matchedIndices.length === 0) { + continue; + } + + var obj = { + indices: item.matchedIndices, + value: item.value + }; + + if (item.key) { + obj.key = item.key; + } + + if (item.hasOwnProperty('arrayIndex') && item.arrayIndex > -1) { + obj.arrayIndex = item.arrayIndex; + } + + data.matches.push(obj); + } + }); + } + + if (this.options.includeScore) { + transformers.push(function (result, data) { + data.score = result.score; + }); + } + + for (var i = 0, len = results.length; i < len; i += 1) { + var result = results[i]; + + if (this.options.id) { + result.item = this.options.getFn(result.item, this.options.id)[0]; + } + + if (!transformers.length) { + finalOutput.push(result.item); + continue; + } + + var data = { + item: result.item + }; + + for (var j = 0, _len2 = transformers.length; j < _len2; j += 1) { + transformers[j](result, data); + } + + finalOutput.push(data); + } + + return finalOutput; + } + }, { + key: "_log", + value: function _log() { + if (this.options.verbose) { + var _console; + + (_console = console).log.apply(_console, arguments); + } + } + }]); + + return Fuse; +}(); + +module.exports = Fuse; + +/***/ }) + +/******/ }); +}); + +/***/ }), +/* 12 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +var isMergeableObject = function isMergeableObject(value) { + return isNonNullObject(value) + && !isSpecial(value) +}; + +function isNonNullObject(value) { + return !!value && typeof value === 'object' +} + +function isSpecial(value) { + var stringValue = Object.prototype.toString.call(value); + + return stringValue === '[object RegExp]' + || stringValue === '[object Date]' + || isReactElement(value) +} + +// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 +var canUseSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; + +function isReactElement(value) { + return value.$$typeof === REACT_ELEMENT_TYPE +} + +function emptyTarget(val) { + return Array.isArray(val) ? [] : {} +} + +function cloneUnlessOtherwiseSpecified(value, options) { + return (options.clone !== false && options.isMergeableObject(value)) + ? deepmerge(emptyTarget(value), value, options) + : value +} + +function defaultArrayMerge(target, source, options) { + return target.concat(source).map(function(element) { + return cloneUnlessOtherwiseSpecified(element, options) + }) +} + +function mergeObject(target, source, options) { + var destination = {}; + if (options.isMergeableObject(target)) { + Object.keys(target).forEach(function(key) { + destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); + }); + } + Object.keys(source).forEach(function(key) { + if (!options.isMergeableObject(source[key]) || !target[key]) { + destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); + } else { + destination[key] = deepmerge(target[key], source[key], options); + } + }); + return destination +} + +function deepmerge(target, source, options) { + options = options || {}; + options.arrayMerge = options.arrayMerge || defaultArrayMerge; + options.isMergeableObject = options.isMergeableObject || isMergeableObject; + + var sourceIsArray = Array.isArray(source); + var targetIsArray = Array.isArray(target); + var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; + + if (!sourceAndTargetTypesMatch) { + return cloneUnlessOtherwiseSpecified(source, options) + } else if (sourceIsArray) { + return options.arrayMerge(target, source, options) + } else { + return mergeObject(target, source, options) + } +} + +deepmerge.all = function deepmergeAll(array, options) { + if (!Array.isArray(array)) { + throw new Error('first argument should be an array') + } + + return array.reduce(function(prev, next) { + return deepmerge(prev, next, options) + }, {}) +}; + +var deepmerge_1 = deepmerge; + +/* harmony default export */ __webpack_exports__["default"] = (deepmerge_1); + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _redux = __webpack_require__(6); + +var _index = _interopRequireDefault(__webpack_require__(15)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Store = +/*#__PURE__*/ +function () { + function Store() { + _classCallCheck(this, Store); + + this._store = (0, _redux.createStore)(_index.default, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); + } + /** + * Subscribe store to function call (wrapped Redux method) + * @param {Function} onChange Function to trigger when state changes + * @return + */ + + + _createClass(Store, [{ + key: "subscribe", + value: function subscribe(onChange) { + this._store.subscribe(onChange); + } + /** + * Dispatch event to store (wrapped Redux method) + * @param {Function} action Action function to trigger + * @return + */ + + }, { + key: "dispatch", + value: function dispatch(action) { + this._store.dispatch(action); + } + /** + * Get store object (wrapping Redux method) + * @return {Object} State + */ + + }, { + key: "isLoading", + + /** + * Get loading state from store + * @return {Boolean} Loading State + */ + value: function isLoading() { + return this.state.general.loading; + } + /** + * Get single choice by it's ID + * @return {Object} Found choice + */ + + }, { + key: "getChoiceById", + value: function getChoiceById(id) { + if (id) { + var choices = this.activeChoices; + var foundChoice = choices.find(function (choice) { + return choice.id === parseInt(id, 10); + }); + return foundChoice; + } + + return false; + } + /** + * Get group by group id + * @param {Number} id Group ID + * @return {Object} Group data + */ + + }, { + key: "getGroupById", + value: function getGroupById(id) { + return this.groups.find(function (group) { + return group.id === parseInt(id, 10); + }); + } + }, { + key: "state", + get: function get() { + return this._store.getState(); + } + /** + * Get items from store + * @return {Array} Item objects + */ + + }, { + key: "items", + get: function get() { + return this.state.items; + } + /** + * Get active items from store + * @return {Array} Item objects + */ + + }, { + key: "activeItems", + get: function get() { + return this.items.filter(function (item) { + return item.active === true; + }); + } + /** + * Get highlighted items from store + * @return {Array} Item objects + */ + + }, { + key: "highlightedActiveItems", + get: function get() { + return this.items.filter(function (item) { + return item.active && item.highlighted; + }); + } + /** + * Get choices from store + * @return {Array} Option objects + */ + + }, { + key: "choices", + get: function get() { + return this.state.choices; + } + /** + * Get active choices from store + * @return {Array} Option objects + */ + + }, { + key: "activeChoices", + get: function get() { + var choices = this.choices; + var values = choices.filter(function (choice) { + return choice.active === true; + }); + return values; + } + /** + * Get selectable choices from store + * @return {Array} Option objects + */ + + }, { + key: "selectableChoices", + get: function get() { + return this.choices.filter(function (choice) { + return choice.disabled !== true; + }); + } + /** + * Get choices that can be searched (excluding placeholders) + * @return {Array} Option objects + */ + + }, { + key: "searchableChoices", + get: function get() { + return this.selectableChoices.filter(function (choice) { + return choice.placeholder !== true; + }); + } + /** + * Get placeholder choice from store + * @return {Object} Found placeholder + */ + + }, { + key: "placeholderChoice", + get: function get() { + return [].concat(this.choices).reverse().find(function (choice) { + return choice.placeholder === true; + }); + } + /** + * Get groups from store + * @return {Array} Group objects + */ + + }, { + key: "groups", + get: function get() { + return this.state.groups; + } + /** + * Get active groups from store + * @return {Array} Group objects + */ + + }, { + key: "activeGroups", + get: function get() { + var groups = this.groups; + var choices = this.choices; + return groups.filter(function (group) { + var isActive = group.active === true && group.disabled === false; + var hasActiveOptions = choices.some(function (choice) { + return choice.active === true && choice.disabled === false; + }); + return isActive && hasActiveOptions; + }, []); + } + }]); + + return Store; +}(); + +exports.default = Store; + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +module.exports = function(originalModule) { + if (!originalModule.webpackPolyfill) { + var module = Object.create(originalModule); + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + Object.defineProperty(module, "exports", { + enumerable: true + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _redux = __webpack_require__(6); + +var _items = _interopRequireDefault(__webpack_require__(16)); + +var _groups = _interopRequireDefault(__webpack_require__(17)); + +var _choices = _interopRequireDefault(__webpack_require__(18)); + +var _general = _interopRequireDefault(__webpack_require__(19)); + +var _utils = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var appReducer = (0, _redux.combineReducers)({ + items: _items.default, + groups: _groups.default, + choices: _choices.default, + general: _general.default +}); + +var rootReducer = function rootReducer(passedState, action) { + var state = passedState; // If we are clearing all items, groups and options we reassign + // state and then pass that state to our proper reducer. This isn't + // mutating our actual state + // See: http://stackoverflow.com/a/35641992 + + if (action.type === 'CLEAR_ALL') { + state = undefined; + } else if (action.type === 'RESET_TO') { + return (0, _utils.cloneObject)(action.state); + } + + return appReducer(state, action); +}; + +var _default = rootReducer; +exports.default = _default; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = items; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function items() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_ITEM': + { + // Add object to items array + var newState = [].concat(state, [{ + id: action.id, + choiceId: action.choiceId, + groupId: action.groupId, + value: action.value, + label: action.label, + active: true, + highlighted: false, + customProperties: action.customProperties, + placeholder: action.placeholder || false, + keyCode: null + }]); + return newState.map(function (obj) { + var item = obj; + item.highlighted = false; + return item; + }); + } + + case 'REMOVE_ITEM': + { + // Set item to inactive + return state.map(function (obj) { + var item = obj; + + if (item.id === action.id) { + item.active = false; + } + + return item; + }); + } + + case 'HIGHLIGHT_ITEM': + { + return state.map(function (obj) { + var item = obj; + + if (item.id === action.id) { + item.highlighted = action.highlighted; + } + + return item; + }); + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = groups; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function groups() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_GROUP': + { + return [].concat(state, [{ + id: action.id, + value: action.value, + active: action.active, + disabled: action.disabled + }]); + } + + case 'CLEAR_CHOICES': + { + return []; + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = choices; +exports.defaultState = void 0; +var defaultState = []; +exports.defaultState = defaultState; + +function choices() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'ADD_CHOICE': + { + /* + A disabled choice appears in the choice dropdown but cannot be selected + A selected choice has been added to the passed input's value (added as an item) + An active choice appears within the choice dropdown + */ + return [].concat(state, [{ + id: action.id, + elementId: action.elementId, + groupId: action.groupId, + value: action.value, + label: action.label || action.value, + disabled: action.disabled || false, + selected: false, + active: true, + score: 9999, + customProperties: action.customProperties, + placeholder: action.placeholder || false, + keyCode: null + }]); + } + + case 'ADD_ITEM': + { + // If all choices need to be activated + if (action.activateOptions) { + return state.map(function (obj) { + var choice = obj; + choice.active = action.active; + return choice; + }); + } // When an item is added and it has an associated choice, + // we want to disable it so it can't be chosen again + + + if (action.choiceId > -1) { + return state.map(function (obj) { + var choice = obj; + + if (choice.id === parseInt(action.choiceId, 10)) { + choice.selected = true; + } + + return choice; + }); + } + + return state; + } + + case 'REMOVE_ITEM': + { + // When an item is removed and it has an associated choice, + // we want to re-enable it so it can be chosen again + if (action.choiceId > -1) { + return state.map(function (obj) { + var choice = obj; + + if (choice.id === parseInt(action.choiceId, 10)) { + choice.selected = false; + } + + return choice; + }); + } + + return state; + } + + case 'FILTER_CHOICES': + { + return state.map(function (obj) { + var choice = obj; // Set active state based on whether choice is + // within filtered results + + choice.active = action.results.some(function (_ref) { + var item = _ref.item, + score = _ref.score; + + if (item.id === choice.id) { + choice.score = score; + return true; + } + + return false; + }); + return choice; + }); + } + + case 'ACTIVATE_CHOICES': + { + return state.map(function (obj) { + var choice = obj; + choice.active = action.active; + return choice; + }); + } + + case 'CLEAR_CHOICES': + { + return defaultState; + } + + default: + { + return state; + } + } +} + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.defaultState = void 0; +var defaultState = { + loading: false +}; +exports.defaultState = defaultState; + +var general = function general() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; + var action = arguments.length > 1 ? arguments[1] : undefined; + + switch (action.type) { + case 'SET_IS_LOADING': + { + return { + loading: action.isLoading + }; + } + + default: + { + return state; + } + } +}; + +var _default = general; +exports.default = _default; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Dropdown", { + enumerable: true, + get: function get() { + return _dropdown.default; + } +}); +Object.defineProperty(exports, "Container", { + enumerable: true, + get: function get() { + return _container.default; + } +}); +Object.defineProperty(exports, "Input", { + enumerable: true, + get: function get() { + return _input.default; + } +}); +Object.defineProperty(exports, "List", { + enumerable: true, + get: function get() { + return _list.default; + } +}); +Object.defineProperty(exports, "WrappedInput", { + enumerable: true, + get: function get() { + return _wrappedInput.default; + } +}); +Object.defineProperty(exports, "WrappedSelect", { + enumerable: true, + get: function get() { + return _wrappedSelect.default; + } +}); + +var _dropdown = _interopRequireDefault(__webpack_require__(21)); + +var _container = _interopRequireDefault(__webpack_require__(22)); + +var _input = _interopRequireDefault(__webpack_require__(23)); + +var _list = _interopRequireDefault(__webpack_require__(24)); + +var _wrappedInput = _interopRequireDefault(__webpack_require__(25)); + +var _wrappedSelect = _interopRequireDefault(__webpack_require__(26)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Dropdown = +/*#__PURE__*/ +function () { + function Dropdown(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames; + + _classCallCheck(this, Dropdown); + + Object.assign(this, { + element: element, + type: type, + classNames: classNames + }); + this.isActive = false; + } + /** + * Determine how far the top of our element is from + * the top of the window + * @return {Number} Vertical position + */ + + + _createClass(Dropdown, [{ + key: "distanceFromTopWindow", + value: function distanceFromTopWindow() { + this.dimensions = this.element.getBoundingClientRect(); + this.position = Math.ceil(this.dimensions.top + window.pageYOffset + this.element.offsetHeight); + return this.position; + } + /** + * Find element that matches passed selector + * @return {HTMLElement} + */ + + }, { + key: "getChild", + value: function getChild(selector) { + return this.element.querySelector(selector); + } + /** + * Show dropdown to user by adding active state class + * @return {Object} Class instance + * @public + */ + + }, { + key: "show", + value: function show() { + this.element.classList.add(this.classNames.activeState); + this.element.setAttribute('aria-expanded', 'true'); + this.isActive = true; + return this; + } + /** + * Hide dropdown from user + * @return {Object} Class instance + * @public + */ + + }, { + key: "hide", + value: function hide() { + this.element.classList.remove(this.classNames.activeState); + this.element.setAttribute('aria-expanded', 'false'); + this.isActive = false; + return this; + } + }]); + + return Dropdown; +}(); + +exports.default = Dropdown; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Container = +/*#__PURE__*/ +function () { + function Container(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames, + position = _ref.position; + + _classCallCheck(this, Container); + + Object.assign(this, { + element: element, + classNames: classNames, + type: type, + position: position + }); + this.isOpen = false; + this.isFlipped = false; + this.isFocussed = false; + this.isDisabled = false; + this.isLoading = false; + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + } + /** + * Add event listeners + */ + + + _createClass(Container, [{ + key: "addEventListeners", + value: function addEventListeners() { + this.element.addEventListener('focus', this._onFocus); + this.element.addEventListener('blur', this._onBlur); + } + /** + * Remove event listeners + */ + + /** */ + + }, { + key: "removeEventListeners", + value: function removeEventListeners() { + this.element.removeEventListener('focus', this._onFocus); + this.element.removeEventListener('blur', this._onBlur); + } + /** + * Determine whether container should be flipped + * based on passed dropdown position + * @param {Number} dropdownPos + * @returns + */ + + }, { + key: "shouldFlip", + value: function shouldFlip(dropdownPos) { + var windowHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _utils.getWindowHeight)(); + + if (dropdownPos === undefined) { + return false; + } // If flip is enabled and the dropdown bottom position is + // greater than the window height flip the dropdown. + + + var shouldFlip = false; + + if (this.position === 'auto') { + shouldFlip = dropdownPos >= windowHeight; + } else if (this.position === 'top') { + shouldFlip = true; + } + + return shouldFlip; + } + /** + * Set active descendant attribute + * @param {Number} activeDescendant ID of active descendant + */ + + }, { + key: "setActiveDescendant", + value: function setActiveDescendant(activeDescendantID) { + this.element.setAttribute('aria-activedescendant', activeDescendantID); + } + /** + * Remove active descendant attribute + */ + + }, { + key: "removeActiveDescendant", + value: function removeActiveDescendant() { + this.element.removeAttribute('aria-activedescendant'); + } + }, { + key: "open", + value: function open(dropdownPos) { + this.element.classList.add(this.classNames.openState); + this.element.setAttribute('aria-expanded', 'true'); + this.isOpen = true; + + if (this.shouldFlip(dropdownPos)) { + this.element.classList.add(this.classNames.flippedState); + this.isFlipped = true; + } + } + }, { + key: "close", + value: function close() { + this.element.classList.remove(this.classNames.openState); + this.element.setAttribute('aria-expanded', 'false'); + this.removeActiveDescendant(); + this.isOpen = false; // A dropdown flips if it does not have space within the page + + if (this.isFlipped) { + this.element.classList.remove(this.classNames.flippedState); + this.isFlipped = false; + } + } + }, { + key: "focus", + value: function focus() { + if (!this.isFocussed) { + this.element.focus(); + } + } + }, { + key: "addFocusState", + value: function addFocusState() { + this.element.classList.add(this.classNames.focusState); + } + }, { + key: "removeFocusState", + value: function removeFocusState() { + this.element.classList.remove(this.classNames.focusState); + } + /** + * Remove disabled state + */ + + }, { + key: "enable", + value: function enable() { + this.element.classList.remove(this.classNames.disabledState); + this.element.removeAttribute('aria-disabled'); + + if (this.type === 'select-one') { + this.element.setAttribute('tabindex', '0'); + } + + this.isDisabled = false; + } + /** + * Set disabled state + */ + + }, { + key: "disable", + value: function disable() { + this.element.classList.add(this.classNames.disabledState); + this.element.setAttribute('aria-disabled', 'true'); + + if (this.type === 'select-one') { + this.element.setAttribute('tabindex', '-1'); + } + + this.isDisabled = true; + } + }, { + key: "wrap", + value: function wrap(element) { + (0, _utils.wrap)(element, this.element); + } + }, { + key: "unwrap", + value: function unwrap(element) { + // Move passed element outside this element + this.element.parentNode.insertBefore(element, this.element); // Remove this element + + this.element.parentNode.removeChild(this.element); + } + /** + * Add loading state to element + */ + + }, { + key: "addLoadingState", + value: function addLoadingState() { + this.element.classList.add(this.classNames.loadingState); + this.element.setAttribute('aria-busy', 'true'); + this.isLoading = true; + } + /** + * Remove loading state from element + */ + + }, { + key: "removeLoadingState", + value: function removeLoadingState() { + this.element.classList.remove(this.classNames.loadingState); + this.element.removeAttribute('aria-busy'); + this.isLoading = false; + } + /** + * Set focussed state + */ + + }, { + key: "_onFocus", + value: function _onFocus() { + this.isFocussed = true; + } + /** + * Remove blurred state + */ + + }, { + key: "_onBlur", + value: function _onBlur() { + this.isFocussed = false; + } + }]); + + return Container; +}(); + +exports.default = Container; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _utils = __webpack_require__(0); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Input = +/*#__PURE__*/ +function () { + function Input(_ref) { + var element = _ref.element, + type = _ref.type, + classNames = _ref.classNames, + placeholderValue = _ref.placeholderValue; + + _classCallCheck(this, Input); + + Object.assign(this, { + element: element, + type: type, + classNames: classNames, + placeholderValue: placeholderValue + }); + this.element = element; + this.classNames = classNames; + this.isFocussed = this.element === document.activeElement; + this.isDisabled = false; + this._onPaste = this._onPaste.bind(this); + this._onInput = this._onInput.bind(this); + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + } + + _createClass(Input, [{ + key: "addEventListeners", + value: function addEventListeners() { + this.element.addEventListener('input', this._onInput); + this.element.addEventListener('paste', this._onPaste); + this.element.addEventListener('focus', this._onFocus); + this.element.addEventListener('blur', this._onBlur); + + if (this.element.form) { + this.element.form.addEventListener('reset', this._onFormReset); + } + } + }, { + key: "removeEventListeners", + value: function removeEventListeners() { + this.element.removeEventListener('input', this._onInput); + this.element.removeEventListener('paste', this._onPaste); + this.element.removeEventListener('focus', this._onFocus); + this.element.removeEventListener('blur', this._onBlur); + + if (this.element.form) { + this.element.form.removeEventListener('reset', this._onFormReset); + } + } + }, { + key: "enable", + value: function enable() { + this.element.removeAttribute('disabled'); + this.isDisabled = false; + } + }, { + key: "disable", + value: function disable() { + this.element.setAttribute('disabled', ''); + this.isDisabled = true; + } + }, { + key: "focus", + value: function focus() { + if (!this.isFocussed) { + this.element.focus(); + } + } + }, { + key: "blur", + value: function blur() { + if (this.isFocussed) { + this.element.blur(); + } + } + /** + * Set value of input to blank + * @return {Object} Class instance + * @public + */ + + }, { + key: "clear", + value: function clear() { + var setWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (this.element.value) { + this.element.value = ''; + } + + if (setWidth) { + this.setWidth(); + } + + return this; + } + /** + * Set the correct input width based on placeholder + * value or input value + * @return + */ + + }, { + key: "setWidth", + value: function setWidth(enforceWidth) { + var _this = this; + + var callback = function callback(width) { + _this.element.style.width = width; + }; + + if (this._placeholderValue) { + // If there is a placeholder, we only want to set the width of the input when it is a greater + // length than 75% of the placeholder. This stops the input jumping around. + var valueHasDesiredLength = this.element.value.length >= this._placeholderValue.length / 1.25; + + if (this.element.value && valueHasDesiredLength || enforceWidth) { + this.calcWidth(callback); + } + } else { + // If there is no placeholder, resize input to contents + this.calcWidth(callback); + } + } + }, { + key: "calcWidth", + value: function calcWidth(callback) { + return (0, _utils.calcWidthOfInput)(this.element, callback); + } + }, { + key: "setActiveDescendant", + value: function setActiveDescendant(activeDescendantID) { + this.element.setAttribute('aria-activedescendant', activeDescendantID); + } + }, { + key: "removeActiveDescendant", + value: function removeActiveDescendant() { + this.element.removeAttribute('aria-activedescendant'); + } + }, { + key: "_onInput", + value: function _onInput() { + if (this.type !== 'select-one') { + this.setWidth(); + } + } + }, { + key: "_onPaste", + value: function _onPaste(event) { + var target = event.target; + + if (target === this.element && this.preventPaste) { + event.preventDefault(); + } + } + }, { + key: "_onFocus", + value: function _onFocus() { + this.isFocussed = true; + } + }, { + key: "_onBlur", + value: function _onBlur() { + this.isFocussed = false; + } + }, { + key: "placeholder", + set: function set(placeholder) { + this.element.placeholder = placeholder; + } + }, { + key: "value", + set: function set(value) { + this.element.value = value; + }, + get: function get() { + return (0, _utils.sanitise)(this.element.value); + } + }]); + + return Input; +}(); + +exports.default = Input; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _constants = __webpack_require__(1); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var List = +/*#__PURE__*/ +function () { + function List(_ref) { + var element = _ref.element; + + _classCallCheck(this, List); + + Object.assign(this, { + element: element + }); + this.scrollPos = this.element.scrollTop; + this.height = this.element.offsetHeight; + this.hasChildren = !!this.element.children; + } + + _createClass(List, [{ + key: "clear", + value: function clear() { + this.element.innerHTML = ''; + } + }, { + key: "append", + value: function append(node) { + this.element.appendChild(node); + } + }, { + key: "getChild", + value: function getChild(selector) { + return this.element.querySelector(selector); + } + }, { + key: "scrollToTop", + value: function scrollToTop() { + this.element.scrollTop = 0; + } + }, { + key: "scrollToChoice", + value: function scrollToChoice(choice, direction) { + var _this = this; + + if (!choice) { + return; + } + + var dropdownHeight = this.element.offsetHeight; + var choiceHeight = choice.offsetHeight; // Distance from bottom of element to top of parent + + var choicePos = choice.offsetTop + choiceHeight; // Scroll position of dropdown + + var containerScrollPos = this.element.scrollTop + dropdownHeight; // Difference between the choice and scroll position + + var endpoint = direction > 0 ? this.element.scrollTop + choicePos - containerScrollPos : choice.offsetTop; + requestAnimationFrame(function (time) { + _this._animateScroll(time, endpoint, direction); + }); + } + }, { + key: "_scrollDown", + value: function _scrollDown(scrollPos, strength, endpoint) { + var easing = (endpoint - scrollPos) / strength; + var distance = easing > 1 ? easing : 1; + this.element.scrollTop = scrollPos + distance; + } + }, { + key: "_scrollUp", + value: function _scrollUp(scrollPos, strength, endpoint) { + var easing = (scrollPos - endpoint) / strength; + var distance = easing > 1 ? easing : 1; + this.element.scrollTop = scrollPos - distance; + } + }, { + key: "_animateScroll", + value: function _animateScroll(time, endpoint, direction) { + var _this2 = this; + + var strength = _constants.SCROLLING_SPEED; + var choiceListScrollTop = this.element.scrollTop; + var continueAnimation = false; + + if (direction > 0) { + this._scrollDown(choiceListScrollTop, strength, endpoint); + + if (choiceListScrollTop < endpoint) { + continueAnimation = true; + } + } else { + this._scrollUp(choiceListScrollTop, strength, endpoint); + + if (choiceListScrollTop > endpoint) { + continueAnimation = true; + } + } + + if (continueAnimation) { + requestAnimationFrame(function () { + _this2._animateScroll(time, endpoint, direction); + }); + } + } + }]); + + return List; +}(); + +exports.default = List; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _wrappedElement = _interopRequireDefault(__webpack_require__(4)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var WrappedInput = +/*#__PURE__*/ +function (_WrappedElement) { + _inherits(WrappedInput, _WrappedElement); + + function WrappedInput(_ref) { + var _this; + + var element = _ref.element, + classNames = _ref.classNames, + delimiter = _ref.delimiter; + + _classCallCheck(this, WrappedInput); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(WrappedInput).call(this, { + element: element, + classNames: classNames + })); + _this.delimiter = delimiter; + return _this; + } + + _createClass(WrappedInput, [{ + key: "value", + set: function set(items) { + var itemValues = items.map(function (_ref2) { + var value = _ref2.value; + return value; + }); + var joinedValues = itemValues.join(this.delimiter); + this.element.setAttribute('value', joinedValues); + this.element.value = joinedValues; + } // @todo figure out why we need this? Perhaps a babel issue + , + get: function get() { + return _get(_getPrototypeOf(WrappedInput.prototype), "value", this); + } + }]); + + return WrappedInput; +}(_wrappedElement.default); + +exports.default = WrappedInput; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _wrappedElement = _interopRequireDefault(__webpack_require__(4)); + +var _templates = _interopRequireDefault(__webpack_require__(5)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var WrappedSelect = +/*#__PURE__*/ +function (_WrappedElement) { + _inherits(WrappedSelect, _WrappedElement); + + function WrappedSelect(_ref) { + var element = _ref.element, + classNames = _ref.classNames; + + _classCallCheck(this, WrappedSelect); + + return _possibleConstructorReturn(this, _getPrototypeOf(WrappedSelect).call(this, { + element: element, + classNames: classNames + })); + } + + _createClass(WrappedSelect, [{ + key: "appendDocFragment", + value: function appendDocFragment(fragment) { + this.element.innerHTML = ''; + this.element.appendChild(fragment); + } + }, { + key: "placeholderOption", + get: function get() { + return this.element.querySelector('option[placeholder]'); + } + }, { + key: "optionGroups", + get: function get() { + return Array.from(this.element.getElementsByTagName('OPTGROUP')); + } + }, { + key: "options", + get: function get() { + return Array.from(this.element.options); + }, + set: function set(options) { + var fragment = document.createDocumentFragment(); + + var addOptionToFragment = function addOptionToFragment(data) { + // Create a standard select option + var template = _templates.default.option(data); // Append it to fragment + + + fragment.appendChild(template); + }; // Add each list item to list + + + options.forEach(function (optionData) { + return addOptionToFragment(optionData); + }); + this.appendDocFragment(fragment); + } + }]); + + return WrappedSelect; +}(_wrappedElement.default); + +exports.default = WrappedSelect; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/* global define */ + +(function () { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames () { + var classes = []; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes.push(arg); + } else if (Array.isArray(arg) && arg.length) { + var inner = classNames.apply(null, arg); + if (inner) { + classes.push(inner); + } + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes.push(key); + } + } + } + } + + return classes.join(' '); + } + + if ( true && module.exports) { + classNames.default = classNames; + module.exports = classNames; + } else if (true) { + // register as 'classnames', consistent with npm package name + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return classNames; + }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} +}()); + + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.clearChoices = exports.activateChoices = exports.filterChoices = exports.addChoice = void 0; + +var _constants = __webpack_require__(1); + +var addChoice = function addChoice(_ref) { + var value = _ref.value, + label = _ref.label, + id = _ref.id, + groupId = _ref.groupId, + disabled = _ref.disabled, + elementId = _ref.elementId, + customProperties = _ref.customProperties, + placeholder = _ref.placeholder, + keyCode = _ref.keyCode; + return { + type: _constants.ACTION_TYPES.ADD_CHOICE, + value: value, + label: label, + id: id, + groupId: groupId, + disabled: disabled, + elementId: elementId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }; +}; + +exports.addChoice = addChoice; + +var filterChoices = function filterChoices(results) { + return { + type: _constants.ACTION_TYPES.FILTER_CHOICES, + results: results + }; +}; + +exports.filterChoices = filterChoices; + +var activateChoices = function activateChoices() { + var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + return { + type: _constants.ACTION_TYPES.ACTIVATE_CHOICES, + active: active + }; +}; + +exports.activateChoices = activateChoices; + +var clearChoices = function clearChoices() { + return { + type: _constants.ACTION_TYPES.CLEAR_CHOICES + }; +}; + +exports.clearChoices = clearChoices; + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.highlightItem = exports.removeItem = exports.addItem = void 0; + +var _constants = __webpack_require__(1); + +var addItem = function addItem(_ref) { + var value = _ref.value, + label = _ref.label, + id = _ref.id, + choiceId = _ref.choiceId, + groupId = _ref.groupId, + customProperties = _ref.customProperties, + placeholder = _ref.placeholder, + keyCode = _ref.keyCode; + return { + type: _constants.ACTION_TYPES.ADD_ITEM, + value: value, + label: label, + id: id, + choiceId: choiceId, + groupId: groupId, + customProperties: customProperties, + placeholder: placeholder, + keyCode: keyCode + }; +}; + +exports.addItem = addItem; + +var removeItem = function removeItem(id, choiceId) { + return { + type: _constants.ACTION_TYPES.REMOVE_ITEM, + id: id, + choiceId: choiceId + }; +}; + +exports.removeItem = removeItem; + +var highlightItem = function highlightItem(id, highlighted) { + return { + type: _constants.ACTION_TYPES.HIGHLIGHT_ITEM, + id: id, + highlighted: highlighted + }; +}; + +exports.highlightItem = highlightItem; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.addGroup = void 0; + +var _constants = __webpack_require__(1); + +/* eslint-disable import/prefer-default-export */ +var addGroup = function addGroup(value, id, active, disabled) { + return { + type: _constants.ACTION_TYPES.ADD_GROUP, + value: value, + id: id, + active: active, + disabled: disabled + }; +}; + +exports.addGroup = addGroup; + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.resetTo = exports.clearAll = void 0; + +var clearAll = function clearAll() { + return { + type: 'CLEAR_ALL' + }; +}; + +exports.clearAll = clearAll; + +var resetTo = function resetTo(state) { + return { + type: 'RESET_TO', + state: state + }; +}; + +exports.resetTo = resetTo; + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setIsLoading = void 0; + +/* eslint-disable import/prefer-default-export */ +var setIsLoading = function setIsLoading(isLoading) { + return { + type: 'SET_IS_LOADING', + isLoading: isLoading + }; +}; + +exports.setIsLoading = setIsLoading; + +/***/ }) +/******/ ]); +}); \ No newline at end of file diff --git a/backoffice/vendors/choices/choices.min.css b/backoffice/vendors/choices/choices.min.css new file mode 100644 index 00000000..d4268fbe --- /dev/null +++ b/backoffice/vendors/choices/choices.min.css @@ -0,0 +1 @@ +.choices{position:relative;margin-bottom:24px;font-size:16px}.choices:focus{outline:none}.choices:last-child{margin-bottom:0}.choices.is-disabled .choices__inner,.choices.is-disabled .choices__input{background-color:#eaeaea;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.choices.is-disabled .choices__item{cursor:not-allowed}.choices[data-type*=select-one]{cursor:pointer}.choices[data-type*=select-one] .choices__inner{padding-bottom:7.5px}.choices[data-type*=select-one] .choices__input{display:block;width:100%;padding:10px;border-bottom:1px solid #ddd;background-color:#fff;margin:0}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);padding:0;background-size:8px;position:absolute;top:50%;right:0;margin-top:-10px;margin-right:25px;height:20px;width:20px;border-radius:10em;opacity:.5}.choices[data-type*=select-one] .choices__button:focus,.choices[data-type*=select-one] .choices__button:hover{opacity:1}.choices[data-type*=select-one] .choices__button:focus{box-shadow:0 0 0 2px #00bcd4}.choices[data-type*=select-one]:after{content:"";height:0;width:0;border-style:solid;border-color:#333 transparent transparent transparent;border-width:5px;position:absolute;right:11.5px;top:50%;margin-top:-2.5px;pointer-events:none}.choices[data-type*=select-one].is-open:after{border-color:transparent transparent #333 transparent;margin-top:-7.5px}.choices[data-type*=select-one][dir=rtl]:after{left:11.5px;right:auto}.choices[data-type*=select-one][dir=rtl] .choices__button{right:auto;left:0;margin-left:25px;margin-right:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=text] .choices__inner{cursor:text}.choices[data-type*=select-multiple] .choices__button,.choices[data-type*=text] .choices__button{position:relative;display:inline-block;margin:0 -4px 0 8px;padding-left:16px;border-left:1px solid #008fa1;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);background-size:8px;width:8px;line-height:1;opacity:.75;border-radius:0}.choices[data-type*=select-multiple] .choices__button:focus,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=text] .choices__button:focus,.choices[data-type*=text] .choices__button:hover{opacity:1}.choices__inner{display:inline-block;vertical-align:top;width:100%;background-color:#f9f9f9;padding:7.5px 7.5px 3.75px;border:1px solid #ddd;border-radius:2.5px;font-size:14px;min-height:44px;overflow:hidden}.is-focused .choices__inner,.is-open .choices__inner{border-color:#b7b7b7}.is-open .choices__inner{border-radius:2.5px 2.5px 0 0}.is-flipped.is-open .choices__inner{border-radius:0 0 2.5px 2.5px}.choices__list{margin:0;padding-left:0;list-style:none}.choices__list--single{display:inline-block;padding:4px 16px 4px 4px;width:100%}[dir=rtl] .choices__list--single{padding-right:4px;padding-left:16px}.choices__list--single .choices__item{width:100%}.choices__list--multiple{display:inline}.choices__list--multiple .choices__item{display:inline-block;vertical-align:middle;border-radius:20px;padding:4px 10px;font-size:12px;font-weight:500;margin-right:3.75px;margin-bottom:3.75px;background-color:#00bcd4;border:1px solid #00a5bb;color:#fff;word-break:break-all}.choices__list--multiple .choices__item[data-deletable]{padding-right:5px}[dir=rtl] .choices__list--multiple .choices__item{margin-right:0;margin-left:3.75px}.choices__list--multiple .choices__item.is-highlighted{background-color:#00a5bb;border:1px solid #008fa1}.is-disabled .choices__list--multiple .choices__item{background-color:#aaa;border:1px solid #919191}.choices__list--dropdown{display:none;z-index:1;position:absolute;width:100%;background-color:#fff;border:1px solid #ddd;top:100%;margin-top:-1px;border-bottom-left-radius:2.5px;border-bottom-right-radius:2.5px;overflow:hidden;word-break:break-all}.choices__list--dropdown.is-active{display:block}.is-open .choices__list--dropdown{border-color:#b7b7b7}.is-flipped .choices__list--dropdown{top:auto;bottom:100%;margin-top:0;margin-bottom:-1px;border-radius:.25rem .25rem 0 0}.choices__list--dropdown .choices__list{position:relative;max-height:300px;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position}.choices__list--dropdown .choices__item{position:relative;padding:10px;font-size:14px}[dir=rtl] .choices__list--dropdown .choices__item{text-align:right}@media (min-width:640px){.choices__list--dropdown .choices__item--selectable{padding-right:100px}.choices__list--dropdown .choices__item--selectable:after{content:attr(data-select-text);font-size:12px;opacity:0;position:absolute;right:10px;top:50%;transform:translateY(-50%)}[dir=rtl] .choices__list--dropdown .choices__item--selectable{text-align:right;padding-left:100px;padding-right:10px}[dir=rtl] .choices__list--dropdown .choices__item--selectable:after{right:auto;left:10px}}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:#f2f2f2}.choices__list--dropdown .choices__item--selectable.is-highlighted:after{opacity:.5}.choices__item{cursor:default}.choices__item--selectable{cursor:pointer}.choices__item--disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.5}.choices__heading{font-weight:600;font-size:12px;padding:10px;border-bottom:1px solid #f7f7f7;color:gray}.choices__button{text-indent:-9999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.choices__button:focus{outline:none}.choices__input{display:inline-block;vertical-align:baseline;background-color:#f9f9f9;font-size:14px;margin-bottom:5px;border:0;border-radius:0;max-width:100%;padding:4px 0 4px 2px}.choices__input:focus{outline:0}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__placeholder{opacity:.5}.choices[data-type*=select-multiple] .choices__input.is-hidden,.choices[data-type*=select-one] .choices__input.is-hidden,.choices__input.is-hidden{display:none} \ No newline at end of file diff --git a/backoffice/vendors/choices/choices.min.js b/backoffice/vendors/choices/choices.min.js new file mode 100644 index 00000000..5d105dc8 --- /dev/null +++ b/backoffice/vendors/choices/choices.min.js @@ -0,0 +1,58 @@ +/*! choices.js v7.0.0 | (c) 2019 Josh Johnson | https://github.com/jshjohnson/Choices#readme */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Choices=t():e.Choices=t()}(window,function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/public/assets/scripts/",i(i.s=9)}([function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diff=t.cloneObject=t.existsInArray=t.isIE11=t.fetchFromObject=t.getWindowHeight=t.dispatchEvent=t.sortByScore=t.sortByAlpha=t.calcWidthOfInput=t.strToEl=t.sanitise=t.isScrolledIntoView=t.getAdjacentEl=t.findAncestorByAttrName=t.wrap=t.isElement=t.isType=t.getType=t.generateId=t.generateChars=t.getRandomNumber=void 0;var n=function(e,t){return Math.floor(Math.random()*(t-e)+e)};t.getRandomNumber=n;var o=function(e){for(var t="",i=0;i1&&void 0!==arguments[1]?arguments[1]:document.createElement("div");return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t.appendChild(e)};t.findAncestorByAttrName=function(e,t){for(var i=e;i;){if(i.hasAttribute(t))return i;i=i.parentElement}return null};t.getAdjacentEl=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(e&&t){var n=e.parentNode.parentNode,o=Array.from(n.querySelectorAll(t)),r=o.indexOf(e);return o[r+(i>0?1:-1)]}};t.isScrolledIntoView=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(e)return i>0?t.scrollTop+t.offsetHeight>=e.offsetTop+e.offsetHeight:e.offsetTop>=t.scrollTop};var a=function(e){return s("String",e)?e.replace(/&/g,"&").replace(/>/g,"&rt;").replace(/".concat(a(i),""));if(o.style.position="absolute",o.style.padding="0",o.style.top="-9999px",o.style.left="-9999px",o.style.width="auto",o.style.whiteSpace="pre",document.body.contains(e)&&window.getComputedStyle){var r=window.getComputedStyle(e);r&&(o.style.fontSize=r.fontSize,o.style.fontFamily=r.fontFamily,o.style.fontWeight=r.fontWeight,o.style.fontStyle=r.fontStyle,o.style.letterSpacing=r.letterSpacing,o.style.textTransform=r.textTransform,o.style.padding=r.padding)}document.body.appendChild(o),requestAnimationFrame(function(){i&&o.offsetWidth!==e.offsetWidth&&(n=o.offsetWidth+4),document.body.removeChild(o),t.call(void 0,"".concat(n,"px"))})}else t.call(void 0,"".concat(n,"px"))};t.sortByAlpha=function(e,t){var i="".concat(e.label||e.value).toLowerCase(),n="".concat(t.label||t.value).toLowerCase();return in?1:0};t.sortByScore=function(e,t){return e.score-t.score};t.dispatchEvent=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=new CustomEvent(t,{detail:i,bubbles:!0,cancelable:!0});return e.dispatchEvent(n)};t.getWindowHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)};t.fetchFromObject=function e(t,i){var n=i.indexOf(".");return n>-1?e(t[i.substring(0,n)],i.substr(n+1)):t[i]};t.isIE11=function(){return!(!navigator.userAgent.match(/Trident/)||!navigator.userAgent.match(/rv[ :]11/))};t.existsInArray=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"value";return e.some(function(e){return s("String",t)?e[i]===t.trim():e[i]===t})};t.cloneObject=function(e){return JSON.parse(JSON.stringify(e))};t.diff=function(e,t){var i=Object.keys(e).sort(),n=Object.keys(t).sort();return i.filter(function(e){return n.indexOf(e)<0})}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCROLLING_SPEED=t.KEY_CODES=t.ACTION_TYPES=t.EVENTS=t.DEFAULT_CONFIG=t.DEFAULT_CLASSNAMES=void 0;var n=i(0),o={containerOuter:"choices",containerInner:"choices__inner",input:"choices__input",inputCloned:"choices__input--cloned",list:"choices__list",listItems:"choices__list--multiple",listSingle:"choices__list--single",listDropdown:"choices__list--dropdown",item:"choices__item",itemSelectable:"choices__item--selectable",itemDisabled:"choices__item--disabled",itemChoice:"choices__item--choice",placeholder:"choices__placeholder",group:"choices__group",groupHeading:"choices__heading",button:"choices__button",activeState:"is-active",focusState:"is-focused",openState:"is-open",disabledState:"is-disabled",highlightedState:"is-highlighted",hiddenState:"is-hidden",flippedState:"is-flipped",loadingState:"is-loading",noResults:"has-no-results",noChoices:"has-no-choices"};t.DEFAULT_CLASSNAMES=o;var r={items:[],choices:[],silent:!1,renderChoiceLimit:-1,maxItemCount:-1,addItems:!0,addItemFilterFn:null,removeItems:!0,removeItemButton:!1,editItems:!1,duplicateItemsAllowed:!0,delimiter:",",paste:!0,searchEnabled:!0,searchChoices:!0,searchFloor:1,searchResultLimit:4,searchFields:["label","value"],position:"auto",resetScrollPosition:!0,shouldSort:!0,shouldSortItems:!1,sortFn:n.sortByAlpha,placeholder:!0,placeholderValue:null,searchPlaceholderValue:null,prependValue:null,appendValue:null,renderSelectedChoices:"auto",loadingText:"Loading...",noResultsText:"No results found",noChoicesText:"No choices to choose from",itemSelectText:"Press to select",uniqueItemText:"Only unique values can be added",customAddItemText:"Only values matching specific conditions can be added",addItemText:function(e){return'Press Enter to add "'.concat((0,n.sanitise)(e),'"')},maxItemText:function(e){return"Only ".concat(e," values can be added")},itemComparer:function(e,t){return e===t},fuseOptions:{includeScore:!0},callbackOnInit:null,callbackOnCreateTemplates:null,classNames:o};t.DEFAULT_CONFIG=r;t.EVENTS={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice"};t.ACTION_TYPES={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL"};t.KEY_CODES={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34};t.SCROLLING_SPEED=4},function(e,t,i){"use strict";(function(e,n){var o,r=i(7);o="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==e?e:n;var s=Object(r.a)(o);t.a=s}).call(this,i(3),i(14)(e))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=i(0);function o(e,t){for(var i=0;i