Версия на jQuery UI

This commit is contained in:
Alexander Yakovlev 2018-08-11 16:35:07 +07:00
parent fb21d3dc1e
commit 214119167d
2 changed files with 215 additions and 168 deletions

134
js/calculator.js Normal file
View file

@ -0,0 +1,134 @@
// округление для денег, до 100 рублей
// потому что бутербродик стоит уже 99
function roundup(value){
var retval = Math.round( value / 100) * 100;
if (retval <= 0) { // если игр МНОГО, а в фонде нет денег
return 0;
}
return retval;
}
// Функция величины приза. Точно из скриптов IFComp.
function prizefn(value) {
return 1.0 * value * value - 2.0 * value + 1.0;
}
// Вычисление призов для номинации.
function recalNom(maxPrize, minPrize, count, prizeCount, fund, table) {
jQuery(table).empty();
if (prizeCount === 1) {
jQuery(table).append("<tr><th scope='row'>"+1+"</th><td>"+fund+" руб.</td></tr>");
return;
}
for (var i = 1; i <= prizeCount; i++) {
if (fund === 0) { // а тут копилка и кончилась
break;
}
var prize = roundup(maxPrize * prizefn((i-0.5)/count) + minPrize);
fund = fund - prize;
if (i === prizeCount) {
prize += fund; // добавляем ошибку округления
}
jQuery(table).append("<tr><th scope='row'>"+i+"</th><td>"+prize+" руб.</td></tr>");
}
}
function calcMaxPrize(fund, minPrize, count) {
if (count === 1) {
return fund;
}
if (fund > (minPrize * count)) {
return roundup(3 * (fund - minPrize * count) / count);
} else { // вот он, русский КРИЛ - много игр и мало денег
if (count > 1) {
return calcMaxPrize(fund, minPrize, count - 1);
} else { // да за что ж вы так с авторами
return calcMaxPrize(fund, minPrize - 500, count);
}
}
}
// Параметры: общий фонд, размеры номинаций
function recalculate(fund, games, translations) {
// фонды номинаций
var gameFund = roundup( fund * 0.66 );
var translateFund = roundup( fund * 0.33 );
if (translations === undefined) {
return;
}
// кол-во призовых мест
var prizeGames = Math.ceil(games * 0.1);
var prizeTranslations = Math.ceil(translations * 0.2);
if (prizeTranslations > translations) {
prizeTranslations = translations;
}
if (prizeGames > games) {
prizeGames = games;
}
// минимальный приз
var minPrize = 1000;
var maxPrizeGames = calcMaxPrize(gameFund, minPrize, prizeGames);
var maxPrizeTranslations = calcMaxPrize(translateFund, minPrize, prizeTranslations);
recalNom(maxPrizeGames, minPrize, games, prizeGames, gameFund, "#gameTable");
recalNom(maxPrizeTranslations, minPrize, translations, prizeTranslations, translateFund, "#translateTable");
}
jQuery(document).ready(function($){
jQuery("#fundRange").slider({
range: "min",
value: 30000,
min: 12000,
max: 50000,
step: 1000,
slide: function( event, ui) {
jQuery("#fundValue").text(ui.value + " руб.");
recalculate(
ui.value,
$("#gameRange").slider("value"),
$("#translateRange").slider("value")
);
}
});
jQuery("#gameRange").slider({
range: "min",
value: 30,
min: 1,
max: 100,
slide: function( event, ui) {
jQuery("#gameValue").text(ui.value + " игр");
recalculate(
$("#fundRange").slider("value"),
ui.value,
$("#translateRange").slider("value")
);
}
});
jQuery("#translateRange").slider({
range: "min",
value: 5,
min: 1,
max: 50,
slide: function( event, ui) {
jQuery("#translateValue").text(ui.value + " игр");
recalculate(
$("#fundRange").slider("value"),
$("#gameRange").slider("value"),
ui.value
);
}
});
jQuery("#fundValue").text(
$("#fundRange").slider("value") + " руб."
);
jQuery("#gameValue").text(
$("#gameRange").slider("value") + " игр"
);
jQuery("#translateValue").text(
$("#translateRange").slider("value") + " игр"
);
recalculate(
$("#fundRange").slider("value"),
$("#gameRange").slider("value"),
$("#translateRange").slider("value")
);
});

View file

