diff --git a/controller/admin_phpmailer.php b/controller/admin_phpmailer.php
index 4e16a52..3e7b977 100644
--- a/controller/admin_phpmailer.php
+++ b/controller/admin_phpmailer.php
@@ -41,6 +41,19 @@ for ($i = 0; $i < sizeof($empfaenger); $i++) {
array_push($mail_bcc, "$row1[mail]");
}
}
+
+ if ($trenner[0] == 'V') {
+ $query2 = "select mail
+ from jumi_mailverteiler a, jumi_mailverteiler_entries b
+ where a.mvid=b.mvid
+ and b.mvid=$trenner[1]";
+
+ $result2 = $db->query($query2) or die("Cannot execute query");
+
+ while ($row2 = $result2->fetch_array()) {
+ array_push($mail_bcc, "$row2[mail]");
+ }
+ }
}
@@ -56,29 +69,28 @@ function save_mail($mail)
## Wegen dieser Funktion, wurde PHP Version aktiviert. Siehe ../Hinweise_zu_php8.txt
#####################################################
- /*
- # Scritp um sich $path anzeigen zu lassen:
- $mbox = imap_open("{imap.ionos.de:993/imap/ssl}", "info@ju-and-mi.de", "passwort", OP_HALFOPEN)
- or die("can't connect: " . imap_last_error());
- if($mbox){
- echo "connect";
- }else{
- echo "fail";
- }
- $list = imap_getmailboxes($mbox, "{imap.ionos.de:993/imap/ssl}", "*");
- if (is_array($list)) {
- foreach ($list as $key => $val) {
- echo "($key) ";
- echo imap_utf7_decode($val->name) . ",";
- echo "'" . $val->delimiter . "',";
- echo $val->attributes . "
\n";
- }
- } else {
- echo "imap_getmailboxes failed: " . imap_last_error() . "\n";
- }
-
- imap_close($mbox);
- */
+
+ // # Script um sich $path anzeigen zu lassen:
+ // $mbox = imap_open("{imap.ionos.de:993/imap/ssl}", "info@ju-and-mi.de", "passwort", OP_HALFOPEN)
+ // or die("can't connect: " . imap_last_error());
+ // if($mbox){
+ // echo "connect";
+ // }else{
+ // echo "fail";
+ // }
+ // $list = imap_getmailboxes($mbox, "{imap.ionos.de:993/imap/ssl}", "*");
+ // if (is_array($list)) {
+ // foreach ($list as $key => $val) {
+ // echo "($key) ";
+ // echo imap_utf7_decode($val->name) . ",";
+ // echo "'" . $val->delimiter . "',";
+ // echo $val->attributes . "
\n";
+ // }
+ // } else {
+ // echo "imap_getmailboxes failed: " . imap_last_error() . "\n";
+ // }
+ //
+ // imap_close($mbox);
$path = "{imap.ionos.de:993/imap/ssl}Gesendete Objekte";
$imapStream = imap_open($path, $mail->Username, $mail->Password);
@@ -110,7 +122,7 @@ try {
//$mail->SetFrom($_POST["userEmail"], $_POST["userName"]);
//$mail->AddReplyTo($_POST["userEmail"], $_POST["userName"]);
$mail->SetFrom("info@ju-and-mi.de", "Info JU & MI");
- $mail->AddAddress("info@ju-and-mi.de", "Info JU & MI");
+# $mail->AddAddress("info@ju-and-mi.de", "Info JU & MI");
$mail->AddReplyTo("info@ju-and-mi.de", "Info JU & MI");
//$mail->addCC('cc@example.com');
foreach ($mail_bcc as $empfbcc) {
@@ -135,10 +147,10 @@ try {
if (save_mail($mail)) {
#echo "Message saved!";
}
- echo "
Mail Sent Successfully.
";
+ echo ' Mail wurde versendet!
|***|success';
}
catch (Exception $e) {
- echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}
";
+ echo " Es konnte keine Mail verschickt werden! Mailer Error: {$mail->ErrorInfo}
|***|error";
}
?>
\ No newline at end of file
diff --git a/controller/admin_verteilerlisten.php b/controller/admin_verteilerlisten.php
new file mode 100644
index 0000000..fcdc738
--- /dev/null
+++ b/controller/admin_verteilerlisten.php
@@ -0,0 +1,111 @@
+query("SELECT count(*) Anz FROM jumi_mailverteiler WHERE upper(bezeichnung)=upper('$verteilername')");
+ $row = $result->fetch_array();
+
+ if ($verteilername == ''){ //verschlüsseltes Passwort überprüfen
+ echo ' Der Verteiler darf nicht leer sein.
|***|error';
+ exit;
+ }else if ($row['Anz'] > 0){ //verschlüsseltes Passwort überprüfen
+ echo ' Der Verteiler ist bereits vorhanden.
|***|error';
+ exit;
+ }else{
+
+ $sql1 = $db->query("INSERT INTO jumi_mailverteiler ( bezeichnung ) VALUES ( '$verteilername' )");
+ if($sql1){
+ echo ' Der Verteiler wurde gespeichert!
|***|success';
+ exit;
+ }else{
+ echo ' Der Verteiler wurde nicht gespeichert: Insert Fehler Datenbank.
|***|error';
+ exit;
+ }
+ }
+}
+
+
+
+if ($function == 'erfuser') {
+ if (isset($_POST['mvid'])) {
+ $mvid = $_POST['mvid'];
+ }
+ if (isset($_POST['mveid'])) {
+ $mveid = $_POST['mveid'];
+ }
+
+ $db = dbconnect();
+ $sql1 = $db->query("INSERT INTO jumi_mailverteiler_user_zuord ( mvid, mveid ) VALUES ( $mvid, $mveid )");
+ if($sql1){
+ echo ' Der Benutzer wurde zugewiesen!
|***|success|***|'.$mvid;
+ exit;
+ }else{
+ echo ' Der Benutzer wurde nicht zugewiesen: Insert Fehler Datenbank.
|***|error';
+ exit;
+ }
+}
+
+if ($function == 'deluser') {
+ if (isset($_POST['mvid'])) {
+ $mvid = $_POST['mvid'];
+ }
+ if (isset($_POST['mveid'])) {
+ $mveid = $_POST['mveid'];
+ }
+
+ $sql1 = $db->query("DELETE FROM jumi_mailverteiler_user_zuord WHERE mvid='$mvid' AND mveid='$mveid'");
+ if($sql1){
+ echo ' Der Benutzer wurde gelöscht!
|***|success|***|'.$mvid;
+ exit;
+ }else{
+ echo ' Der Benutzer wurde nicht gelöscht: DELETE Fehler Datenbank.
|***|error';
+ exit;
+ }
+}
+
+
+if ($function == 'delVerteiler') {
+ if (isset($_POST['mvid'])) {
+ $mvid = $_POST['mvid'];
+ }
+
+ $stmt1 = $db->query("DELETE FROM jumi_mailverteiler_user_zuord WHERE mvid= $mvid");
+ $stmt2 = $db->query("DELETE FROM jumi_mailverteiler WHERE mvid= $mvid");
+ if ($stmt1 AND $stmt2) {
+ echo ' Der Verteiler wurde gelöscht!
|***|success';
+ exit;
+ } else {
+ echo ' Der Verteiler wurde nicht gelöscht: DELETE Fehler Datenbank.
|***|error';
+ exit;
+ }
+}
+
+/*
+
+if ($function == 'deleteQuestion') {
+
+ $id2 = $_POST['id2'];
+
+ $stmt1 = $db->query("DELETE FROM jumi_umfragen_antworten WHERE ufid = $id2");
+ $stmt2 = $db->query("DELETE FROM jumi_umfragen_fragen WHERE ufid = $id2");
+ # ggf. bereis Abstimmergebnisse löschen
+
+ # Sonst werden keine neue Fragen erfasst
+ # unset($_SESSION["umfrageerf_ufid"]);
+
+
+ if ($stmt1 and $stmt2) {
+ echo "Success";
+ } else {
+ echo "Error";
+ }
+}
+
+*/
+?>
diff --git a/dashboard/mailversand.php b/dashboard/mailversand.php
index 38eddb8..e8c618c 100644
--- a/dashboard/mailversand.php
+++ b/dashboard/mailversand.php
@@ -27,6 +27,18 @@ require_once "../language/german.inc.php";
$table_data[] = $row;
}
$smarty->assign('table_data', $table_data);
+
+ # Gespeicherte Verteiler
+ $query1 = "SELECT mvid, bezeichnung
+ FROM jumi_mailverteiler
+ ORDER BY mvid ASC";
+
+ $result1 = $db->query($query1) or die("Cannot execute query");
+
+ while ($row1 = $result1->fetch_array()) {
+ $table_data1[] = $row1;
+ }
+ $smarty->assign('table_data1', $table_data1);
$smarty->assign('action', "$action");
$smarty->display("modern/dashboard/$templatename");
diff --git a/dashboard/verteilerlisten.php b/dashboard/verteilerlisten.php
new file mode 100644
index 0000000..ca136ef
--- /dev/null
+++ b/dashboard/verteilerlisten.php
@@ -0,0 +1,47 @@
+";
+ exit;
+}
+require_once "../language/german.inc.php";
+
+
+
+if (isset($_GET['action'])) {
+ $action = $_GET['action'];
+} else {
+ $action = '';
+}
+
+
+if ($action == '') {
+
+ # Gespeicherte Werte
+ $query = "SELECT mvid, bezeichnung
+ FROM jumi_mailverteiler
+ ORDER BY mvid ASC";
+
+ $result = $db->query($query) or die("Cannot execute query");
+
+ while ($row = $result->fetch_array()) {
+ $table_data[] = $row;
+ }
+ $smarty->assign('table_data', $table_data);
+
+}
+
+
+
+$smarty->assign('action', "$action");
+$smarty->display("$template/dashboard/$templatename");
+
+?>
+
diff --git a/dashboard/verteileruserzuordnung.php b/dashboard/verteileruserzuordnung.php
new file mode 100644
index 0000000..d9949f2
--- /dev/null
+++ b/dashboard/verteileruserzuordnung.php
@@ -0,0 +1,65 @@
+";
+ exit;
+}
+require_once "../language/german.inc.php";
+
+
+
+if (isset($_GET['action'])) {
+ $action = $_GET['action'];
+} else {
+ $action = '';
+}
+
+
+if ($action == '') {
+ if (isset($_GET['edit'])) {
+ $mvid = $_GET['edit'];
+ $smarty->assign('verteiler_edit', $mvid);
+ }
+
+ $result_head = $db->query("SELECT bezeichnung FROM jumi_mailverteiler WHERE mvid=$mvid");
+ $row_head = $result_head->fetch_array();
+ $smarty->assign('verteiler_bezeichnung', $row_head['bezeichnung']);
+
+ # Nicht zugewiesene User
+ $query = "SELECT mveid, vorname, nachname
+ FROM jumi_mailverteiler_entries
+ WHERE mveid NOT IN (SELECT mveid FROM jumi_mailverteiler_user_zuord WHERE mvid=$mvid)
+ ORDER BY nachname ASC";
+
+ $result = $db->query($query) or die("Cannot execute query");
+
+ while ($row = $result->fetch_array()) {
+ $table_data[] = $row;
+ }
+ $smarty->assign('table_data', $table_data);
+
+ # Zugewiesene Rechte
+ $query1 = "SELECT mveid, vorname, nachname
+ FROM jumi_mailverteiler_entries
+ WHERE mveid IN (SELECT mveid FROM jumi_mailverteiler_user_zuord WHERE mvid=$mvid)
+ ORDER BY nachname ASC";
+
+ $result1 = $db->query($query1) or die("Cannot execute query1");
+
+ while ($row1 = $result1->fetch_array()) {
+ $table_data1[] = $row1;
+ }
+ $smarty->assign('table_data1', $table_data1);
+
+}
+
+$smarty->assign('action', "$action");
+$smarty->display("$template/dashboard/$templatename");
+?>
+
diff --git a/js/components/admin_phpmailer.js b/js/components/admin_phpmailer.js
index a870fee..cc7569d 100644
--- a/js/components/admin_phpmailer.js
+++ b/js/components/admin_phpmailer.js
@@ -1,7 +1,7 @@
$(document).ready(function (e){
$("#frmEnquiry").on('submit',(function(e){
e.preventDefault();
- $('#loader-icon').show();
+ //$('#loader-icon').show();
var valid;
valid = validateContact();
if(valid) {
@@ -12,10 +12,21 @@
contentType: false,
cache: false,
processData:false,
- success: function(data){
-//alert(data);
- $("#mail-status").html(data);
- $('#loader-icon').hide();
+ success: function(result){
+ if(result!=''){
+ var a = result.split('|***|');
+ if(a[1]=="success"){
+ //https://developer.snapappointments.com/bootstrap-select/methods/#selectpickertoggle
+ $('.selectpicker').selectpicker('deselectAll');
+ document.getElementById("subject").value ="";
+ tinyMCE.get(0).setContent("");
+ }
+ $('#msg').show().delay(5000).fadeOut(500);
+ $('#msg').html(a[0]);
+ }
+ //alert(data);
+ //$("#mail-status").html(data);
+ //$('#loader-icon').hide();
},
error: function(){}
@@ -29,7 +40,11 @@
$(".info").html('');
// $("#userName").removeClass("invalid");
// $("#userEmail").removeClass("invalid");
- $("#empfaenger").removeClass("invalid");
+// $('.selectpicker').removeClass('invalid').selectpicker('setStyle');
+ //https://github.com/snapappointments/bootstrap-select/issues/1891
+ $('.selectpicker').removeClass('invalid').selectpicker('setStyle').parent().removeClass('invalid ');
+
+
$("#subject").removeClass("invalid");
$("#content").removeClass("invalid");
// Bei TinyMCE geht das anders
@@ -38,8 +53,7 @@
t.getBody().style.backgroundColor = color;
if($("#empfaenger").val()=='') {
- $("#empfaenger").addClass("invalid");
- $("#empfaenger").attr("title","Required");
+ $('.selectpicker').addClass('invalid').selectpicker('setStyle');
valid = false;
}
/*
@@ -55,7 +69,6 @@
}
*/
if(!$("#subject").val()) {
-
$("#subject").addClass("invalid");
$("#subject").attr("title","Required");
valid = false;
diff --git a/js/components/admin_rollen.js b/js/components/admin_rollen.js
index 657c9ba..ba6c978 100644
--- a/js/components/admin_rollen.js
+++ b/js/components/admin_rollen.js
@@ -14,10 +14,10 @@ function rollesave(){
if(a[1]=="success"){
document.getElementById("rollenname").value ="";
$(document).ajaxStop(function(){
- window.location = "?";
+ setTimeout(() => { window.location = "?"; }, 2000);
});
}
- $('#msg').show().delay(10000).fadeOut(500);
+ $('#msg').show().delay(2000).fadeOut(500);
$('#msg').html(a[0]);
}
},
@@ -192,10 +192,10 @@ function delRole(rid) {
var a = result.split('|***|');
if(a[1]=="success"){
$(document).ajaxStop(function(){
- window.location = "?";
+ setTimeout(() => { window.location = "?"; }, 2000);
});
}
- $('#msg').show().delay(10000).fadeOut(500);
+ $('#msg').show().delay(2000).fadeOut(500);
$('#msg').html(a[0]);
}
},
diff --git a/js/components/admin_verteilerlisten.js b/js/components/admin_verteilerlisten.js
new file mode 100644
index 0000000..ca01961
--- /dev/null
+++ b/js/components/admin_verteilerlisten.js
@@ -0,0 +1,130 @@
+function verteilersave(){
+ var verteilername = document.getElementById("verteilername").value;
+
+ $.ajax({
+ type: 'POST',
+ url: '../controller/admin_verteilerlisten.php',
+ data: {
+ 'function': 'verteilersave',
+ 'verteilername': verteilername
+ },
+ success: function(result) { //we got the response
+ if(result!=''){
+ var a = result.split('|***|');
+ if(a[1]=="success"){
+ document.getElementById("verteilername").value ="";
+ $(document).ajaxStop(function(){
+ setTimeout(() => { window.location = "?"; }, 2000);
+ });
+ }
+ $('#msg').show().delay(2000).fadeOut(500);
+ $('#msg').html(a[0]);
+ }
+ },
+ error: function(xhr, status, exception) {
+ console.log(xhr);
+ }
+ });
+
+}
+
+function erfuser(mveid, mvid) {
+
+
+ $.ajax({
+ type: 'POST',
+ url: '../controller/admin_verteilerlisten.php',
+ data: {
+ 'function': 'erfuser',
+ 'mveid': mveid,
+ 'mvid': mvid
+ },
+ success: function(result) { //we got the response
+ if(result!=''){
+ var a = result.split('|***|');
+ if(a[1]=="success"){
+ $(document).ajaxStop(function(){
+ // Refresh Modal
+ var value = a[2];
+ // load the url and show modal on success
+ $("#ZuordnungModal .modal-body").load('verteileruserzuordnung.php?edit='+value, function() {
+ $("#ZuordnungModal").modal("show");
+ });
+ });
+ }
+ $('#msg').show().delay(1000).fadeOut(500);
+ $('#msg').html(a[0]);
+ }
+ },
+ error: function(xhr, status, exception) {
+ console.log(xhr);
+ }
+ });
+}
+
+function deluser(mveid, mvid) {
+
+
+ $.ajax({
+ type: 'POST',
+ url: '../controller/admin_verteilerlisten.php',
+ data: {
+ 'function': 'deluser',
+ 'mveid': mveid,
+ 'mvid': mvid
+ },
+ success: function(result) { //we got the response
+ if(result!=''){
+ var a = result.split('|***|');
+ if(a[1]=="success"){
+ $(document).ajaxStop(function(){
+
+ // Refresh Modal
+ var value = a[2];
+ // load the url and show modal on success
+ $("#ZuordnungModal .modal-body").load('verteileruserzuordnung.php?edit='+value, function() {
+ $("#ZuordnungModal").modal("show");
+ });
+ });
+ }
+ $('#msg').show().delay(10000).fadeOut(500);
+ $('#msg').html(a[0]);
+ }
+ },
+ error: function(xhr, status, exception) {
+ console.log(xhr);
+ }
+ });
+}
+
+
+
+function delVerteiler(mvid) {
+ r = confirm('Verteiler wirklich löschen?');
+ if (r) {
+ $.ajax({
+ type: 'POST',
+ url: '../controller/admin_verteilerlisten.php',
+ data: {
+ 'function': 'delVerteiler',
+ 'mvid': mvid
+ },
+ success: function(result) { //we got the response
+ if(result!=''){
+ var a = result.split('|***|');
+ if(a[1]=="success"){
+ $(document).ajaxStop(function(){
+ setTimeout(() => { window.location = "?"; }, 2000);
+ });
+ }
+ $('#msg').show().delay(2000).fadeOut(500);
+ $('#msg').html(a[0]);
+ }
+ },
+ error: function(xhr, status, exception) {
+ console.log(xhr);
+ }
+ });
+ }
+}
+
diff --git a/js/select/bootstrap-select.min.css b/js/select/bootstrap-select.min.css
new file mode 100644
index 0000000..9c50c7b
--- /dev/null
+++ b/js/select/bootstrap-select.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */@-webkit-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@-o-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}.bootstrap-select>select.bs-select-hidden,select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover{color:rgba(255,255,255,.5)}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none;z-index:0!important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2!important}.bootstrap-select.is-invalid .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus,.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*=col-]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*=col-].dropdown-menu-right,.row .bootstrap-select[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select,.form-horizontal .bootstrap-select,.form-inline .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-lg .dropdown-toggle,.bootstrap-select.form-control-sm .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:0!important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0!important;padding:0!important}.bootstrap-select.bs-container .dropdown-menu{z-index:1060}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0!important;float:left;opacity:0!important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select .dropdown-toggle .bs-select-clear-selected{position:relative;display:block;margin-right:5px;text-align:center}.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected{padding-right:inherit}.bootstrap-select .dropdown-toggle .bs-select-clear-selected span{position:relative;top:-webkit-calc(((-1em / 1.5) + 1ex)/ 2);top:calc(((-1em / 1.5) + 1ex)/ 2);pointer-events:none}.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected span{top:auto}.bootstrap-select .dropdown-toggle.bs-placeholder .bs-select-clear-selected{display:none}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:0!important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:rgba(255,255,255,.5)!important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{-webkit-animation:.3s linear 750ms forwards bs-notify-fadeOut;-o-animation:.3s linear 750ms forwards bs-notify-fadeOut;animation:.3s linear 750ms forwards bs-notify-fadeOut}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:'\00a0'}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:'';display:block;width:.5em;height:1em;border-style:solid;border-width:0 .26em .26em 0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group{display:block}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group{display:block}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none}
\ No newline at end of file
diff --git a/js/select/bootstrap-select.min.js b/js/select/bootstrap-select.min.js
new file mode 100644
index 0000000..c642976
--- /dev/null
+++ b/js/select/bootstrap-select.min.js
@@ -0,0 +1,8 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */
+!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){!function($){"use strict";var M=["sanitize","whiteList","sanitizeFn"],W=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],P={"*":["class","dir","id","lang","role","tabindex","style",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},B=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,R=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i,U=["title","placeholder"];function S(e,t,i){if(i&&"function"==typeof i)return i(e);for(var s=Object.keys(t),n=0,o=e.length;n]+>/g,"")),a=(a=s?u(a):a).toUpperCase(),o="function"==typeof i?i(a,t):"contains"===i?0<=a.indexOf(t):a.startsWith(t)))break}return o}function v(e){return parseInt(e,10)||0}$.fn.triggerNative=function(e){var t,i=this[0];i.dispatchEvent&&(V?t=new Event(e,{bubbles:!0}):(t=document.createEvent("Event")).initEvent(e,!0,!1),i.dispatchEvent(t))};var j={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"},_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,F=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\u1ab0-\\u1aff\\u1dc0-\\u1dff]","g");function G(e){return j[e]}function u(e){return(e=e.toString())&&e.replace(_,G).replace(F,"")}f={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},s="(?:"+Object.keys(f).join("|")+")",q=RegExp(s),K=RegExp(s,"g");var f,q,K,k=function(e){return q.test(e=null==e?"":""+e)?e.replace(K,Q):e};function Q(e){return f[e]}var Y={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"},Z=27,J=13,w=32,I=9,C=38,O=40,m=window.Dropdown||bootstrap.Dropdown;function X(){var t;try{t=$.fn.dropdown.Constructor.VERSION}catch(e){t=m.VERSION}return t}var g={success:!1,major:"3"};try{g.full=(X()||"").split(" ")[0].split("."),g.major=g.full[0],g.success=!0}catch(e){}var ee=0,A=".bs.select",T={DISABLED:"disabled",DIVIDER:"divider",SHOW:"open",DROPUP:"dropup",MENU:"dropdown-menu",MENURIGHT:"dropdown-menu-right",MENULEFT:"dropdown-menu-left",BUTTONCLASS:"btn-default",POPOVERHEADER:"popover-title",ICONBASE:"glyphicon",TICKICON:"glyphicon-ok"},z={MENU:"."+T.MENU,DATA_TOGGLE:'data-toggle="dropdown"'},D={div:document.createElement("div"),span:document.createElement("span"),i:document.createElement("i"),subtext:document.createElement("small"),a:document.createElement("a"),li:document.createElement("li"),whitespace:document.createTextNode("\xa0"),fragment:document.createDocumentFragment(),option:document.createElement("option")},te=(D.selectedOption=D.option.cloneNode(!1),D.selectedOption.setAttribute("selected",!0),D.noResults=D.li.cloneNode(!1),D.noResults.className="no-results",D.a.setAttribute("role","option"),D.a.className="dropdown-item",D.subtext.className="text-muted",D.text=D.span.cloneNode(!1),D.text.className="text",D.checkMark=D.span.cloneNode(!1),new RegExp(C+"|"+O)),ie=new RegExp("^"+I+"$|"+Z),L={li:function(e,t,i){var s=D.li.cloneNode(!1);return e&&(1===e.nodeType||11===e.nodeType?s.appendChild(e):s.innerHTML=e),void 0!==t&&""!==t&&(s.className=t),null!=i&&s.classList.add("optgroup-"+i),s},a:function(e,t,i){var s=D.a.cloneNode(!0);return e&&(11===e.nodeType?s.appendChild(e):s.insertAdjacentHTML("beforeend",e)),void 0!==t&&""!==t&&s.classList.add.apply(s.classList,t.split(/\s+/)),i&&s.setAttribute("style",i),s},text:function(e,t){var i,s,n=D.text.cloneNode(!1);if(e.content?n.innerHTML=e.content:(n.textContent=e.text,e.icon&&(i=D.whitespace.cloneNode(!1),(s=(!0===t?D.i:D.span).cloneNode(!1)).className=this.options.iconBase+" "+e.icon,D.fragment.appendChild(s),D.fragment.appendChild(i)),e.subtext&&((s=D.subtext.cloneNode(!1)).textContent=e.subtext,n.appendChild(s))),!0===t)for(;0'},maxOptions:!1,mobile:!1,selectOnTab:!0,dropdownAlignRight:!1,windowPadding:0,virtualScroll:600,display:!1,sanitize:!0,sanitizeFn:null,whiteList:P},H.prototype={constructor:H,init:function(){var i=this,e=this.$element.attr("id"),t=this.$element[0],s=t.form;ee++,this.selectId="bs-select-"+ee,t.classList.add("bs-select-hidden"),this.multiple=this.$element.prop("multiple"),this.autofocus=this.$element.prop("autofocus"),t.classList.contains("show-tick")&&(this.options.showTick=!0),this.$newElement=this.createDropdown(),this.$element.after(this.$newElement).prependTo(this.$newElement),s&&null===t.form&&(s.id||(s.id="form-"+this.selectId),t.setAttribute("form",s.id)),this.$button=this.$newElement.children("button"),this.options.allowClear&&(this.$clearButton=this.$button.children(".bs-select-clear-selected")),this.$menu=this.$newElement.children(z.MENU),this.$menuInner=this.$menu.children(".inner"),this.$searchbox=this.$menu.find("input"),t.classList.remove("bs-select-hidden"),this.fetchData(function(){i.render(!0),i.buildList(),requestAnimationFrame(function(){i.$element.trigger("loaded"+A)})}),!0===this.options.dropdownAlignRight&&this.$menu[0].classList.add(T.MENURIGHT),void 0!==e&&this.$button.attr("data-id",e),this.checkDisabled(),this.clickListener(),4