diff --git a/acp/acp.php b/acp/acp.php index 35c240e3..e352703a 100644 --- a/acp/acp.php +++ b/acp/acp.php @@ -8,11 +8,11 @@ require '../lib/Spyc/Spyc.php'; require '../config.php'; -if(is_file('../'.FC_CONTENT_DIR.'/config.php')) { - include '../'.FC_CONTENT_DIR.'/config.php'; +if(is_file(FC_CONTENT_DIR.'/config.php')) { + include FC_CONTENT_DIR.'/config.php'; } -if(is_file('../'.FC_CONTENT_DIR.'/config_smtp.php')) { - include '../'.FC_CONTENT_DIR.'/config_smtp.php'; +if(is_file(FC_CONTENT_DIR.'/config_smtp.php')) { + include FC_CONTENT_DIR.'/config_smtp.php'; } @@ -50,10 +50,10 @@ } - define("CONTENT_DB", "../$fc_db_content"); - define("USER_DB", "../$fc_db_user"); - define("STATS_DB", "../$fc_db_stats"); - define("POSTS_DB", "../$fc_db_posts"); + define("CONTENT_DB", "$fc_db_content"); + define("USER_DB", "$fc_db_user"); + define("STATS_DB", "$fc_db_stats"); + define("POSTS_DB", "$fc_db_posts"); $db_content = new Medoo([ 'database_type' => 'sqlite', @@ -77,7 +77,7 @@ } -define("INDEX_DB", "../$fc_db_index"); +define("INDEX_DB", "$fc_db_index"); define("FC_ROOT", str_replace("/acp","",FC_INC_DIR)); define("IMAGES_FOLDER", "$img_path"); define("FILES_FOLDER", "$files_path"); @@ -238,7 +238,7 @@ var ace_theme = 'chrome'; var tinymce_skin = 'oxide'; var acptheme = ""; - if(acptheme === 'dark') { + if(acptheme === 'dark' || acptheme === 'dark_mono') { var ace_theme = 'twilight'; var tinymce_skin = 'oxide-dark'; } @@ -289,38 +289,78 @@ timeZone: 'UTC', format: 'YYYY-MM-DD HH:mm' }); + + function addTax(price,addition,tax) { + addition = parseInt(addition); + tax = parseInt(tax); + price = price*(addition+100)/100; + price = price*(tax+100)/100; + return price; + } + + function removeTax(price,addition,tax) { + addition = parseInt(addition); + tax = parseInt(tax); + price = price*100/(addition+100); + price = price*100/(tax+100); + return price; + } if($("#price").val()) { - get_netto = $("#price").val(); - + get_price_net = $("#price").val(); var e = document.getElementById("tax"); var get_tax = e.options[e.selectedIndex].text; get_tax = parseInt(get_tax); - get_netto_calc = get_netto.replace(/\./g, ''); - get_netto_calc = get_netto_calc.replace(",","."); - current_brutto = get_netto_calc*(get_tax+100)/100; - current_brutto = accounting.formatNumber(current_brutto,4,".",","); - $('#price_total').val(current_brutto); + get_price_addition = $("#price_addition").val(); + get_net_calc = get_price_net.replace(/\./g, ''); + get_net_calc = get_net_calc.replace(",","."); + current_gross = addTax(get_net_calc,get_price_addition,get_tax); + current_gross = accounting.formatNumber(current_gross,4,".",","); + $('#price_total').val(current_gross); + + calculated_net = addTax(get_net_calc,get_price_addition,0); + calculated_net = accounting.formatNumber(calculated_net,4,".",","); + $('#calculated_net').html(calculated_net); + + $('.show_price_tax').html(get_tax); + $('.show_price_addition').html(get_price_addition); $('#price').keyup(function(){ - get_netto = $('#price').val(); - //get_tax = parseInt($('#tax').val()); - get_netto_calc = get_netto.replace(/\./g, ''); - get_netto_calc = get_netto_calc.replace(",","."); - current_brutto = get_netto_calc*(get_tax+100)/100; - current_brutto = accounting.formatNumber(current_brutto,4,".",","); - $('#price_total').val(current_brutto); - }); + get_price_net = $('#price').val(); + get_price_addition = $("#price_addition").val(); + get_net_calc = get_price_net.replace(/\./g, ''); + get_net_calc = get_net_calc.replace(",","."); + current_gross = addTax(get_net_calc,get_price_addition,get_tax); + current_gross = accounting.formatNumber(current_gross,4,".",","); + $('#price_total').val(current_gross); + + calculated_net = addTax(get_net_calc,get_price_addition,0); + calculated_net = accounting.formatNumber(calculated_net,4,".",","); + $('#calculated_net').html(calculated_net); + + }); $('#price_total').keyup(function(){ get_brutto = $('#price_total').val(); - //get_tax = parseInt($('#tax').val()); - get_brutto_calc = get_brutto.replace(/\./g, ''); - get_brutto_calc = get_brutto_calc.replace(",","."); - current_netto = get_brutto_calc*100/(get_tax+100); - current_netto = accounting.formatNumber(current_netto,4,".",","); - $('#price').val(current_netto); + get_price_addition = $("#price_addition").val(); + get_gross_calc = get_brutto.replace(/\./g, ''); + get_gross_calc = get_gross_calc.replace(",","."); + current_net = removeTax(get_gross_calc,get_price_addition,get_tax); + current_net = accounting.formatNumber(current_net,4,".",","); + $('#price').val(current_net); + $('#calculated_net').html(current_net); + }); + + $('#price_addition').keyup(function(){ + get_price_net = $('#price').val(); + get_price_addition = $("#price_addition").val(); + + get_net_calc = get_price_net.replace(/\./g, ''); + get_net_calc = get_net_calc.replace(",","."); + current_gross = addTax(get_net_calc,get_price_addition,get_tax); + current_gross = accounting.formatNumber(current_gross,4,".",","); + $('#price_total').val(current_gross); }); $('#tax').bind("change keyup", function(){ @@ -329,19 +369,100 @@ var get_tax = e.options[e.selectedIndex].text; get_tax = parseInt(get_tax); - get_netto = $('#price').val(); - get_netto_calc = get_netto.replace(",","."); - - current_brutto = get_netto_calc*(get_tax+100)/100; - current_brutto = accounting.formatNumber(current_brutto,4,".",","); + get_price_addition = $('#price_addition').val(); + get_price_net = $('#price').val(); + get_net_calc = get_price_net.replace(",","."); - get_brutto_calc = current_brutto.replace(",","."); - current_netto = get_brutto_calc*100/(get_tax+100); - current_netto = accounting.formatNumber(current_netto,4,".",","); + current_gross = addTax(get_net_calc,get_price_addition,get_tax); + current_gross = accounting.formatNumber(current_gross,4,".",","); - $('#price_total').val(current_brutto); - $('#price').val(current_netto); + $('#price_total').val(current_gross); + }); + + + get_price_net_s1 = $('#price_s1').val(); + price_s1 = showScaledPrices(get_price_net_s1,get_price_addition,get_tax); + $('#calculated_net_s1').html(price_s1['net']); + $('#calculated_gross_s1').html(price_s1['gross']); + + $('#price_s1').keyup(function(){ + get_price_net_s1 = $('#price_s1').val(); + price = showScaledPrices(get_price_net_s1,get_price_addition,get_tax); + $('#calculated_net_s1').html(price['net']); + $('#calculated_gross_s1').html(price['gross']); + }); + + get_price_net_s2 = $('#price_s2').val(); + price_s2 = showScaledPrices(get_price_net_s2,get_price_addition,get_tax); + $('#calculated_net_s2').html(price_s2['net']); + $('#calculated_gross_s2').html(price_s2['gross']); + + $('#price_s2').keyup(function(){ + get_price_net_s2 = $('#price_s2').val(); + price = showScaledPrices(get_price_net_s2,get_price_addition,get_tax); + $('#calculated_net_s2').html(price['net']); + $('#calculated_gross_s2').html(price['gross']); + }); + + get_price_net_s3 = $('#price_s3').val(); + price_s3 = showScaledPrices(get_price_net_s3,get_price_addition,get_tax); + $('#calculated_net_s3').html(price_s3['net']); + $('#calculated_gross_s3').html(price_s3['gross']); + + $('#price_s3').keyup(function(){ + get_price_net_s3 = $('#price_s3').val(); + price = showScaledPrices(get_price_net_s3,get_price_addition,get_tax); + $('#calculated_net_s3').html(price['net']); + $('#calculated_gross_s3').html(price['gross']); + }); + + get_price_net_s4 = $('#price_s4').val(); + price_s4 = showScaledPrices(get_price_net_s4,get_price_addition,get_tax); + $('#calculated_net_s4').html(price_s4['net']); + $('#calculated_gross_s4').html(price_s4['gross']); + + $('#price_s4').keyup(function(){ + get_price_net_s4 = $('#price_s4').val(); + price = showScaledPrices(get_price_net_s4,get_price_addition,get_tax); + $('#calculated_net_s4').html(price['net']); + $('#calculated_gross_s4').html(price['gross']); + }); + + get_price_net_s5 = $('#price_s5').val(); + price_s5 = showScaledPrices(get_price_net_s5,get_price_addition,get_tax); + $('#calculated_net_s5').html(price_s5['net']); + $('#calculated_gross_s5').html(price_s5['gross']); + + $('#price_s5').keyup(function(){ + get_price_net_s5 = $('#price_s5').val(); + price = showScaledPrices(get_price_net_s5,get_price_addition,get_tax); + $('#calculated_net_s5').html(price['net']); + $('#calculated_gross_s5').html(price['gross']); }); + + + + function showScaledPrices(price,addition,tax) { + addition = parseInt(addition); + tax = parseInt(tax); + + price = price.replace(/\./g, ''); + price = price.replace(",","."); + + price_net = price*(addition+100)/100; + price_gross = price_net*(tax+100)/100; + + price_net = accounting.formatNumber(price_net,4,".",","); + price_gross = accounting.formatNumber(price_gross,4,".",","); + + var prices = new Object(); + prices['net'] = price_net; + prices['gross'] = price_gross; + + + return prices; + } + } diff --git a/acp/core/ajax.media.php b/acp/core/ajax.media.php index f526d86c..adf5458d 100644 --- a/acp/core/ajax.media.php +++ b/acp/core/ajax.media.php @@ -41,7 +41,7 @@ } - define("CONTENT_DB", "../../$fc_db_content"); + define("CONTENT_DB", "$fc_db_content"); $db_content = new Medoo([ 'database_type' => 'sqlite', diff --git a/acp/core/dashboard.checks.php b/acp/core/dashboard.checks.php index 511c6a65..0e881ec8 100644 --- a/acp/core/dashboard.checks.php +++ b/acp/core/dashboard.checks.php @@ -8,28 +8,28 @@ echo '
'.$lang['alert_no_htaccess'].'
'; } -if(!is_dir('../'.FC_CONTENT_DIR.'/cache/cache/')) { - mkdir('../'.FC_CONTENT_DIR.'/cache/cache/', 0777); +if(!is_dir(FC_CONTENT_DIR.'/cache/cache/')) { + mkdir(FC_CONTENT_DIR.'/cache/cache/', 0777); } -if(!is_dir('../'.FC_CONTENT_DIR.'/cache/templates_c/')) { - mkdir('../'.FC_CONTENT_DIR.'/cache/templates_c/', 0777); +if(!is_dir(FC_CONTENT_DIR.'/cache/templates_c/')) { + mkdir(FC_CONTENT_DIR.'/cache/templates_c/', 0777); } $writable_items = array( '../sitemap.xml', - '../'.FC_CONTENT_DIR.'/', - '../'.FC_CONTENT_DIR.'/avatars/', - '../'.FC_CONTENT_DIR.'/cache/', - '../'.FC_CONTENT_DIR.'/cache/cache/', - '../'.FC_CONTENT_DIR.'/cache/templates_c/', - '../'.FC_CONTENT_DIR.'/files/', - '../'.FC_CONTENT_DIR.'/images/', - '../'.FC_CONTENT_DIR.'/SQLite/', - '../'.FC_CONTENT_DIR.'/SQLite/content.sqlite3', - '../'.FC_CONTENT_DIR.'/SQLite/flatTracker.sqlite3', - '../'.FC_CONTENT_DIR.'/SQLite/user.sqlite3', - '../'.FC_CONTENT_DIR.'/SQLite/index.sqlite3' + ''.FC_CONTENT_DIR.'/', + ''.FC_CONTENT_DIR.'/avatars/', + ''.FC_CONTENT_DIR.'/cache/', + ''.FC_CONTENT_DIR.'/cache/cache/', + ''.FC_CONTENT_DIR.'/cache/templates_c/', + ''.FC_CONTENT_DIR.'/files/', + ''.FC_CONTENT_DIR.'/images/', + ''.FC_CONTENT_DIR.'/SQLite/', + ''.FC_CONTENT_DIR.'/SQLite/content.sqlite3', + ''.FC_CONTENT_DIR.'/SQLite/flatTracker.sqlite3', + ''.FC_CONTENT_DIR.'/SQLite/user.sqlite3', + ''.FC_CONTENT_DIR.'/SQLite/index.sqlite3' ); foreach($writable_items as $f) { @@ -39,13 +39,13 @@ } if($db_type !== 'sqlite') { - if($f == '../'.FC_CONTENT_DIR.'/SQLite/content.sqlite3') { + if($f == ''.FC_CONTENT_DIR.'/SQLite/content.sqlite3') { continue; } - if($f == '../'.FC_CONTENT_DIR.'/SQLite/flatTracker.sqlite3') { + if($f == ''.FC_CONTENT_DIR.'/SQLite/flatTracker.sqlite3') { continue; } - if($f == '../'.FC_CONTENT_DIR.'/SQLite/user.sqlite3') { + if($f == ''.FC_CONTENT_DIR.'/SQLite/user.sqlite3') { continue; } } diff --git a/acp/core/dashboard.system.php b/acp/core/dashboard.system.php index 369f762f..5825b12b 100644 --- a/acp/core/dashboard.system.php +++ b/acp/core/dashboard.system.php @@ -15,7 +15,7 @@ echo '
'; $user_avatar = ''; -$user_avatar_path = '../'. FC_CONTENT_DIR . '/avatars/' . md5($_SESSION['user_nick']) . '.png'; +$user_avatar_path = '../content/avatars/' . md5($_SESSION['user_nick']) . '.png'; if(is_file("$user_avatar_path")) { $user_avatar = ''; } diff --git a/acp/core/download.php b/acp/core/download.php index f516aac8..c22dfd23 100644 --- a/acp/core/download.php +++ b/acp/core/download.php @@ -13,7 +13,7 @@ $filename = basename($_GET['dl']); - $download = '../../' . FC_CONTENT_DIR . '/SQLite/'.$filename; + $download = FC_CONTENT_DIR . '/SQLite/'.$filename; if(is_file("$download")) { diff --git a/acp/core/files.upload-script.php b/acp/core/files.upload-script.php index cdb4f1a6..887709c8 100644 --- a/acp/core/files.upload-script.php +++ b/acp/core/files.upload-script.php @@ -48,7 +48,7 @@ } - define("CONTENT_DB", "../../$fc_db_content"); + define("CONTENT_DB", "$fc_db_content"); $db_content = new Medoo([ 'database_type' => 'sqlite', diff --git a/acp/core/functions.php b/acp/core/functions.php index c6853c81..05898064 100644 --- a/acp/core/functions.php +++ b/acp/core/functions.php @@ -135,10 +135,10 @@ function get_preferences() { * - dashboard_listed_all_addons */ -function fc_get_hook($posion,$data) { +function fc_get_hook($position,$data) { global $all_mods; - $hook = basename($posion); + $hook = basename($position); foreach($all_mods as $mod) { diff --git a/acp/core/functions_addons.php b/acp/core/functions_addons.php index e35553f0..776455e1 100644 --- a/acp/core/functions_addons.php +++ b/acp/core/functions_addons.php @@ -14,16 +14,17 @@ function get_all_plugins() { - $dir = "../content/"; $plugins = array(); - $scanned_directory = array_diff(scandir('../'.FC_CONTENT_DIR.'/plugins/'), array('..', '.','.DS_Store')); + $scanned_directory = array_diff(scandir(FC_CONTENT_DIR.'/plugins/'), array('..', '.','.DS_Store')); foreach($scanned_directory as $p) { $path_parts = pathinfo($p); - if($path_parts['extension'] != 'php') { - continue; - } else { + if($path_parts['extension'] == 'php') { $plugins[] = $p; + } else { + if((is_dir(FC_CONTENT_DIR.'/plugins/'.$p)) && (is_file(FC_CONTENT_DIR.'/plugins/'.$p.'/index.php'))) { + $plugins[] = $p; + } } } @@ -79,6 +80,54 @@ function fc_get_addons($t='module') { } +/** + * delete addon and its contents + */ + +function fc_delete_addon($addon,$type) { + + if($type == 'm') { + $dir = '../modules'; + } else if($type == 'p') { + $dir = FC_CONTENT_DIR.'/plugins'; + } else if($type == 't') { + $dir = '../styles'; + } + + $remove_dir = $dir.'/'.$addon; + fc_reomove_addon_files($remove_dir); + $record_msg = 'removed addon: '.$addon.' ('.$type.')'; + record_log($_SESSION['user_nick'],$record_msg,"8"); +} + +/** + * remove addon contents + * folders (recursive) and/or files + */ + + function fc_reomove_addon_files($item) { + if(is_dir($item)){ + $objects = scandir($item); + foreach ($objects as $object) { + if ($object != "." && $object != "..") { + if(filetype($item."/".$object) == "dir") { + fc_reomove_addon_files($item."/".$object); + } else { + unlink($item."/".$object); + } + } + } + reset($objects); + rmdir($item); + } + + if(is_file($item)) { + unlink($item); + } + + } + + /** * show all installed templates @@ -171,7 +220,7 @@ function mods_check_in() { $str = ""; - $file = "../" . FC_CONTENT_DIR . "/cache/active_mods.php"; + $file = FC_CONTENT_DIR . "/cache/active_mods.php"; file_put_contents($file, $str, LOCK_EX); } diff --git a/acp/core/functions_cache.php b/acp/core/functions_cache.php index 3a867bd4..8abb87bb 100644 --- a/acp/core/functions_cache.php +++ b/acp/core/functions_cache.php @@ -55,7 +55,7 @@ function cache_lastedit($num = 5) { $string .= "?>"; - $file = "../" . FC_CONTENT_DIR . "/cache/cache_lastedit.php"; + $file = FC_CONTENT_DIR . "/cache/cache_lastedit.php"; file_put_contents($file, $string, LOCK_EX); } @@ -110,7 +110,7 @@ function cache_keywords() { } // eol foreach - $file = "../" . FC_CONTENT_DIR . "/cache/cache_keywords.html"; + $file = FC_CONTENT_DIR . "/cache/cache_keywords.html"; file_put_contents($file, $page_keywords, LOCK_EX); } @@ -122,7 +122,7 @@ function cache_keywords() { function delete_cache_file($file='cache_mostclicked') { - $fp = "../" . FC_CONTENT_DIR . "/cache"; + $fp = FC_CONTENT_DIR . "/cache"; $file = basename($file) . ".php"; if(is_file("$fp/$file")) { @@ -141,8 +141,8 @@ function fc_delete_smarty_cache($cache_id) { require_once '../lib/Smarty/Smarty.class.php'; $smarty = new Smarty; - $smarty->cache_dir = '../'.FC_CONTENT_DIR.'/cache/cache/'; - $smarty->compile_dir = '../'.FC_CONTENT_DIR.'/cache/templates_c/'; + $smarty->cache_dir = FC_CONTENT_DIR.'/cache/cache/'; + $smarty->compile_dir = FC_CONTENT_DIR.'/cache/templates_c/'; if($cache_id == 'all') { $smarty->clearAllCache(); @@ -181,7 +181,7 @@ function cache_url_paths() { } $str = ""; - $file = "../" . FC_CONTENT_DIR . "/cache/active_urls.php"; + $file = FC_CONTENT_DIR . "/cache/active_urls.php"; file_put_contents($file, $str, LOCK_EX); } diff --git a/acp/core/functions_index.php b/acp/core/functions_index.php index fb64a21f..82df107a 100644 --- a/acp/core/functions_index.php +++ b/acp/core/functions_index.php @@ -483,6 +483,18 @@ function fc_add_url($url) { } +/** + * delete page by id from pages table + */ + +function fc_remove_page_from_index($id) { + $dbh = new PDO("sqlite:".INDEX_DB); + $sql = "DELETE FROM pages WHERE page_id = :id"; + $sth = $dbh->prepare($sql); + $sth->bindParam(':id', $id, PDO::PARAM_STR); + $cnt_changes = $sth->execute(); + $dbh = null; +} /** * delete URL from pages table diff --git a/acp/core/icons.php b/acp/core/icons.php index e56f7367..ccfb49a3 100644 --- a/acp/core/icons.php +++ b/acp/core/icons.php @@ -24,6 +24,7 @@ $icon['bars'] = ''; $icon['bookmark'] = ''; +$icon['calendar_check'] = ''; $icon['check'] = ''; $icon['circle_alt'] = ''; $icon['check_circle'] = ''; @@ -102,6 +103,8 @@ $icon['th'] = ''; $icon['th_large'] = ''; $icon['th_list'] = ''; +$icon['thumbs_up'] = ''; +$icon['thumbs_down'] = ''; $icon['trash_alt'] = ''; $icon['times_circle'] = ''; $icon['tools'] = ''; diff --git a/acp/core/inc.addons.php b/acp/core/inc.addons.php index 7f45807b..1404b7c4 100644 --- a/acp/core/inc.addons.php +++ b/acp/core/inc.addons.php @@ -3,13 +3,22 @@ //prohibit unauthorized access require 'core/access.php'; + +/* delete addon */ + +if(isset($_POST['delete_addon'])) { + fc_delete_addon($_POST['addon'],$_POST['type']); + $all_mods = get_all_moduls(); + $all_plugins = get_all_plugins(); +} + + /** * list and access module * list plugins * list and access themes */ - $addon_mode = 'list_modules'; $active_modules = 'active'; $active_plugins = ''; diff --git a/acp/core/inc.comments.php b/acp/core/inc.comments.php deleted file mode 100644 index 421ecbd3..00000000 --- a/acp/core/inc.comments.php +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/acp/core/inc.reactions.php b/acp/core/inc.reactions.php new file mode 100644 index 00000000..2a34c28c --- /dev/null +++ b/acp/core/inc.reactions.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/acp/core/list.addons.php b/acp/core/list.addons.php index cdccf0e6..687d8bfe 100644 --- a/acp/core/list.addons.php +++ b/acp/core/list.addons.php @@ -54,7 +54,7 @@ $bnt_check_in_out = ''.$lang['btn_mod_disable'].''; } } - + include '../modules/'.$modFolder.'/info.inc.php'; $listlinks = '
'; @@ -104,6 +104,12 @@ echo $modal; } + $btn_delete_addon = '
'; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= '
'; $tpl = $template_file; @@ -116,6 +122,7 @@ $tpl = str_replace("{\$MOD_LIVECODE}", "$mod_livecode","$tpl"); $tpl = str_replace("{\$MOD_CHECK_IN_OUT}", "$bnt_check_in_out","$tpl"); $tpl = str_replace("{\$MOD_README}", "$btn_help_text","$tpl"); + $tpl = str_replace("{\$MOD_DELETE}", "$btn_delete_addon","$tpl"); $tpl = str_replace("{\$MOD_NAV}", "$listlinks","$tpl"); diff --git a/acp/core/list.plugins.php b/acp/core/list.plugins.php index 44a1c8ef..584fe09d 100644 --- a/acp/core/list.plugins.php +++ b/acp/core/list.plugins.php @@ -12,27 +12,30 @@ foreach($all_plugins as $plugin) { - $pathinfo = pathinfo('/content/plugins/'.$plugin); - if($pathinfo['extension'] != 'php') { - continue; - } - $id = md5($plugin); - $plugin_src = file_get_contents('../'.FC_CONTENT_DIR.'/plugins/'.$plugin); - $comment = getfirstcommentblock($plugin_src); - $plugin_info = get_include_contents('../'.FC_CONTENT_DIR.'/plugins/'.$plugin); - $tpl_icon = "images/plugin-icon.png"; - $edit_btn = 'Source'; + $pathinfo = pathinfo('/content/plugins/'.$plugin); - /* show the first comment block */ - $help_btn = ''; - if($comment != '') { - echo ''; - $help_btn = ' '.$icon['question'].''; + if($pathinfo['extension'] == 'php') { + $plugin_src = file_get_contents(FC_CONTENT_DIR.'/plugins/'.$plugin); + $plugin_info = get_include_contents(FC_CONTENT_DIR.'/plugins/'.$plugin); + } else { + if((is_dir(FC_CONTENT_DIR.'/plugins/'.$plugin)) && (is_file(FC_CONTENT_DIR.'/plugins/'.$plugin.'/index.php'))) { + $plugin_src = file_get_contents(FC_CONTENT_DIR.'/plugins/'.$plugin.'/index.php'); + $plugin_info = get_include_contents(FC_CONTENT_DIR.'/plugins/'.$plugin.'/index.php'); + } } - $btn_group = '
'.$edit_btn.$help_btn.'
'; + $btn_delete_addon = '
'; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= ''; + $btn_delete_addon .= '
'; + + $tpl_icon = "images/plugin-icon.png"; + $source_btn = 'Source'; + $btn_group = '
'.$source_btn.$btn_delete_addon.'
'; /* shorten the filename if needed */ $plugin_name = basename($plugin,'.php'); @@ -51,7 +54,7 @@ $plugin_version .= 'Author: '.$plugin_info['author'].''; } $plugin_version .= '

'; - + $tpl = $template_file; $tpl = str_replace("{\$PLUGIN_NAME}", "$plugin_name","$template_file"); @@ -68,7 +71,7 @@ echo ''; echo '
'; diff --git a/acp/core/nav.comments.php b/acp/core/nav.comments.php deleted file mode 100644 index e3587e9d..00000000 --- a/acp/core/nav.comments.php +++ /dev/null @@ -1,15 +0,0 @@ -'; - -echo '
  • '.$icon['list'].' '.$lang['post_list'].'
  • '; - -echo ''; - -?> \ No newline at end of file diff --git a/acp/core/nav.reactions.php b/acp/core/nav.reactions.php new file mode 100644 index 00000000..75340638 --- /dev/null +++ b/acp/core/nav.reactions.php @@ -0,0 +1,17 @@ +'; + +echo '
  • '.$icon['comments'].' '.$lang['reactions_comments'].'
  • '; +echo '
  • '.$icon['thumbs_up'].' '.$lang['reactions_votings'].'
  • '; +echo '
  • '.$icon['calendar_check'].' '.$lang['reactions_events'].'
  • '; + +echo ''; + +?> \ No newline at end of file diff --git a/acp/core/pages.edit.php b/acp/core/pages.edit.php index 4ddcfb05..4749a522 100755 --- a/acp/core/pages.edit.php +++ b/acp/core/pages.edit.php @@ -475,7 +475,7 @@ "page_sort" => "$page_sort", "page_language" => "$page_language", "page_linkname" => "$page_linkname", - "page_permalink" => "$page_language", + "page_permalink" => "$page_permalink", "page_permalink_short" => "$page_permalink_short", "page_target" => "$page_target", "page_classes" => "$page_classes", @@ -542,7 +542,7 @@ "page_sort" => "$page_sort", "page_language" => "$page_language", "page_linkname" => "$page_linkname", - "page_permalink" => "$page_language", + "page_permalink" => "$page_permalink", "page_permalink_short" => "$page_permalink_short", "page_target" => "$page_target", "page_classes" => "$page_classes", diff --git a/acp/core/pages.edit_form.php b/acp/core/pages.edit_form.php index 19b42783..544182cc 100644 --- a/acp/core/pages.edit_form.php +++ b/acp/core/pages.edit_form.php @@ -662,11 +662,14 @@ -/* tab_info */ +/* tab shortcodes */ echo'
    '; + + + echo '
    '; -echo '
    '; +echo '
    '; echo '
    Shortcodes
    '; $shortcodes = fc_get_shortcodes(); @@ -680,7 +683,7 @@ echo '
    '; echo '
    '; -echo '
    '; +echo '
    '; echo '
    '.$lang['snippets'].'
    '; $snippets = $db_content->select("fc_textlib","textlib_name", [ @@ -699,49 +702,8 @@ } echo '
    '; -echo '
    '; -echo '
    '; -echo '
    '.$lang['files'].'
    '; - -$get_all_files = fc_get_all_media_data('application'); - -foreach($get_all_files as $file) { - $file_names[] = $file['media_file']; -} -$file_names = array_unique($file_names); -echo '
    '; -foreach($file_names as $file) { - echo '
    '; - echo ''; - echo ''; - echo '
    '; -} echo '
    '; - -echo '
    '; -echo '
    '; -echo '
    '.$lang['images'].'
    '; - -$get_all_images = fc_get_all_media_data('image'); - -foreach($get_all_images as $img) { - $img_names[] = $img['media_file']; -} -$img_names = array_unique($img_names); - - -echo '
    '; -foreach($img_names as $img) { - echo '
    '; - echo ''; - echo ''; - echo '
    '; -} -echo '
    '; - -echo '
    '; - echo '
    '; diff --git a/acp/core/pages.index.php b/acp/core/pages.index.php index 2d47bd14..646fe58e 100644 --- a/acp/core/pages.index.php +++ b/acp/core/pages.index.php @@ -62,6 +62,10 @@ fc_crawler_bulk(); } +if(isset($_GET['a']) && $_GET['a'] == 'remove') { + $fc_upi = fc_remove_page_from_index($_GET['id']); +} + @@ -312,6 +316,7 @@ $tpl = str_replace("{btn_update_info}", $icon['sync_alt'], $tpl); $tpl = str_replace("{btn_start_index}", $icon['sitemap'], $tpl); + $tpl = str_replace("{btn_remove}", $icon['trash_alt'], $tpl); $tpl = str_replace("{title_update_page_index}", $lang['btn_update_page_index'], $tpl); $tpl = str_replace("{title_update_page_content}", $lang['btn_update_page_content'], $tpl); diff --git a/acp/core/pages.snippets.php b/acp/core/pages.snippets.php index 401497b3..fa5d0ef9 100644 --- a/acp/core/pages.snippets.php +++ b/acp/core/pages.snippets.php @@ -1,11 +1,27 @@ update("fc_textlib", [ + "textlib_type" => "snippet_core" +], [ + "textlib_name" => $system_snippets +]); + +/* update missing textlib_type for user generated snippets */ +$upd_core_snippets = $db_content->update("fc_textlib", [ + "textlib_type" => "snippet" +], [ + "OR" => [ + "textlib_type" => null, + "textlib_type" => "" + ] +]); + if(isset($_REQUEST['suggest_name'])) { $textlib_name = clean_filename($_REQUEST['suggest_name']); @@ -49,7 +65,6 @@ } print_sysmsg("$sys_message"); - } @@ -64,8 +79,7 @@ $snippet_theme = $snippet_themes[0]; $snippet_template = $snippet_themes[1]; - if(count($_POST['picker1_images']) > 1) { - + if(count($_POST['picker1_images']) > 1) { $snippet_thumbnail = implode("<->", array_unique($_POST['picker1_images'])); } else { $st = $_POST['picker1_images']; @@ -116,10 +130,10 @@ } else { - $data = $db_content->insert("fc_textlib", [ "textlib_content" => $_POST['textlib_content'], "textlib_name" => $snippet_name, + "textlib_type" => 'snippet', "textlib_lang" => $_POST['sel_language'], "textlib_notes" => $_POST['textlib_notes'], "textlib_groups" => $_POST['snippet_groups'], @@ -210,19 +224,15 @@ } $snippet_label_filter = substr("$snippet_label_filter", 0, -3); // cut the last ' OR' -$filter_string = "WHERE textlib_id IS NOT NULL AND textlib_type NOT IN('shortcode')"; if($_SESSION['type'] == 'all') { - $filter_type = ''; + $filter_string = "WHERE (textlib_type = 'snippet' OR textlib_type = 'snippet_core')"; } else if($_SESSION['type'] == 'system') { - $filter_type = "textlib_name IN($system_snippets_str)"; + $filter_string = "WHERE textlib_type = 'snippet_core'"; } else if($_SESSION['type'] == 'own') { - $filter_type = "textlib_name NOT IN($system_snippets_str)"; + $filter_string = "WHERE textlib_type = 'snippet'"; } -if($filter_type != "") { - $filter_string .= " AND ($filter_type) "; -} if($set_snippet_keyword_filter != "") { $filter_string .= " AND $set_snippet_keyword_filter"; @@ -239,8 +249,8 @@ $sql_cnt = "SELECT count(*) AS 'cnt_all_snippets', (SELECT count(*) FROM fc_textlib WHERE textlib_type NOT IN('shortcode') ) AS 'cnt_snippets', -(SELECT count(*) FROM fc_textlib WHERE textlib_name IN($system_snippets_str) ) AS 'cnt_system_snippets', -(SELECT count(*) FROM fc_textlib WHERE textlib_name NOT IN($system_snippets_str) AND (textlib_type NOT IN('shortcode')) ) AS 'cnt_custom_snippets', +(SELECT count(*) FROM fc_textlib WHERE textlib_type = 'snippet_core' ) AS 'cnt_system_snippets', +(SELECT count(*) FROM fc_textlib WHERE textlib_type = 'snippet' ) AS 'cnt_custom_snippets', (SELECT count(*) FROM fc_textlib $filter_string ) AS 'cnt_filter_snippets' FROM fc_textlib"; @@ -280,38 +290,40 @@ } $snippets_list = $db_content->query($sql)->fetchAll(PDO::FETCH_ASSOC); - $cnt_pages = ceil($cnt['cnt_filter_snippets']/$files_per_page); $cnt_snippets = count($snippets_list); -$pag_backlink = ''.$icon['angle_double_left'].''; -$pag_forwardlink = ''.$icon['angle_double_right'].''; +$pag_backlink = '
  • '.$icon['angle_double_left'].'
  • '; +$pag_forwardlink = '
  • '.$icon['angle_double_right'].'
  • '; unset($pag_string); for($x=0;$x<$cnt_pages;$x++) { - $aclass = "btn btn-fc"; + $aclass = "page-link"; $page_start = $x*$files_per_page; $page_nbr = $x+1; if($page_start == $start) { - $aclass = "btn btn-fc active"; + $aclass = "page-link active"; $pag_start = $x-($show_numbers/2); if($pag_start < 0) { $pag_start = 0; } - $pag_end = $pag_start+$show_numbers; + $pag_end = $pag_start+$show_numbers; if($pag_end > $cnt_pages) { $pag_end = $cnt_pages; } + + $a_pag_string[] = '
  • '.$page_nbr.'
  • '; + } else { + $a_pag_string[] = '
  • '.$page_nbr.'
  • '; } - $a_pag_string[] = "$page_nbr "; - + } /** @@ -326,7 +338,6 @@ /* list snippets */ - echo '
    '; echo '
    '; @@ -449,7 +460,7 @@ echo ''; echo '
    '; echo ''.$lang['edit'].''; - echo ''.$icon['copy'].''; + echo ''.$icon['copy'].''; echo '
    '; echo ''; echo ''; @@ -459,13 +470,15 @@ echo ''; - echo '
    '; - echo $pag_backlink .' '; + echo '
    '; + echo '
      '; + echo $pag_backlink; foreach(range($pag_start, $pag_end) as $number) { echo $a_pag_string[$number]; } - echo ' '. $pag_forwardlink; - echo '
    '; //EOL PAGINATION + echo $pag_forwardlink; + echo ''; + echo '
    '; echo '
    '; @@ -491,6 +504,11 @@ echo '
    '; echo ''; + if($btn_remove_keyword != '') { + echo '

    '.$btn_remove_keyword.'

    '; + } + + echo '
    '; echo 'Alle '.$cnt['cnt_snippets'].''; echo 'System '.$cnt['cnt_system_snippets'].''; @@ -506,13 +524,10 @@ /* end of sidebar */ - echo '
    '; echo '
    '; - - + echo '
    '; - echo ''; // .app-container diff --git a/acp/core/posts.edit.php b/acp/core/posts.edit.php index a8aee0c3..98a83208 100644 --- a/acp/core/posts.edit.php +++ b/acp/core/posts.edit.php @@ -302,7 +302,7 @@ /* comments yes/no */ -if($post_comments == 1) { +if($post_data['post_comments'] == 1) { $sel_comments_yes = 'selected'; $sel_comments_no = ''; } else { @@ -310,12 +310,36 @@ $sel_comments_yes = ''; } - $select_comments = ''; +/* votings/reactions no, yes for registered users, yes for all */ + +if($post_data['post_votings'] == '') { + $post_data['post_votings'] = $prefs_posts_default_votings; +} + +if($post_data['post_votings'] == 1 OR $post_data['post_votings'] == '') { + $sel_votings_1 = 'selected'; + $sel_votings_2 = ''; + $sel_votings_3 = ''; +} else if($post_data['post_votings'] == 2) { + $sel_votings_1 = ''; + $sel_votings_2 = 'selected'; + $sel_votings_3 = ''; +} else { + $sel_votings_1 = ''; + $sel_votings_2 = ''; + $sel_votings_3 = 'selected'; +} + +$select_votings = ''; /* autor */ @@ -378,6 +402,15 @@ $post_product_currency = $fc_preferences['prefs_posts_products_default_currency']; } +if($post_data['post_product_price_addition'] == '') { + $post_data['post_product_price_addition'] = 0; +} + +$post_product_price_net_purchasing = $post_data['post_product_price_net_purchasing']; +if($post_product_price_net_purchasing == '') { + $post_product_price_net_purchasing = '0,00'; +} + /* add text snippet to prices */ @@ -390,7 +423,7 @@ foreach($snippets_price_list as $snippet) { $selected = ""; - if($snippet['textlib_name'] == $post_data['product_textlib_price']) { + if($snippet['textlib_name'] == $post_data['post_product_textlib_price']) { $selected = 'selected'; } $snippet_select_pricelist .= ''; @@ -419,7 +452,7 @@ $select_file = ''; + +$select_guestlist .= ''; +$select_guestlist .= ''; +$select_guestlist .= ''; + +$select_guestlist .= ''; +$form_tpl = str_replace('{select_guestlist}', $select_guestlist, $form_tpl); + +if($post_data['post_event_guestlist_public_nbr'] == '1') { + $form_tpl = str_replace('{checked_gl_public_nbr_1}', 'checked', $form_tpl); + $form_tpl = str_replace('{checked_gl_public_nbr_2}', '', $form_tpl); +} else { + $form_tpl = str_replace('{checked_gl_public_nbr_1}', '', $form_tpl); + $form_tpl = str_replace('{checked_gl_public_nbr_2}', 'checked', $form_tpl); +} + +$form_tpl = str_replace('{checked_guestlist}', $checked_guestlist, $form_tpl); + + /* product */ $form_tpl = str_replace('{post_product_number}', $post_data['post_product_number'], $form_tpl); @@ -583,6 +656,25 @@ $form_tpl = str_replace('{snippet_select_pricelist}', $snippet_select_pricelist, $form_tpl); $form_tpl = str_replace('{snippet_select_text}', $snippet_select_text, $form_tpl); +$form_tpl = str_replace('{post_product_price_net_purchasing}', $post_product_price_net_purchasing, $form_tpl); +$form_tpl = str_replace('{post_product_price_addition}', $post_data['post_product_price_addition'], $form_tpl); + +$form_tpl = str_replace('{post_product_amount_s1}', $post_data['post_product_amount_s1'], $form_tpl); +$form_tpl = str_replace('{post_product_amount_s2}', $post_data['post_product_amount_s2'], $form_tpl); +$form_tpl = str_replace('{post_product_amount_s3}', $post_data['post_product_amount_s3'], $form_tpl); +$form_tpl = str_replace('{post_product_amount_s4}', $post_data['post_product_amount_s4'], $form_tpl); +$form_tpl = str_replace('{post_product_amount_s5}', $post_data['post_product_amount_s5'], $form_tpl); +$form_tpl = str_replace('{post_product_price_net_s1}', $post_data['post_product_price_net_s1'], $form_tpl); +$form_tpl = str_replace('{post_product_price_net_s2}', $post_data['post_product_price_net_s2'], $form_tpl); +$form_tpl = str_replace('{post_product_price_net_s3}', $post_data['post_product_price_net_s3'], $form_tpl); +$form_tpl = str_replace('{post_product_price_net_s4}', $post_data['post_product_price_net_s4'], $form_tpl); +$form_tpl = str_replace('{post_product_price_net_s5}', $post_data['post_product_price_net_s5'], $form_tpl); +$form_tpl = str_replace('{post_product_price_gross_s1}', $post_product_price_gross_s1, $form_tpl); +$form_tpl = str_replace('{post_product_price_gross_s2}', $post_product_price_gross_s2, $form_tpl); +$form_tpl = str_replace('{post_product_price_gross_s3}', $post_product_price_gross_s3, $form_tpl); +$form_tpl = str_replace('{post_product_price_gross_s4}', $post_product_price_gross_s4, $form_tpl); +$form_tpl = str_replace('{post_product_price_gross_s5}', $post_product_price_gross_s5, $form_tpl); + /* galleries */ $form_tpl = str_replace('{modal_upload_form}', $form_upload_tpl, $form_tpl); diff --git a/acp/core/posts.list.php b/acp/core/posts.list.php index 9c827a5e..c2491b02 100644 --- a/acp/core/posts.list.php +++ b/acp/core/posts.list.php @@ -407,25 +407,42 @@ $tax = $fc_preferences['prefs_posts_products_tax_alt2']; } + $post_product_price_addition = $get_posts[$i]['post_product_price_addition']; + if($post_product_price_addition == '') { + $post_product_price_addition = 0; + } + $post_price_net = str_replace('.', '', $get_posts[$i]['post_product_price_net']); $post_price_net = str_replace(',', '.', $post_price_net); - $post_price_gross = $post_price_net*($tax+100)/100; + $post_price_net_calculated = $post_price_net*($post_product_price_addition+100)/100; + $post_price_gross = $post_price_net_calculated*($tax+100)/100; + + $post_price_net_calculated = fc_post_print_currency($post_price_net_calculated); $post_price_gross = fc_post_print_currency($post_price_gross); - $show_items_price = '
    '; - $show_items_price .= $post_price_net . ' ('.$tax.'%)
    '; - $show_items_price .= $post_price_gross; + $show_items_price = '
    '; + //$show_items_price .= fc_post_print_currency($post_price_net) . '
    '; + $show_items_price .= $post_price_net_calculated . '
    '; + $show_items_price .= 'incl. '.$post_product_price_addition . '%'. ' + '.$tax.'%
    '; + $show_items_price .= ''.$post_price_gross.''; $show_items_price .= '
    '; } + $show_items_downloads = ''; if($get_posts[$i]['post_type'] == 'f') { - - $download_counter = 0; - $download_counter = $get_posts[$i]['post_file_attachment_hits']; - $show_items_price = '
    '; - $show_items_price .= 'Downloads: '.$download_counter; - $show_items_price .= '
    '; + $download_counter = (int) $get_posts[$i]['post_file_attachment_hits']; + $show_items_downloads = '
    '; + $show_items_downloads .= $icon['download'].' '.$download_counter; + $show_items_downloads .= '
    '; + } + + $show_items_redirects = ''; + if($get_posts[$i]['post_type'] == 'l') { + $redirects_counter = (int) $get_posts[$i]['post_link_hits']; + $show_items_redirects = '
    '; + $show_items_redirects .= $icon['link'].' '.$redirects_counter; + $show_items_redirects .= '
    '; } @@ -457,7 +474,7 @@ echo ''.$published_date.'
    '.$release_date.'
    '.$lastedit_date.'
    '; echo ''.$show_type.''; echo ''.$show_thumb.''; - echo ''.$show_events_date.$show_items_price.$show_items_downloads.'
    '.$get_posts[$i]['post_title'].'
    '.$trimmed_teaser.'
    '.$label.''; + echo ''.$show_events_date.$show_items_price.$show_items_downloads.$show_items_redirects.'
    '.$get_posts[$i]['post_title'].'
    '.$trimmed_teaser.'
    '.$label.''; echo ''; echo '
    '; echo '
    '; - echo '
    '; + echo ''; echo ''; echo '
    '; echo '
    '; @@ -198,12 +205,12 @@ if($comment_status == 1) { $btn_class = 'btn-fc'; } - echo '
    '; + echo ''; echo ''; echo '
    '; echo ''; echo '
    '; - echo '
    '; + echo ''; echo ''; echo '
    '; echo '
    '; @@ -219,7 +226,7 @@ } echo '
    '; - echo '
    '; + echo ''; echo '
    '; echo ''; echo ''; @@ -263,7 +270,7 @@ echo '
    '; echo ''.$lang['label_filter_by_status'].''; -echo ''; +echo ''; echo ''; echo ''; @@ -296,7 +303,7 @@ /* show select for posts with comments */ echo '
    '; echo ''.$lang['label_filter_comments_by_posts'].''; -echo ''; +echo ''; echo ''; +echo ''; +echo '
    '; + +echo '
    '; +echo ''; + +for($i=0;$i<$cnt_get_commitments;$i++) { + + echo ''; + + echo ''; + + echo ''; + echo ''; + + if(strlen($get_commitments[$i]['comment_author']) == 32 && ctype_xdigit($get_commitments[$i]['comment_author'])) { + $voter = 'anonymous'; + } else { + $voter = $get_commitments[$i]['comment_author']; + } + + echo ''; + + + $title = $temp_event[$get_commitments[$i]['comment_relation_id']]; + + echo ''; + + echo ''; + +} + +echo '
    '.$get_commitments[$i]['comment_id'].''.date('Y-m-d H:i',$get_commitments[$i]['comment_time']).''.$voter.''.$title.'
    '; + +echo '
    '; // scroll-box +echo '
    '; // card + +echo ''; + +echo ''; +echo '
    '; + +echo '
    '; + +echo '
    '; +echo '
    '; +echo ''; +echo ''; +echo '
    '; +echo '
    '; + + +echo '
    '; // card + +echo '
    '; +echo ''; + +echo ''; // max-height-container +echo ''; // app-container + + +?> \ No newline at end of file diff --git a/acp/core/reactions.votings.php b/acp/core/reactions.votings.php new file mode 100644 index 00000000..b1428793 --- /dev/null +++ b/acp/core/reactions.votings.php @@ -0,0 +1,159 @@ +delete("fc_comments", [ + "AND" => [ + "comment_id" => $_POST['bulk_delete'], + "comment_type" => ["upv","dnv"] + ] + ]); + + echo '
    '; + echo 'Deleted Data ('.$delete->rowCount().')'; + echo '
    '; + +} + +/* get all post ids and titles */ +$get_posts = $db_posts->select("fc_posts", ["post_id","post_title"],[ + "ORDER" => ["post_id" => "DESC"] + ]); + +foreach($get_posts as $posts) { + $temp_post[$posts['post_id']] = $posts['post_title']; +} + +$get_votes = $db_content->select("fc_comments", "*",[ + "OR" => [ + "comment_type" => ["upv","dnv"] + ] +]); + + +if($_POST['filter_by_post'] == 'all') { + unset($_SESSION['filter_by_post']); +} + +if(isset($_POST['filter_by_post']) && is_numeric($_POST['filter_by_post'])) { + $_SESSION['filter_by_post'] = (int) $_POST['filter_by_post']; +} + +if($_SESSION['filter_by_post'] != '') { + $get_votes = $db_content->select("fc_comments", "*",[ + "AND" => [ + "OR" => [ + "comment_type" => ["upv","dnv"] + ], + "comment_relation_id" => $_SESSION['filter_by_post'] + ] + ]); + + $get_voting_data = fc_get_voting_data('post',$_SESSION['filter_by_post']); +} + +$cnt_get_votes = count($get_votes); + +if(is_array($get_voting_data)) { + $filter_data = ''.$get_voting_data['all'].' '.$icon['thumbs_up'].' '.$get_voting_data['upv'].' '.$icon['thumbs_down'].' '.$get_voting_data['dnv'].''; +} + +echo '
    '; +echo $lang['label_votings'] .' '. $filter_data; +echo '
    '; + +echo '
    '; +echo '
    '; + +echo '
    '; +echo '
    '; + + +echo '
    '; +echo '
    '; + +echo '
    '; +echo ''; +echo ''; +echo '
    '; + +echo '
    '; +echo ''; + + + +for($i=0;$i<$cnt_get_votes;$i++) { + + echo ''; + + echo ''; + + echo ''; + echo ''; + + if($get_votes[$i]['comment_type'] == 'upv') { + $show_vote = $icon['thumbs_up']; + } else { + $show_vote = ''.$icon['thumbs_down'].''; + } + + echo ''; + + if(strlen($get_votes[$i]['comment_author']) == 32 && ctype_xdigit($get_votes[$i]['comment_author'])) { + $voter = 'anonymous'; + } else { + $voter = $get_votes[$i]['comment_author']; + } + + echo ''; + + + $title = $temp_post[$get_votes[$i]['comment_relation_id']]; + + echo ''; + + echo ''; + +} + +echo '
    '.$get_votes[$i]['comment_id'].''.date('Y-m-d H:i',$get_votes[$i]['comment_time']).''.$show_vote.''.$voter.''.$title.'
    '; +echo '
    '; // scroll-box + +echo '
    '; +echo '
    '; // card + +echo '
    '; +echo '
    '; + +echo '
    '; + +echo '
    '; +echo '
    '; +echo ''; +echo ''; +echo '
    '; +echo '
    '; + +echo '
    '; // card + +echo '
    '; +echo '
    '; + +echo '
    '; // max-height-container +echo '
    '; // app-container + +?> \ No newline at end of file diff --git a/acp/core/switch.php b/acp/core/switch.php index 940eb51f..24a260e4 100644 --- a/acp/core/switch.php +++ b/acp/core/switch.php @@ -90,10 +90,10 @@ $navinc = "nav.posts"; break; - case "comments": + case "reactions": $active[7] = "topnav_selected"; - $maininc = "inc.comments"; - $navinc = "nav.comments"; + $maininc = "inc.reactions"; + $navinc = "nav.reactions"; break; default: diff --git a/acp/core/system.backup.php b/acp/core/system.backup.php index 82be5a50..17fd4d29 100644 --- a/acp/core/system.backup.php +++ b/acp/core/system.backup.php @@ -9,7 +9,7 @@ echo '
    '.$lang['backup_description'].'
    '; -$data_folder = "../" . FC_CONTENT_DIR . "/SQLite"; +$data_folder = FC_CONTENT_DIR . "/SQLite"; /* delete (only) logfiles */ if(isset($_POST['delete'])) { diff --git a/acp/core/system.categories.php b/acp/core/system.categories.php index 2410aa28..c2e80d71 100644 --- a/acp/core/system.categories.php +++ b/acp/core/system.categories.php @@ -111,7 +111,7 @@ echo ''; -$images = fc_scandir_rec('../'.FC_CONTENT_DIR.'/images'); +$images = fc_scandir_rec('../content/images'); /* avatar */ $choose_tmb = ' '.$lang['event_time_offset_help_text'].' '; + + +$sel_guestlist1 = ''; +$sel_guestlist2 = ''; +$sel_guestlist3 = ''; + +if($prefs_posts_default_guestlist == 1 OR $prefs_posts_default_guestlist == '') { + $sel_guestlist1 = 'selected'; +} else if($prefs_posts_default_guestlist == 2) { + $sel_guestlist2 = 'selected'; +} else if($prefs_posts_default_guestlist == 3) { + $sel_guestlist3 = 'selected'; +} + +echo '
    '; +echo ''; +echo ''; +echo '
    '; + +echo''; + +/* votings */ +$sel_votings1 = ''; +$sel_votings2 = ''; +$sel_votings3 = ''; + +if($prefs_posts_default_votings == 1 OR $prefs_posts_default_votings == '') { + $sel_votings1 = 'selected'; +} else if($prefs_posts_default_votings == 2) { + $sel_votings2 = 'selected'; +} else if($prefs_posts_default_votings == 3) { + $sel_votings3 = 'selected'; +} + +echo '
    '; +echo ''.$lang['label_votings'].''; +echo ''; echo'
    '; diff --git a/acp/core/system.stats.php b/acp/core/system.stats.php index 7abad3d0..534a2493 100644 --- a/acp/core/system.stats.php +++ b/acp/core/system.stats.php @@ -40,7 +40,7 @@ /* scan FC_CONTENT_DIR and return all logfiles */ -$log_dir = "../" . FC_CONTENT_DIR . "/SQLite"; +$log_dir = FC_CONTENT_DIR . "/SQLite"; $logfiles = glob("$log_dir/logfile*"); echo '
    '; @@ -72,7 +72,7 @@ -$logfile_path = "../" . FC_CONTENT_DIR . "/SQLite/$filename"; +$logfile_path = FC_CONTENT_DIR . "/SQLite/$filename"; if(is_file("$logfile_path")) { diff --git a/acp/core/system.syspref.php b/acp/core/system.syspref.php index 5b9ff9b8..3a7509eb 100644 --- a/acp/core/system.syspref.php +++ b/acp/core/system.syspref.php @@ -462,8 +462,8 @@ echo ''; -$cache_size = fc_dir_size('../'.FC_CONTENT_DIR.'/cache/cache/'); -$compile_size = fc_dir_size('../'.FC_CONTENT_DIR.'/cache/templates_c/'); +$cache_size = fc_dir_size(FC_CONTENT_DIR.'/cache/cache/'); +$compile_size = fc_dir_size(FC_CONTENT_DIR.'/cache/templates_c/'); $complete_size = readable_filesize($cache_size+$compile_size); echo '
    '; diff --git a/acp/core/topNav.php b/acp/core/topNav.php index 30b9e1b8..16e56129 100644 --- a/acp/core/topNav.php +++ b/acp/core/topNav.php @@ -10,7 +10,7 @@ echo ''.$lang['tn_dashboard'].''; echo ''.$lang['tn_contents'].''; echo ''.$lang['tn_posts'].''; -echo ''.$lang['tn_comments'].''; +echo ''.$lang['tn_reactions'].''; echo ''.$lang['tn_moduls'].''; echo ''.$lang['tn_filebrowser'].''; echo ''.$lang['tn_usermanagement'].''; diff --git a/acp/core/user.edit.php b/acp/core/user.edit.php index 84c37fc2..a995bd97 100644 --- a/acp/core/user.edit.php +++ b/acp/core/user.edit.php @@ -145,7 +145,7 @@ ]); if($_POST['deleteAvatar'] == 'on') { - $user_avatar_path = '../'. FC_CONTENT_DIR . '/avatars/' . md5($user_nick) . '.png'; + $user_avatar_path = '../content/avatars/' . md5($user_nick) . '.png'; if(is_file($user_avatar_path)) { unlink($user_avatar_path); } @@ -294,7 +294,7 @@ $$k = stripslashes($v); } - $user_avatar_path = '../'. FC_CONTENT_DIR . '/avatars/' . md5($user_nick) . '.png'; + $user_avatar_path = '../content/avatars/' . md5($user_nick) . '.png'; echo '
    '; echo '

    '.$lang['h_modus_edituser'].' - '.$user_nick.' ID: '.$user_id.'

    '; diff --git a/acp/core/user.list.php b/acp/core/user.list.php index 19debc61..0aebed5e 100644 --- a/acp/core/user.list.php +++ b/acp/core/user.list.php @@ -231,7 +231,7 @@ $user_id = $result[$i]['user_id']; $user_nick = $result[$i]['user_nick']; - $user_avatar_path = '../'. FC_CONTENT_DIR . '/avatars/' . md5($user_nick) . '.png'; + $user_avatar_path = '../content/avatars/' . md5($user_nick) . '.png'; $user_class = $result[$i]['user_class']; $user_mail = $result[$i]['user_mail']; $user_registerdate = $result[$i]['user_registerdate']; @@ -268,24 +268,20 @@ //status image switch ($user_verified) { case "waiting": - $bg_class = 'table-info'; $label = 'badge rounded-pill bg-info'; break; case "paused": $label = 'badge badge-pill bg-warning'; - $bg_class = 'table-warning'; break; case "verified": - $bg_class = 'table-success'; $label = 'badge rounded-pill bg-success'; break; case "": - $bg_class = 'table-danger'; $label = 'badge rounded-pill bg-danger'; break; } - echo ''; + echo ''; echo ''.$user_id.''; echo ''.$user_avatar.''; echo ''.$admin_img.' '.$user_nick.''; diff --git a/acp/index.php b/acp/index.php index 6fb90ea6..d8590cc5 100644 --- a/acp/index.php +++ b/acp/index.php @@ -6,8 +6,8 @@ use Medoo\Medoo; require '../config.php'; -if(is_file('../'.FC_CONTENT_DIR.'/config.php')) { - include '../'.FC_CONTENT_DIR.'/config.php'; +if(is_file(FC_CONTENT_DIR.'/config.php')) { + include FC_CONTENT_DIR.'/config.php'; } @@ -44,9 +44,9 @@ } - define("CONTENT_DB", "../$fc_db_content"); - define("USER_DB", "../$fc_db_user"); - define("STATS_DB", "../$fc_db_stats"); + define("CONTENT_DB", "$fc_db_content"); + define("USER_DB", "$fc_db_user"); + define("STATS_DB", "$fc_db_stats"); $db_content = new Medoo([ 'database_type' => 'sqlite', @@ -86,57 +86,61 @@ - - - Login <?php echo $_SERVER['SERVER_NAME']; ?> - - - - - - -
    -
    -
    - Login: -
    - -
    - + + + Login <?php echo $_SERVER['SERVER_NAME']; ?> + + + + + + +
    + +
    + Login: +
    + +
    + +
    -
    -
    - -
    - +
    + +
    + +
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - +
    +
    +
    + +
    +
    +
    +
    +
    + +
    -
    -
    -
    -
    - +
    + + + \ No newline at end of file diff --git a/acp/templates/list-indexed-pages-item.tpl b/acp/templates/list-indexed-pages-item.tpl index d1d146ce..93c5c0f4 100644 --- a/acp/templates/list-indexed-pages-item.tpl +++ b/acp/templates/list-indexed-pages-item.tpl @@ -20,10 +20,10 @@
    - {btn_start_index} - {btn_update_info} + {btn_start_index} + {btn_update_info} + {btn_remove}
    -
    diff --git a/acp/templates/modlist.tpl b/acp/templates/modlist.tpl index b4e9924d..dbf49abc 100644 --- a/acp/templates/modlist.tpl +++ b/acp/templates/modlist.tpl @@ -8,7 +8,7 @@
    -
    {$MOD_CHECK_IN_OUT} {$MOD_README}
    +
    {$MOD_CHECK_IN_OUT} {$MOD_README} {$MOD_DELETE}

    {$MOD_LIVECODE}

    {$MOD_DESCRIPTION}

    Version: {$MOD_VERSION}
    Copyright: {$MOD_AUTHOR}

    diff --git a/acp/templates/post_event.tpl b/acp/templates/post_event.tpl index 18a1fe43..d417c189 100644 --- a/acp/templates/post_event.tpl +++ b/acp/templates/post_event.tpl @@ -87,6 +87,29 @@ +
    + {label_event_guestlist} + +
    + {select_guestlist} +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    + +
    +
    @@ -156,6 +179,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_file.tpl b/acp/templates/post_file.tpl index b00306ca..86cb2b7b 100644 --- a/acp/templates/post_file.tpl +++ b/acp/templates/post_file.tpl @@ -124,6 +124,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_gallery.tpl b/acp/templates/post_gallery.tpl index bc4a8296..6dcb4b8b 100644 --- a/acp/templates/post_gallery.tpl +++ b/acp/templates/post_gallery.tpl @@ -96,6 +96,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_image.tpl b/acp/templates/post_image.tpl index 11271434..a90986e5 100644 --- a/acp/templates/post_image.tpl +++ b/acp/templates/post_image.tpl @@ -85,6 +85,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_link.tpl b/acp/templates/post_link.tpl index 5567b4a0..ff85a0e7 100644 --- a/acp/templates/post_link.tpl +++ b/acp/templates/post_link.tpl @@ -83,6 +83,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_message.tpl b/acp/templates/post_message.tpl index 204df536..fa0f7d40 100644 --- a/acp/templates/post_message.tpl +++ b/acp/templates/post_message.tpl @@ -93,6 +93,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_product.tpl b/acp/templates/post_product.tpl index b2c1e207..739ccd73 100644 --- a/acp/templates/post_product.tpl +++ b/acp/templates/post_product.tpl @@ -74,8 +74,12 @@
    + + +
    +
    @@ -90,27 +94,98 @@
    -
    + + + + + +
    + +
    +
    - - {select_tax} + +
    -
    + +
    + +
    + + % +
    +
    +
    - - + + {select_tax}
    -
    + + +
    - +
    -
    +
    -
    +
    + {label_scaling_prices} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #{label_product_amount}{label_product_price} ({label_product_net}){label_product_price_addition} / {label_product_tax}{label_product_price} {label_product_net}/{label_product_gross}
    1+ % | + %
    2+ % | + %
    3+ % | + %
    4+ % | + %
    5+ % | + %
    + + +
    + +
    + +
    {label_product_snippet_price} {snippet_select_pricelist}
    @@ -181,6 +256,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/templates/post_video.tpl b/acp/templates/post_video.tpl index 3eaf31f7..107dcdda 100644 --- a/acp/templates/post_video.tpl +++ b/acp/templates/post_video.tpl @@ -91,6 +91,9 @@
    {label_comments} {select_comments}
    +
    + {label_votings} {select_votings} +
    {labels} {post_labels}
    diff --git a/acp/theme/bootstrap/LICENSE b/acp/theme/bootstrap/LICENSE deleted file mode 100755 index 173a9ebb..00000000 --- a/acp/theme/bootstrap/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011-2020 Twitter, Inc. -Copyright (c) 2011-2020 The Bootstrap Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/acp/theme/bootstrap/README.md b/acp/theme/bootstrap/README.md deleted file mode 100755 index 35ce9fea..00000000 --- a/acp/theme/bootstrap/README.md +++ /dev/null @@ -1,209 +0,0 @@ -

    - - Bootstrap logo - -

    - -

    Bootstrap

    - -

    - Sleek, intuitive, and powerful front-end framework for faster and easier web development. -
    - Explore Bootstrap docs » -
    -
    - Report bug - · - Request feature - · - Themes - · - Blog -

    - - -## Table of contents - -- [Quick start](#quick-start) -- [Status](#status) -- [What's included](#whats-included) -- [Bugs and feature requests](#bugs-and-feature-requests) -- [Documentation](#documentation) -- [Contributing](#contributing) -- [Community](#community) -- [Versioning](#versioning) -- [Creators](#creators) -- [Thanks](#thanks) -- [Copyright and license](#copyright-and-license) - - -## Quick start - -Several quick start options are available: - -- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.5.3.zip) -- Clone the repo: `git clone https://github.com/twbs/bootstrap.git` -- Install with [npm](https://www.npmjs.com/): `npm install bootstrap` -- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@4.5.3` -- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.5.3` -- Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass` - -Read the [Getting started page](https://getbootstrap.com/docs/4.5/getting-started/introduction/) for information on the framework contents, templates and examples, and more. - - -## Status - -[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com/) -[![Build Status](https://github.com/twbs/bootstrap/workflows/JS%20Tests/badge.svg?branch=v4-dev)](https://github.com/twbs/bootstrap/actions?query=workflow%3AJS+Tests+branch%3Av4-dev) -[![npm version](https://img.shields.io/npm/v/bootstrap)](https://www.npmjs.com/package/bootstrap) -[![Gem version](https://img.shields.io/gem/v/bootstrap)](https://rubygems.org/gems/bootstrap) -[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue)](https://atmospherejs.com/twbs/bootstrap) -[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap)](https://packagist.org/packages/twbs/bootstrap) -[![NuGet](https://img.shields.io/nuget/vpre/bootstrap)](https://www.nuget.org/packages/bootstrap/absoluteLatest) -[![peerDependencies Status](https://img.shields.io/david/peer/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=peer) -[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=dev) -[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/v4-dev)](https://coveralls.io/github/twbs/bootstrap?branch=v4-dev) -[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/v4-dev/dist/css/bootstrap.min.css) -[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/v4-dev/dist/js/bootstrap.min.js) -[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)](https://www.browserstack.com/automate/public-build/SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229) -[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap)](#backers) -[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap)](#sponsors) - - -## What's included - -Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: - -```text -bootstrap/ -└── dist/ - ├── css/ - │ ├── bootstrap-grid.css - │ ├── bootstrap-grid.css.map - │ ├── bootstrap-grid.min.css - │ ├── bootstrap-grid.min.css.map - │ ├── bootstrap-reboot.css - │ ├── bootstrap-reboot.css.map - │ ├── bootstrap-reboot.min.css - │ ├── bootstrap-reboot.min.css.map - │ ├── bootstrap.css - │ ├── bootstrap.css.map - │ ├── bootstrap.min.css - │ └── bootstrap.min.css.map - └── js/ - ├── bootstrap.bundle.js - ├── bootstrap.bundle.js.map - ├── bootstrap.bundle.min.js - ├── bootstrap.bundle.min.js.map - ├── bootstrap.js - ├── bootstrap.js.map - ├── bootstrap.min.js - └── bootstrap.min.js.map -``` - -We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [source maps](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/), but not [jQuery](https://jquery.com/). - - -## Bugs and feature requests - -Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.github/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). - - -## Documentation - -Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](https://jekyllrb.com/) and publicly hosted on GitHub Pages at . The docs may also be run locally. - -Documentation search is powered by [Algolia's DocSearch](https://community.algolia.com/docsearch/). Working on our search? Be sure to set `debug: true` in `site/docs/4.5/assets/js/src/search.js` file. - -### Running documentation locally - -1. Run through the [tooling setup](https://getbootstrap.com/docs/4.5/getting-started/build-tools/#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`. -2. Run `npm install` to install Node.js dependencies. -3. Run `npm start` to compile CSS and JavaScript files, generate our docs, and watch for changes. -4. Open `http://localhost:9001` in your browser, and voilà. - -Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/). - -### Documentation for previous releases - -You can find all our previous releases docs on . - -[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. - - -## Contributing - -Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. - -Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/v4-dev/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo). - -Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/v4-dev/.editorconfig) for easy use in common text editors. Read more and download plugins at . - - -## Community - -Get updates on Bootstrap's development and chat with the project maintainers and community members. - -- Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). -- Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com/). -- Join [the official Slack room](https://bootstrap-slack.herokuapp.com/). -- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel. -- Implementation help may be found at Stack Overflow (tagged [`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4)). -- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. - - -## Versioning - -For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we adhere to those rules whenever possible. - -See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com/) contain summaries of the most noteworthy changes made in each release. - - -## Creators - -**Mark Otto** - -- -- - -**Jacob Thornton** - -- -- - - -## Thanks - - - BrowserStack Logo - - -Thanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers! - - -## Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bootstrap#sponsor)] - -[![](https://opencollective.com/bootstrap/sponsor/0/avatar.svg)](https://opencollective.com/bootstrap/sponsor/0/website) -[![](https://opencollective.com/bootstrap/sponsor/1/avatar.svg)](https://opencollective.com/bootstrap/sponsor/1/website) -[![](https://opencollective.com/bootstrap/sponsor/2/avatar.svg)](https://opencollective.com/bootstrap/sponsor/2/website) -[![](https://opencollective.com/bootstrap/sponsor/3/avatar.svg)](https://opencollective.com/bootstrap/sponsor/3/website) -[![](https://opencollective.com/bootstrap/sponsor/4/avatar.svg)](https://opencollective.com/bootstrap/sponsor/4/website) -[![](https://opencollective.com/bootstrap/sponsor/5/avatar.svg)](https://opencollective.com/bootstrap/sponsor/5/website) -[![](https://opencollective.com/bootstrap/sponsor/6/avatar.svg)](https://opencollective.com/bootstrap/sponsor/6/website) -[![](https://opencollective.com/bootstrap/sponsor/7/avatar.svg)](https://opencollective.com/bootstrap/sponsor/7/website) -[![](https://opencollective.com/bootstrap/sponsor/8/avatar.svg)](https://opencollective.com/bootstrap/sponsor/8/website) -[![](https://opencollective.com/bootstrap/sponsor/9/avatar.svg)](https://opencollective.com/bootstrap/sponsor/9/website) - - -## Backers - -Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)] - -[![Backers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers) - - -## Copyright and license - -Code and documentation copyright 2011-2020 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/acp/theme/bootstrap/package.json b/acp/theme/bootstrap/package.json deleted file mode 100755 index 7343246f..00000000 --- a/acp/theme/bootstrap/package.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "name": "bootstrap", - "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", - "version": "4.5.3", - "version_short": "4.5", - "keywords": [ - "css", - "sass", - "mobile-first", - "responsive", - "front-end", - "framework", - "web" - ], - "homepage": "https://getbootstrap.com/", - "author": "The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)", - "contributors": [ - "Twitter, Inc." - ], - "scripts": { - "start": "npm-run-all --parallel watch docs-serve", - "bundlewatch": "bundlewatch --config .bundlewatch.config.json", - "css": "npm-run-all css-compile css-prefix css-minify css-copy", - "css-copy": "cross-env-shell shx mkdir -p site/docs/$npm_package_version_short/dist/ && cross-env-shell shx cp -r dist/css/ site/docs/$npm_package_version_short/dist/", - "css-main": "npm-run-all css-lint css-compile-main css-prefix-main css-minify-main css-copy", - "css-docs": "npm-run-all css-compile-docs css-prefix-docs css-minify-docs", - "css-compile": "npm-run-all --parallel css-compile-*", - "css-compile-main": "node-sass --output-style expanded --source-map true --source-map-contents true --precision 6 scss/ -o dist/css/ && npm run css-copy", - "css-compile-docs": "cross-env-shell node-sass --output-style expanded --source-map true --source-map-contents true --precision 6 site/docs/$npm_package_version_short/assets/scss/docs.scss site/docs/$npm_package_version_short/assets/css/docs.min.css", - "css-lint": "npm-run-all --continue-on-error --parallel css-lint-*", - "css-lint-main": "stylelint \"scss/**/*.scss\" --cache --cache-location .cache/.stylelintcache --rd", - "css-lint-docs": "stylelint \"site/docs/**/assets/scss/*.scss\" \"site/docs/**/*.css\" --cache --cache-location .cache/.stylelintcache", - "css-lint-vars": "fusv scss/ site/docs/", - "css-minify": "npm-run-all --parallel css-minify-*", - "css-minify-main": "cleancss --level 1 --format breakWith=lf --source-map --source-map-inline-sources --output dist/css/bootstrap.min.css dist/css/bootstrap.css && cleancss --level 1 --format breakWith=lf --source-map --source-map-inline-sources --output dist/css/bootstrap-grid.min.css dist/css/bootstrap-grid.css && cleancss --level 1 --format breakWith=lf --source-map --source-map-inline-sources --output dist/css/bootstrap-reboot.min.css dist/css/bootstrap-reboot.css", - "css-minify-docs": "cross-env-shell cleancss --level 1 --format breakWith=lf --source-map --source-map-inline-sources --output site/docs/$npm_package_version_short/assets/css/docs.min.css site/docs/$npm_package_version_short/assets/css/docs.min.css", - "css-prefix": "npm-run-all --parallel css-prefix-*", - "css-prefix-main": "postcss --config build/postcss.config.js --replace \"dist/css/*.css\" \"!dist/css/*.min.css\"", - "css-prefix-docs": "postcss --config build/postcss.config.js --replace \"site/docs/**/*.css\"", - "js": "npm-run-all js-compile js-minify js-copy", - "js-copy": "cross-env-shell shx mkdir -p site/docs/$npm_package_version_short/dist/ && cross-env-shell shx cp -r dist/js/ site/docs/$npm_package_version_short/dist/", - "js-main": "npm-run-all js-lint js-compile js-minify-main", - "js-docs": "npm-run-all js-lint-docs js-minify-docs", - "js-compile": "npm-run-all --parallel js-compile-* --sequential js-copy", - "js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js --sourcemap", - "js-compile-bundle": "rollup --environment BUNDLE:true --config build/rollup.config.js --sourcemap", - "js-compile-plugins": "node build/build-plugins.js", - "js-compile-plugins-coverage": "cross-env NODE_ENV=test node build/build-plugins.js", - "js-lint": "npm-run-all --continue-on-error --parallel js-lint-*", - "js-lint-main": "eslint --report-unused-disable-directives --cache --cache-location .cache/.eslintcache js/src js/tests build/", - "js-lint-docs": "eslint --report-unused-disable-directives --cache --cache-location .cache/.eslintcache site/", - "js-minify": "npm-run-all --parallel js-minify-main js-minify-docs", - "js-minify-main": "npm-run-all js-minify-standalone js-minify-bundle", - "js-minify-standalone": "terser --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.js.map,includeSources,url=bootstrap.min.js.map\" --output dist/js/bootstrap.min.js dist/js/bootstrap.js", - "js-minify-bundle": "terser --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.bundle.js.map,includeSources,url=bootstrap.bundle.min.js.map\" --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js", - "js-minify-docs": "cross-env-shell terser --mangle --comments \\\"/^!/\\\" --output site/docs/$npm_package_version_short/assets/js/docs.min.js site/docs/$npm_package_version_short/assets/js/vendor/anchor.min.js site/docs/$npm_package_version_short/assets/js/vendor/clipboard.min.js site/docs/$npm_package_version_short/assets/js/vendor/bs-custom-file-input.min.js \"site/docs/$npm_package_version_short/assets/js/src/*.js\"", - "js-test": "npm-run-all js-test-karma* js-test-integration", - "js-test-karma": "karma start js/tests/karma.conf.js", - "js-test-karma-old": "cross-env USE_OLD_JQUERY=true npm run js-test-karma", - "js-test-karma-bundle": "cross-env BUNDLE=true npm run js-test-karma", - "js-test-karma-bundle-old": "cross-env BUNDLE=true USE_OLD_JQUERY=true npm run js-test-karma", - "js-test-integration": "rollup --config js/tests/integration/rollup.bundle.js", - "js-test-cloud": "cross-env BROWSER=true npm run js-test-karma", - "lint": "npm-run-all --parallel js-lint css-lint lockfile-lint", - "docs": "npm-run-all css-docs js-docs docs-build docs-lint", - "docs-build": "bundle exec jekyll build", - "docs-compile": "npm run docs-build", - "docs-production": "cross-env JEKYLL_ENV=production npm run docs-build", - "docs-netlify": "cross-env JEKYLL_ENV=netlify npm run docs-build", - "docs-linkinator": "linkinator _gh_pages --recurse --silent --skip \"^(?!http://localhost)\"", - "docs-vnu": "node build/vnu-jar.js", - "docs-lint": "npm-run-all --parallel docs-vnu docs-linkinator", - "docs-serve": "bundle exec jekyll serve", - "docs-serve-only": "npm run docs-serve -- --skip-initial-build --no-watch", - "lockfile-lint": "lockfile-lint --allowed-hosts npm --allowed-schemes https: --empty-hostname false --type npm --path package-lock.json", - "update-deps": "ncu -u -x \"jquery,karma-browserstack-launcher,sinon\" && npm update && bundle update && cross-env-shell echo Manually update \\\"site/docs/$npm_package_version_short/assets/js/vendor/\\\"", - "release": "npm-run-all dist release-sri docs-production release-zip*", - "release-sri": "node build/generate-sri.js", - "release-version": "node build/change-version.js", - "release-zip": "cross-env-shell \"shx rm -rf bootstrap-$npm_package_version-dist && shx cp -r dist/ bootstrap-$npm_package_version-dist && zip -r9 bootstrap-$npm_package_version-dist.zip bootstrap-$npm_package_version-dist && shx rm -rf bootstrap-$npm_package_version-dist\"", - "release-zip-examples": "node build/zip-examples.js", - "dist": "npm-run-all --parallel css js", - "test": "npm-run-all lint dist js-test docs-build docs-lint", - "netlify": "npm-run-all dist release-sri docs-netlify", - "watch": "npm-run-all --parallel watch-*", - "watch-css-main": "nodemon --watch scss/ --ext scss --exec \"npm run css-main\"", - "watch-css-docs": "nodemon --watch \"site/docs/**/assets/scss/\" --ext scss --exec \"npm run css-docs\"", - "watch-js-main": "nodemon --watch js/src/ --ext js --exec \"npm run js-compile\"", - "watch-js-docs": "nodemon --watch \"site/docs/**/assets/js/src/\" --ext js --exec \"npm run js-docs\"" - }, - "style": "dist/css/bootstrap.css", - "sass": "scss/bootstrap.scss", - "main": "dist/js/bootstrap.js", - "repository": { - "type": "git", - "url": "git+https://github.com/twbs/bootstrap.git" - }, - "bugs": { - "url": "https://github.com/twbs/bootstrap/issues" - }, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "dependencies": {}, - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" - }, - "devDependencies": { - "@babel/cli": "^7.11.6", - "@babel/core": "^7.11.6", - "@babel/preset-env": "^7.11.5", - "@rollup/plugin-babel": "^5.2.1", - "@rollup/plugin-commonjs": "^15.1.0", - "@rollup/plugin-node-resolve": "^9.0.0", - "autoprefixer": "^9.8.6", - "babel-plugin-istanbul": "^6.0.0", - "bundlewatch": "^0.3.1", - "clean-css-cli": "^4.3.0", - "cross-env": "^7.0.2", - "eslint": "^7.11.0", - "eslint-config-xo": "^0.32.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-unicorn": "^22.0.0", - "find-unused-sass-variables": "^2.0.0", - "glob": "^7.1.6", - "hammer-simulator": "0.0.1", - "ip": "^1.1.5", - "jquery": "^3.5.1", - "karma": "^5.2.3", - "karma-browserstack-launcher": "1.4.0", - "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-detect-browsers": "^2.3.3", - "karma-firefox-launcher": "^1.3.0", - "karma-qunit": "^4.1.1", - "karma-sinon": "^1.0.5", - "linkinator": "^2.1.3", - "lockfile-lint": "^4.3.7", - "node-sass": "^4.14.1", - "nodemon": "^2.0.4", - "npm-run-all": "^4.1.5", - "popper.js": "^1.16.1", - "postcss-cli": "^7.1.2", - "qunit": "^2.11.3", - "rollup": "^2.29.0", - "shelljs": "^0.8.4", - "shx": "^0.3.2", - "sinon": "^7.5.0", - "stylelint": "^13.7.2", - "stylelint-config-twbs-bootstrap": "^2.1.0", - "terser": "^4.8.0", - "vnu-jar": "20.6.30" - }, - "files": [ - "dist/{css,js}/*.{css,js,map}", - "js/{src,dist}/**/*.{js,map}", - "scss/**/*.scss" - ], - "jspm": { - "registry": "npm", - "main": "js/bootstrap", - "directories": { - "lib": "dist" - }, - "shim": { - "js/bootstrap": { - "deps": [ - "jquery", - "popper.js" - ], - "exports": "$" - } - }, - "dependencies": {}, - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" - } - } -} diff --git a/acp/theme/bootstrap/scss/_alert.scss b/acp/theme/bootstrap/scss/_alert.scss deleted file mode 100755 index 4aa1fc20..00000000 --- a/acp/theme/bootstrap/scss/_alert.scss +++ /dev/null @@ -1,52 +0,0 @@ -// -// Base styles -// - -.alert { - position: relative; - padding: $alert-padding-y $alert-padding-x; - margin-bottom: $alert-margin-bottom; - border: $alert-border-width solid transparent; - @include border-radius($alert-border-radius); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $close-font-size + $alert-padding-x * 2; - - // Adjust close link position - .close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: $alert-padding-y $alert-padding-x; - color: inherit; - } -} - - -// Alternate styles -// -// Generate contextual modifier classes for colorizing the alert. - -@each $color, $value in $theme-colors { - .alert-#{$color} { - @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); - } -} diff --git a/acp/theme/bootstrap/scss/_badge.scss b/acp/theme/bootstrap/scss/_badge.scss deleted file mode 100755 index 42c5d08d..00000000 --- a/acp/theme/bootstrap/scss/_badge.scss +++ /dev/null @@ -1,54 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - display: inline-block; - padding: $badge-padding-y $badge-padding-x; - @include font-size($badge-font-size); - font-weight: $badge-font-weight; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius($badge-border-radius); - @include transition($badge-transition); - - @at-root a#{&} { - @include hover-focus() { - text-decoration: none; - } - } - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} - -// Pill badges -// -// Make them extra rounded with a modifier to replace v3's badges. - -.badge-pill { - padding-right: $badge-pill-padding-x; - padding-left: $badge-pill-padding-x; - @include border-radius($badge-pill-border-radius); -} - -// Colors -// -// Contextual variations (linked badges get darker on :hover). - -@each $color, $value in $theme-colors { - .badge-#{$color} { - @include badge-variant($value); - } -} diff --git a/acp/theme/bootstrap/scss/_breadcrumb.scss b/acp/theme/bootstrap/scss/_breadcrumb.scss deleted file mode 100755 index a0cf7e29..00000000 --- a/acp/theme/bootstrap/scss/_breadcrumb.scss +++ /dev/null @@ -1,44 +0,0 @@ -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: $breadcrumb-padding-y $breadcrumb-padding-x; - margin-bottom: $breadcrumb-margin-bottom; - @include font-size($breadcrumb-font-size); - list-style: none; - background-color: $breadcrumb-bg; - @include border-radius($breadcrumb-border-radius); -} - -.breadcrumb-item { - display: flex; - - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: $breadcrumb-item-padding; - - &::before { - display: inline-block; // Suppress underlining of the separator in modern browsers - padding-right: $breadcrumb-item-padding; - color: $breadcrumb-divider-color; - content: escape-svg($breadcrumb-divider); - } - } - - // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built - // without `
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^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","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},St={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},jt=function(e){function r(t,n){var i;if(void 0===st)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");return(i=e.call(this,t)||this)._isEnabled=!0,i._timeout=0,i._hoverState="",i._activeTrigger={},i._popper=null,i.config=i._getConfig(n),i.tip=null,i._setListeners(),i}i(r,e);var o=r.prototype;return o.enable=function(){this._isEnabled=!0},o.disable=function(){this._isEnabled=!1},o.toggleEnabled=function(){this._isEnabled=!this._isEnabled},o.toggle=function(e){if(this._isEnabled)if(e){var t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}},o.dispose=function(){clearTimeout(this._timeout),q.off(this._element,this.constructor.EVENT_KEY),q.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,e.prototype.dispose.call(this)},o.show=function(){var e=this;if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){var t=q.trigger(this._element,this.constructor.Event.SHOW),n=function e(t){if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){var n=t.getRootNode();return n instanceof ShadowRoot?n:null}return t instanceof ShadowRoot?t:t.parentNode?e(t.parentNode):null}(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(!t.defaultPrevented&&i){var r=this.getTipElement(),o=s(this.constructor.NAME);r.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&r.classList.add("fade");var a="function"==typeof this.config.placement?this.config.placement.call(this,r,this._element):this.config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);var c=this._getContainer();x(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||c.appendChild(r),q.trigger(this._element,this.constructor.Event.INSERTED),this._popper=ot(this._element,r,this._getPopperConfig(l)),r.classList.add("show");var f,d,h="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass;h&&(f=r.classList).add.apply(f,h.split(" ")),"ontouchstart"in document.documentElement&&(d=[]).concat.apply(d,document.body.children).forEach((function(e){q.on(e,"mouseover",(function(){}))}));var g=function(){var t=e._hoverState;e._hoverState=null,q.trigger(e._element,e.constructor.Event.SHOWN),"out"===t&&e._leave(null,e)};if(this.tip.classList.contains("fade")){var m=u(this.tip);q.one(this.tip,"transitionend",g),p(this.tip,m)}else g()}}},o.hide=function(){var e=this;if(this._popper){var t=this.getTipElement(),n=function(){"show"!==e._hoverState&&t.parentNode&&t.parentNode.removeChild(t),e._cleanTipClass(),e._element.removeAttribute("aria-describedby"),q.trigger(e._element,e.constructor.Event.HIDDEN),e._popper&&(e._popper.destroy(),e._popper=null)};if(!q.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented){var i;if(t.classList.remove("show"),"ontouchstart"in document.documentElement&&(i=[]).concat.apply(i,document.body.children).forEach((function(e){return q.off(e,"mouseover",m)})),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this.tip.classList.contains("fade")){var r=u(t);q.one(t,"transitionend",n),p(t,r)}else n();this._hoverState=""}}},o.update=function(){null!==this._popper&&this._popper.update()},o.isWithContent=function(){return Boolean(this.getTitle())},o.getTipElement=function(){if(this.tip)return this.tip;var e=document.createElement("div");return e.innerHTML=this.config.template,this.tip=e.children[0],this.tip},o.setContent=function(){var e=this.getTipElement();this.setElementContent(z(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")},o.setElementContent=function(e,t){if(null!==e)return"object"==typeof t&&d(t)?(t.jquery&&(t=t[0]),void(this.config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this.config.html?(this.config.sanitize&&(t=Et(t,this.config.allowList,this.config.sanitizeFn)),e.innerHTML=t):e.textContent=t)},o.getTitle=function(){var e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this._element):this.config.title),e},o.updateAttachment=function(e){return"right"===e?"end":"left"===e?"start":e},o._initializeOnDelegatedTarget=function(e,t){var n=this.constructor.DATA_KEY;return(t=t||E(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),x(e.delegateTarget,n,t)),t},o._getOffset=function(){var e=this,t=this.config.offset;return"string"==typeof t?t.split(",").map((function(e){return Number.parseInt(e,10)})):"function"==typeof t?function(n){return t(n,e._element)}:t},o._getPopperConfig=function(e){var t=this,i={placement:e,modifiers:[{name:"flip",options:{altBoundary:!0,fallbackPlacements:this.config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this.config.boundary}},{name:"arrow",options:{element:"."+this.constructor.NAME+"-arrow"}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:function(e){return t._handlePopperPlacementChange(e)}}],onFirstUpdate:function(e){e.options.placement!==e.placement&&t._handlePopperPlacementChange(e)}};return n({},i,"function"==typeof this.config.popperConfig?this.config.popperConfig(i):this.config.popperConfig)},o._addAttachmentClass=function(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))},o._getContainer=function(){return!1===this.config.container?document.body:d(this.config.container)?this.config.container:z(this.config.container)},o._getAttachment=function(e){return At[e.toUpperCase()]},o._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach((function(t){if("click"===t)q.on(e._element,e.constructor.Event.CLICK,e.config.selector,(function(t){return e.toggle(t)}));else if("manual"!==t){var n="hover"===t?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,i="hover"===t?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;q.on(e._element,n,e.config.selector,(function(t){return e._enter(t)})),q.on(e._element,i,e.config.selector,(function(t){return e._leave(t)}))}})),this._hideModalHandler=function(){e._element&&e.hide()},q.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=n({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},o._fixTitle=function(){var e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))},o._enter=function(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t.config.delay&&t.config.delay.show?t._timeout=setTimeout((function(){"show"===t._hoverState&&t.show()}),t.config.delay.show):t.show())},o._leave=function(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t.config.delay&&t.config.delay.hide?t._timeout=setTimeout((function(){"out"===t._hoverState&&t.hide()}),t.config.delay.hide):t.hide())},o._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},o._getConfig=function(e){var t=F.getDataAttributes(this._element);return Object.keys(t).forEach((function(e){Ct.has(e)&&delete t[e]})),e&&"object"==typeof e.container&&e.container.jquery&&(e.container=e.container[0]),"number"==typeof(e=n({},this.constructor.Default,t,"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),h("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Et(e.template,e.allowList,e.sanitizeFn)),e},o._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},o._cleanTipClass=function(){var e=this.getTipElement(),t=e.getAttribute("class").match(Tt);null!==t&&t.length>0&&t.map((function(e){return e.trim()})).forEach((function(t){return e.classList.remove(t)}))},o._handlePopperPlacementChange=function(e){var t=e.state;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))},r.jQueryInterface=function(e){return this.each((function(){var t=E(this,"bs.tooltip"),n="object"==typeof e&&e;if((t||!/dispose|hide/.test(e))&&(t||(t=new r(this,n)),"string"==typeof e)){if(void 0===t[e])throw new TypeError('No method named "'+e+'"');t[e]()}}))},t(r,null,[{key:"Default",get:function(){return Dt}},{key:"NAME",get:function(){return"tooltip"}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return St}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return kt}}]),r}(M);_("tooltip",jt);var Lt=new RegExp("(^|\\s)bs-popover\\S+","g"),Ot=n({},jt.Default,{placement:"right",offset:[0,8],trigger:"click",content:"",template:''}),Nt=n({},jt.DefaultType,{content:"(string|element|function)"}),Pt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},It=function(e){function n(){return e.apply(this,arguments)||this}i(n,e);var r=n.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.setContent=function(){var e=this.getTipElement();this.setElementContent(z(".popover-header",e),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(z(".popover-body",e),t),e.classList.remove("fade","show")},r._addAttachmentClass=function(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))},r._getContent=function(){ -return this._element.getAttribute("data-bs-content")||this.config.content},r._cleanTipClass=function(){var e=this.getTipElement(),t=e.getAttribute("class").match(Lt);null!==t&&t.length>0&&t.map((function(e){return e.trim()})).forEach((function(t){return e.classList.remove(t)}))},n.jQueryInterface=function(e){return this.each((function(){var t=E(this,"bs.popover"),i="object"==typeof e?e:null;if((t||!/dispose|hide/.test(e))&&(t||(t=new n(this,i),x(this,"bs.popover",t)),"string"==typeof e)){if(void 0===t[e])throw new TypeError('No method named "'+e+'"');t[e]()}}))},t(n,null,[{key:"Default",get:function(){return Ot}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return Pt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Nt}}]),n}(jt);_("popover",It);var Ht={offset:10,method:"auto",target:""},qt={offset:"number",method:"string",target:"(string|element)"},Mt=function(e){function r(t,n){var i;return(i=e.call(this,t)||this)._scrollElement="BODY"===t.tagName?window:t,i._config=i._getConfig(n),i._selector=i._config.target+" .nav-link, "+i._config.target+" .list-group-item, "+i._config.target+" .dropdown-item",i._offsets=[],i._targets=[],i._activeTarget=null,i._scrollHeight=0,q.on(i._scrollElement,"scroll.bs.scrollspy",(function(){return i._process()})),i.refresh(),i._process(),i}i(r,e);var o=r.prototype;return o.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?t:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),U(this._selector).map((function(e){var t=l(e),r=t?z(t):null;if(r){var o=r.getBoundingClientRect();if(o.width||o.height)return[F[n](r).top+i,t]}return null})).filter((function(e){return e})).sort((function(e,t){return e[0]-t[0]})).forEach((function(t){e._offsets.push(t[0]),e._targets.push(t[1])}))},o.dispose=function(){e.prototype.dispose.call(this),q.off(this._scrollElement,".bs.scrollspy"),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},o._getConfig=function(e){if("string"!=typeof(e=n({},Ht,"object"==typeof e&&e?e:{})).target&&d(e.target)){var t=e.target.id;t||(t=s("scrollspy"),e.target.id=t),e.target="#"+t}return h("scrollspy",e,qt),e},o._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},o._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},o._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},o._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;)this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&(void 0===this._offsets[r+1]||e li > .active":".active";t=(t=U(r,i))[t.length-1]}var o=t?q.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(!(q.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==o&&o.defaultPrevented)){this._activate(this._element,i);var s=function(){q.trigger(t,"hidden.bs.tab",{relatedTarget:e._element}),q.trigger(e._element,"shown.bs.tab",{relatedTarget:t})};n?this._activate(n,n.parentNode,s):s()}}},r._activate=function(e,t,n){var i=this,r=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?K(t,".active"):U(":scope > li > .active",t))[0],o=n&&r&&r.classList.contains("fade"),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=u(r);r.classList.remove("show"),q.one(r,"transitionend",s),p(r,a)}else s()},r._transitionComplete=function(e,t,n){if(t){t.classList.remove("active");var i=z(":scope > .dropdown-menu .active",t.parentNode);i&&i.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),v(e),e.classList.contains("fade")&&e.classList.add("show"),e.parentNode&&e.parentNode.classList.contains("dropdown-menu")&&(e.closest(".dropdown")&&U(".dropdown-toggle").forEach((function(e){return e.classList.add("active")})),e.setAttribute("aria-expanded",!0)),n&&n()},n.jQueryInterface=function(e){return this.each((function(){var t=E(this,"bs.tab")||new n(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError('No method named "'+e+'"');t[e]()}}))},t(n,null,[{key:"DATA_KEY",get:function(){return"bs.tab"}}]),n}(M);q.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(e){e.preventDefault(),(E(this,"bs.tab")||new Rt(this)).show()})),_("tab",Rt);var Bt={animation:"boolean",autohide:"boolean",delay:"number"},Wt={animation:!0,autohide:!0,delay:5e3},$t=function(e){function r(t,n){var i;return(i=e.call(this,t)||this)._config=i._getConfig(n),i._timeout=null,i._setListeners(),i}i(r,e);var o=r.prototype;return o.show=function(){var e=this;if(!q.trigger(this._element,"show.bs.toast").defaultPrevented){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var t=function(){e._element.classList.remove("showing"),e._element.classList.add("show"),q.trigger(e._element,"shown.bs.toast"),e._config.autohide&&(e._timeout=setTimeout((function(){e.hide()}),e._config.delay))};if(this._element.classList.remove("hide"),v(this._element),this._element.classList.add("showing"),this._config.animation){var n=u(this._element);q.one(this._element,"transitionend",t),p(this._element,n)}else t()}},o.hide=function(){var e=this;if(this._element.classList.contains("show")&&!q.trigger(this._element,"hide.bs.toast").defaultPrevented){var t=function(){e._element.classList.add("hide"),q.trigger(e._element,"hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=u(this._element);q.one(this._element,"transitionend",t),p(this._element,n)}else t()}},o.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),q.off(this._element,"click.dismiss.bs.toast"),e.prototype.dispose.call(this),this._config=null},o._getConfig=function(e){return e=n({},Wt,F.getDataAttributes(this._element),"object"==typeof e&&e?e:{}),h("toast",e,this.constructor.DefaultType),e},o._setListeners=function(){var e=this;q.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',(function(){return e.hide()}))},o._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},r.jQueryInterface=function(e){return this.each((function(){var t=E(this,"bs.toast");if(t||(t=new r(this,"object"==typeof e&&e)),"string"==typeof e){if(void 0===t[e])throw new TypeError('No method named "'+e+'"');t[e](this)}}))},t(r,null,[{key:"DefaultType",get:function(){return Bt}},{key:"Default",get:function(){return Wt}},{key:"DATA_KEY",get:function(){return"bs.toast"}}]),r}(M);return _("toast",$t),{Alert:R,Button:B,Carousel:Q,Collapse:Z,Dropdown:mt,Modal:bt,Popover:It,ScrollSpy:Mt,Tab:Rt,Toast:$t,Tooltip:jt}})),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,n){return void 0===n&&(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n),n}:e(jQuery)}((function(e){"use strict";if(void 0!==e)if(e.fn.jquery.match(/-ajax/))"console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version.");else{var t=[],n=function(n){return t=e.grep(t,(function(e){return e!==n&&e.$instance.closest("body").length>0}))},i={allow:1,allowfullscreen:1,frameborder:1,height:1,longdesc:1,marginheight:1,marginwidth:1,mozallowfullscreen:1,name:1,referrerpolicy:1,sandbox:1,scrolling:1,src:1,srcdoc:1,style:1,webkitallowfullscreen:1,width:1},r={keyup:"onKeyUp",resize:"onResize"},o=function(t){e.each(a.opened().reverse(),(function(){if(!t.isDefaultPrevented()&&!1===this[r[t.type]](t))return t.preventDefault(),t.stopPropagation(),!1}))},s=function(t){if(t!==a._globalHandlerInstalled){a._globalHandlerInstalled=t;var n=e.map(r,(function(e,t){return t+"."+a.prototype.namespace})).join(" ");e(window)[t?"on":"off"](n,o)}};a.prototype={constructor:a,namespace:"featherlight",targetAttr:"data-featherlight",variant:null,resetCss:!1,background:null,openTrigger:"click",closeTrigger:"click",filter:null,root:"body",openSpeed:250,closeSpeed:250,closeOnClick:"background",closeOnEsc:!0,closeIcon:"✕",loading:"",persist:!1,otherClose:null,beforeOpen:e.noop,beforeContent:e.noop,beforeClose:e.noop,afterOpen:e.noop,afterContent:e.noop,afterClose:e.noop,onKeyUp:e.noop,onResize:e.noop,type:null,contentFilters:["jquery","image","html","ajax","iframe","text"],setup:function(t,n){"object"!=typeof t||t instanceof e!=!1||n||(n=t,t=void 0);var i=e.extend(this,n,{target:t}),r=i.resetCss?i.namespace+"-reset":i.namespace,o=e(i.background||['
    ','
    ','",'
    '+i.loading+"
    ","
    ","
    "].join("")),s="."+i.namespace+"-close"+(i.otherClose?","+i.otherClose:"");return i.$instance=o.clone().addClass(i.variant),i.$instance.on(i.closeTrigger+"."+i.namespace,(function(t){if(!t.isDefaultPrevented()){var n=e(t.target);("background"===i.closeOnClick&&n.is("."+i.namespace)||"anywhere"===i.closeOnClick||n.closest(s).length)&&(i.close(t),t.preventDefault())}})),this},getContent:function(){if(!1!==this.persist&&this.$content)return this.$content;var t=this,n=this.constructor.contentFilters,i=function(e){return t.$currentTarget&&t.$currentTarget.attr(e)},r=i(t.targetAttr),o=t.target||r||"",s=n[t.type];if(!s&&o in n&&(s=n[o],o=t.target&&r),o=o||i("href")||"",!s)for(var a in n)t[a]&&(s=n[a],o=t[a]);if(!s){var l=o;if(o=null,e.each(t.contentFilters,(function(){return(s=n[this]).test&&(o=s.test(l)),!o&&s.regex&&l.match&&l.match(s.regex)&&(o=l),!o})),!o)return"console"in window&&window.console.error("Featherlight: no content filter found "+(l?' for "'+l+'"':" (no target specified)")),!1}return s.process.call(t,o)},setContent:function(t){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",t.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(t).slice(1).remove().end().replaceWith(e.contains(this.$instance[0],t[0])?"":t),this.$content=t.addClass(this.namespace+"-inner"),this},open:function(n){var i=this;if(i.$instance.hide().appendTo(i.root),!(n&&n.isDefaultPrevented()||!1===i.beforeOpen(n))){n&&n.preventDefault();var r=i.getContent();if(r)return t.push(i),s(!0),i.$instance.fadeIn(i.openSpeed),i.beforeContent(n),e.when(r).always((function(e){e&&(i.setContent(e),i.afterContent(n))})).then(i.$instance.promise()).done((function(){i.afterOpen(n)}))}return i.$instance.detach(),e.Deferred().reject().promise()},close:function(t){var i=this,r=e.Deferred();return!1===i.beforeClose(t)?r.reject():(0===n(i).length&&s(!1),i.$instance.fadeOut(i.closeSpeed,(function(){i.$instance.detach(),i.afterClose(t),r.resolve()}))),r.promise()},resize:function(e,t){if(e&&t){this.$content.css("width","").css("height","");var n=Math.max(e/(this.$content.parent().width()-1),t/(this.$content.parent().height()-1));n>1&&(n=t/Math.floor(t/n),this.$content.css("width",e/n+"px").css("height",t/n+"px"))}},chainCallbacks:function(t){for(var n in t)this[n]=e.proxy(t[n],this,e.proxy(this[n],this))}},e.extend(a,{id:0,autoBind:"[data-featherlight]",defaults:a.prototype,contentFilters:{jquery:{regex:/^[#.]\w/,test:function(t){return t instanceof e&&t},process:function(t){return!1!==this.persist?e(t):e(t).clone(!0)}},image:{regex:/\.(png|jpg|jpeg|gif|tiff?|bmp|svg)(\?\S*)?$/i,process:function(t){var n=e.Deferred(),i=new Image,r=e('');return i.onload=function(){r.naturalWidth=i.width,r.naturalHeight=i.height,n.resolve(r)},i.onerror=function(){n.reject(r)},i.src=t,n.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(t){return e(t)}},ajax:{regex:/./,process:function(t){var n=e.Deferred(),i=e("
    ").load(t,(function(e,t){"error"!==t&&n.resolve(i.contents()),n.reject()}));return n.promise()}},iframe:{process:function(t){var n=new e.Deferred,r=e("