@ -4,177 +4,90 @@
*
* @package kril
*/
get_header();
wp_enqueue_script(
'calculator',
get_stylesheet_directory_uri() . '/js/calculator.js',
array(
'jquery',
'jquery-ui-core',
'jquery-ui-slider',
),
'1.0',
true
);
wp_enqueue_style(
'calculator-ui-css',
'http://ajax.googleapis.com/ajax/libs/jqueryui/' . $wp_scripts->registered['jquery-ui-core']->ver . '/themes/black-tie/jquery-ui.css'
);
$container = get_theme_mod( 'understrap_container_type' );
?>
<div class="wrapper" id="page-wrapper">
<div class="<?php echo esc_attr( $container ); ?>" id="content">
<div class="row">
<div
class="<?php if ( is_active_sidebar( 'right-sidebar' ) ) : ?>col-md-8<?php else : ?>col-md-12<?php endif; ?> content-area"
id="primary">
<main class="site-main" id="main" role="main">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/css/ion.rangeSlider.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/css/ion.rangeSlider.skinHTML5.min.css">
<?php while ( have_posts() ) { the_post(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'loop-templates/content', 'page' ); ?>
<?php get_template_part( 'loop-templates/content', 'page' ); ?>
<?php } ?>
<?php
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
<form>
<div class="form-group">
<label for="formControlRange">
Призовой фонд конкурса:
<b><span id="fundValue"></span></b>
</label>
<div id="fundRange"></div>
</div>
<div class="form-group">
<label for="formControlRange">
Размер основной номинации:
<b><span id="gameValue"></span></b>
</label>
<div id="gameRange"></div>
</div>
<div class="form-group">
<label for="formControlRange">
Размер номинации переводов:
<b><span id="translateValue"></span></b>
</label>
<div id="translateRange"></div>
</div>
</form>
<h3>Основная номинация</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="gameTable">
</tbody>
</table>
<h3>Номинация переводов</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="translateTable">
</tbody>
</table>
</main><!-- #main -->
</div><!-- #primary -->
<?php get_template_part( 'sidebar-templates/sidebar', 'right' ); ?>
</div><!-- .row -->
</div><!-- Container end -->
</div><!-- Wrapper end -->
comments_template();
endif;
?>
<?php endwhile; // end of the loop. ?>
<form>
<div class="form-group">
<label for="formControlRange">Призовой фонд конкурса</label>
<input type="range" class="form-control-range" id="fundRange" min=11000 max=100000 value="14000">
</div>
<div class="form-group">
<label for="formControlRange">Размер основной номинации</label>
<input type="range" class="form-control-range" id="gameRange" min=10 max=100>
</div>
<div class="form-group">
<label for="formControlRange">Размер номинации переводов</label>
<input type="range" class="form-control-range" id="translateRange" min=10 max=100>
</div>
</form>
<h3>Основная номинация</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="gameTable">
</tbody>
</table>
<h3>Номинация переводов</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="translateTable">
</tbody>
</table>
</div>
</div>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/js/ion.rangeSlider.min.js"></script>
<script>
$(document).ready(function(){
// округление для денег, до 100 рублей
// потому что бутербродик стоит уже 99
function roundup(value){
var retval = Math.round( value / 100) * 100;
if (retval <= 0) { // если игр МНОГО, а в фонде нет денег
return 0;
}
return retval;
}
// Функция величины приза. Точно из скриптов IFComp.
function prizefn(value) {
return 1.0 * value * value - 2.0 * value + 1.0;
}
// Вычисление призов для номинации.
function recalNom(maxPrize, minPrize, count, prizeCount, fund, table) {
$(table).empty();
for (var i = 1; i <= prizeCount; i++) {
if (fund === 0) { // а тут копилка и кончилась
break;
}
var prize = roundup(maxPrize * prizefn((i-0.5)/count) + minPrize);
fund = fund - prize;
if (i === count) {
prize += fund; // добавляем ошибку округления
}
$(table).append("<tr><th scope='row'>"+i+"</th><td>"+prize+" руб.</td></tr>");
}
}
function calcMaxPrize(fund, minPrize, count) {
if (count === 1) {
return fund;
}
if (fund > (minPrize * count)) {
return roundup(3 * (fund - minPrize * count) / count);
} else { // вот он, русский КРИЛ - много игр и мало денег
if (count > 1) {
return calcMaxPrize(fund, minPrize, count - 1);
} else { // да за что ж вы так с авторами
return calcMaxPrize(fund, minPrize - 500, count);
}
}
}
var recalculate = function(){
// общий фонд
var fund = $("#fundRange").prop("value");
// фонды номинаций
var gameFund = roundup( fund * 0.66 );
var translateFund = roundup( fund * 0.33 );
// размеры номинаций
var games = $("#gameRange").prop("value");
var translations = translateRange.result;//.from_percent;
console.log(translations);
if (translations === undefined) {
return;
}
// кол-во призовых мест
var prizeGames = Math.ceil(games * 0.1);
var prizeTranslations = Math.ceil(translations * 0.2);
if (prizeTranslations > translations) {
prizeTranslations = translations;
}
if (prizeGames > games) {
prizeGames = games;
}
// минимальный приз
var minPrize = 1000;
var maxPrizeGames = calcMaxPrize(gameFund, minPrize, prizeGames);
var maxPrizeTranslations = calcMaxPrize(translateFund, minPrize, prizeTranslations);
recalNom(maxPrizeGames, minPrize, games, prizeGames, gameFund, "#gameTable");
recalNom(maxPrizeTranslations, minPrize, translations, prizeTranslations, translateFund, "#translateTable");
}
$("#fundRange").ionRangeSlider({
grid: true,
min: 10000,
max: 50000,
step: 500,
prettify_enabled: true,
postfix: "руб.",
onChange: recalculate,
});
$("#gameRange").ionRangeSlider({
onChange: recalculate,
});
$("#translateRange").ionRangeSlider({
min: 1,
max: 30,
onChange: recalculate,
});
var fundRange = $("#fundRange").data("ionRangeSlider");
var gameRange = $("#gameRange").data("ionRangeSlider");
var translateRange = $("#translateRange").data("ionRangeSlider");
recalculate();
});
</script>
<div class="wrapper" id="wrapper-hero">
<?php get_template_part( 'sidebar-templates/sidebar', 'hero' ); ?>
<?php get_template_part( 'sidebar-templates/sidebar', 'herocanvas' ); ?>
<?php get_template_part( 'sidebar-templates/sidebar', 'statichero' ); ?>
</div>
<?php get_footer();