ValueMax : limit the number of voters per option

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Erwan TERTRAIS 2018-02-20 13:06:58 +01:00 committed by Thomas Citharel
parent 2a01afe4b8
commit 64ff414900
17 changed files with 227 additions and 26 deletions

View File

@ -17,14 +17,15 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft) * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/ */
use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
use Framadate\Migration\AddColumn_receiveNewComments_For_0_9;
use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
use Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9; use Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9;
use Framadate\Migration\Alter_Comment_table_adding_date;
use Framadate\Migration\Alter_Comment_table_for_name_length;
use Framadate\Migration\From_0_0_to_0_8_Migration; use Framadate\Migration\From_0_0_to_0_8_Migration;
use Framadate\Migration\From_0_8_to_0_9_Migration; use Framadate\Migration\From_0_8_to_0_9_Migration;
use Framadate\Migration\AddColumn_receiveNewComments_For_0_9;
use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
use Framadate\Migration\Alter_Comment_table_for_name_length;
use Framadate\Migration\Alter_Comment_table_adding_date;
use Framadate\Migration\AddColumn_ValueMax_In_poll_For_1_1;
use Framadate\Migration\Generate_uniqId_for_old_votes; use Framadate\Migration\Generate_uniqId_for_old_votes;
use Framadate\Migration\Increase_pollId_size; use Framadate\Migration\Increase_pollId_size;
use Framadate\Migration\Migration; use Framadate\Migration\Migration;
@ -42,12 +43,14 @@ $migrations = [
new AddColumn_receiveNewComments_For_0_9(), new AddColumn_receiveNewComments_For_0_9(),
new AddColumn_uniqId_In_vote_For_0_9(), new AddColumn_uniqId_In_vote_For_0_9(),
new AddColumn_hidden_In_poll_For_0_9(), new AddColumn_hidden_In_poll_For_0_9(),
new AddColumn_ValueMax_In_poll_For_1_1(),
new Generate_uniqId_for_old_votes(), new Generate_uniqId_for_old_votes(),
new RPadVotes_from_0_8(), new RPadVotes_from_0_8(),
new Alter_Comment_table_for_name_length(), new Alter_Comment_table_for_name_length(),
new Alter_Comment_table_adding_date(), new Alter_Comment_table_adding_date(),
new AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9(), new AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9(),
new Increase_pollId_size() new Increase_pollId_size()
]; ];
// --------------------------------------- // ---------------------------------------

View File

@ -28,6 +28,7 @@ class Form
public $format; public $format;
public $end_date; public $end_date;
public $choix_sondage; public $choix_sondage;
public $ValueMax;
/** /**
* Tells if users can modify their choices. * Tells if users can modify their choices.
@ -49,6 +50,12 @@ class Form
* If true, only the poll maker can see the poll's results * If true, only the poll maker can see the poll's results
* @var boolean * @var boolean
*/ */
public $use_ValueMax;
/**
* if true, there will be a limit of voters per option
* @var boolean
*/
public $hidden; public $hidden;
/** /**

View File

@ -0,0 +1,73 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration adds the field Value_Max on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class AddColumn_ValueMax_In_poll_For_1_1 implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Add column "ValueMax" in table "vote" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
return true;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
ADD `ValueMax` TINYINT,
ADD CHECK (ValueMax > 0)');
}
}

View File

@ -12,10 +12,10 @@ class PollRepository extends AbstractRepository {
public function insertPoll($poll_id, $admin_poll_id, $form) { public function insertPoll($poll_id, $admin_poll_id, $form) {
$sql = 'INSERT INTO `' . Utils::table('poll') . '` $sql = 'INSERT INTO `' . Utils::table('poll') . '`
(id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments, hidden, password_hash, results_publicly_visible) (id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments, hidden, password_hash, results_publicly_visible,ValueMax)
VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?,?,?,?)'; VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?,?,?,?,?)';
$prepared = $this->prepare($sql); $prepared = $this->prepare($sql);
$prepared->execute([$poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0, $form->receiveNewVotes ? 1 : 0, $form->receiveNewComments ? 1 : 0, $form->hidden ? 1 : 0, $form->password_hash, $form->results_publicly_visible ? 1 : 0]); $prepared->execute(array($poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0, $form->receiveNewVotes ? 1 : 0, $form->receiveNewComments ? 1 : 0, $form->hidden ? 1 : 0, $form->password_hash, $form->results_publicly_visible ? 1 : 0,$form->ValueMax));
} }
function findById($poll_id) { function findById($poll_id) {

View File

@ -76,6 +76,14 @@ class InputService {
public function filterMD5($control) { public function filterMD5($control) {
return filter_var($control, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => MD5_REGEX]]); return filter_var($control, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => MD5_REGEX]]);
} }
public function filterInteger($int) {
if (filter_var($int, FILTER_VALIDATE_INT)) {
return $int;
} else {
return null;
}
}
public function filterBoolean($boolean) { public function filterBoolean($boolean) {
return !!filter_var($boolean, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_TRUE_REGEX]]); return !!filter_var($boolean, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_TRUE_REGEX]]);

View File

@ -26,6 +26,8 @@ use Framadate\Repositories\RepositoryFactory;
use Framadate\Security\Token; use Framadate\Security\Token;
use Framadate\Utils; use Framadate\Utils;
class PollService { class PollService {
private $connect; private $connect;
private $logService; private $logService;
@ -151,7 +153,7 @@ class PollService {
return $this->pollRepository->findAllByAdminMail($mail); return $this->pollRepository->findAllByAdminMail($mail);
} }
function computeBestChoices($votes) { function computeBestChoices($votes) {
$result = ['y' => [0], 'inb' => [0]]; $result = ['y' => [0], 'inb' => [0]];
foreach ($votes as $vote) { foreach ($votes as $vote) {
$choices = str_split($vote->choices); $choices = str_split($vote->choices);

View File

@ -17,6 +17,7 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft) * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/ */
// FRAMADATE version // FRAMADATE version
const VERSION = '1.0'; const VERSION = '1.0';

View File

@ -48,6 +48,7 @@ if ($_SESSION['form']->format !== 'D') {
$_SESSION['form']->clearChoices(); $_SESSION['form']->clearChoices();
} }
if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || ($config['use_smtp'] && !isset($_SESSION['form']->admin_mail))) { if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || ($config['use_smtp'] && !isset($_SESSION['form']->admin_mail))) {
$step = 1; $step = 1;
} else if (!empty($_POST['confirmation'])) { } else if (!empty($_POST['confirmation'])) {

View File

@ -55,6 +55,10 @@ if (isset($_GET['type']) && $_GET['type'] === 'date' ||
$goToStep2 = filter_input(INPUT_POST, GO_TO_STEP_2, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^(date|classic)$/']]); $goToStep2 = filter_input(INPUT_POST, GO_TO_STEP_2, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^(date|classic)$/']]);
if ($goToStep2) { if ($goToStep2) {
$title = $inputService->filterTitle($_POST['title']); $title = $inputService->filterTitle($_POST['title']);
$use_ValueMax = isset($_POST['use_ValueMax']) ? $inputService->filterBoolean($_POST['use_ValueMax']) : false;
$ValueMax = $use_ValueMax == true ? $inputService->filterInteger($_POST['ValueMax']) : null;
$use_customized_url = isset($_POST['use_customized_url']) ? $inputService->filterBoolean($_POST['use_customized_url']) : false; $use_customized_url = isset($_POST['use_customized_url']) ? $inputService->filterBoolean($_POST['use_customized_url']) : false;
$customized_url = $use_customized_url === true ? $inputService->filterId($_POST['customized_url']) : null; $customized_url = $use_customized_url === true ? $inputService->filterId($_POST['customized_url']) : null;
$name = $inputService->filterName($_POST['name']); $name = $inputService->filterName($_POST['name']);
@ -77,10 +81,14 @@ if ($goToStep2) {
$error_on_password = false; $error_on_password = false;
$error_on_password_repeat = false; $error_on_password_repeat = false;
$error_on_customized_url = false; $error_on_customized_url = false;
$error_on_ValueMax = false;
$_SESSION['form']->title = $title; $_SESSION['form']->title = $title;
$_SESSION['form']->id = $customized_url; $_SESSION['form']->id = $customized_url;
$_SESSION['form']->use_customized_url = $use_customized_url; $_SESSION['form']->use_customized_url = $use_customized_url;
$_SESSION['form']->use_ValueMax = $use_ValueMax;
$_SESSION['form']->ValueMax = $ValueMax;
$_SESSION['form']->admin_name = $name; $_SESSION['form']->admin_name = $name;
$_SESSION['form']->admin_mail = $mail; $_SESSION['form']->admin_mail = $mail;
$_SESSION['form']->description = $description; $_SESSION['form']->description = $description;
@ -110,6 +118,14 @@ if ($goToStep2) {
} }
} }
if ($use_ValueMax) {
if ($use_ValueMax === false) {
$error_on_ValueMax = true;
$error_on_customized_url_msg = __('Error', 'Mauvaise valeur');
}
}
if ($name !== $_POST['name']) { if ($name !== $_POST['name']) {
$error_on_name = true; $error_on_name = true;
} }
@ -134,7 +150,7 @@ if ($goToStep2) {
} }
if ($title && $name && $email_OK && !$error_on_title && !$error_on_customized_url && !$error_on_description && !$error_on_name if ($title && $name && $email_OK && !$error_on_title && !$error_on_customized_url && !$error_on_description && !$error_on_name
&& !$error_on_password && !$error_on_password_repeat && !$error_on_password && !$error_on_password_repeat &&!$error_on_ValueMax
) { ) {
// If no errors, we hash the password if needed // If no errors, we hash the password if needed
if ($_SESSION['form']->use_password) { if ($_SESSION['form']->use_password) {
@ -193,12 +209,17 @@ $errors = [
'msg' => '', 'msg' => '',
'aria' => '', 'aria' => '',
'class' => '' 'class' => ''
],
'ValueMax' => [
'msg' => '',
'aria' => '',
'class' => ''
], ],
'password_repeat' => [ 'password_repeat' => [
'msg' => '', 'msg' => '',
'aria' => '', 'aria' => '',
'class' => '' 'class' => ''
] ],
]; ];
if (!empty($_POST[GO_TO_STEP_2])) { if (!empty($_POST[GO_TO_STEP_2])) {
@ -254,6 +275,11 @@ if (!empty($_POST[GO_TO_STEP_2])) {
$errors['password_repeat']['class'] = ' has-error'; $errors['password_repeat']['class'] = ' has-error';
$errors['password_repeat']['msg'] = __('Error', 'Passwords do not match'); $errors['password_repeat']['msg'] = __('Error', 'Passwords do not match');
} }
if ($error_on_ValueMax) {
$errors['ValueMax']['aria'] = 'aria-describeby="poll_ValueMax" ';
$errors['ValueMax']['class'] = ' has-error';
$errors['ValueMax']['msg'] = __('Error', 'error on ValueMax');
}
} }
$useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']); $useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']);
@ -268,6 +294,8 @@ $smarty->assign('poll_type', $poll_type);
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title)); $smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
$smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $_SESSION['form']->id)); $smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $_SESSION['form']->id));
$smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $_SESSION['form']->use_customized_url)); $smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $_SESSION['form']->use_customized_url));
$smarty->assign('ValueMax', Utils::fromPostOrDefault('ValueMax', $_SESSION['form']->ValueMax));
$smarty->assign('use_ValueMax', Utils::fromPostOrDefault('use_ValueMax', $_SESSION['form']->use_ValueMax));
$smarty->assign('poll_description', Utils::fromPostOrDefault('description', $_SESSION['form']->description)); $smarty->assign('poll_description', Utils::fromPostOrDefault('description', $_SESSION['form']->description));
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name)); $smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail)); $smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));

View File

@ -44,6 +44,18 @@ $(document).ready(function () {
} }
}); });
/**
* Enable/Disable ValueMax options
*/
$("#use_ValueMax").change(function () {
if ($(this).prop("checked")) {
$("#ValueMax").removeClass("hidden");
} else {
$("#ValueMax").addClass("hidden");
}
});
/** /**
* Hide/Show password options * Hide/Show password options
*/ */

View File

@ -247,7 +247,10 @@
"Password confirmation": "Confirmation", "Password confirmation": "Confirmation",
"Permissions": "Permissions", "Permissions": "Permissions",
"Optional parameters": "Optional parameters", "Optional parameters": "Optional parameters",
"Go to step 2": "Go to step 2" "Go to step 2": "Go to step 2",
"Limit the ammount of voters per option": "Limit the ammount of voters per option",
"ValueMax instructions": "voters per options ",
"Value Max" : "Value Max"
}, },
"Step 2": { "Step 2": {
"Back to step 1": "Return to step 1", "Back to step 1": "Return to step 1",

View File

@ -247,7 +247,10 @@
"Password confirmation": "Confirmation", "Password confirmation": "Confirmation",
"Permissions": "Permissions", "Permissions": "Permissions",
"Optional parameters": "Paramètres facultatifs", "Optional parameters": "Paramètres facultatifs",
"Go to step 2": "Aller à l'étape 2" "Go to step 2": "Aller à l'étape 2",
"Limit the ammount of voters per option":"limiter le nombre de votants par option",
"Value Max": "Valeur Maximale",
"ValueMax instructions": "Votants maximum par option"
}, },
"Step 2": { "Step 2": {
"Back to step 1": "Revenir à létape 1", "Back to step 1": "Revenir à létape 1",

View File

@ -4,3 +4,7 @@ log_errors = On
error_log = /var/log/apache2/error.log error_log = /var/log/apache2/error.log
ignore_repeated_errors = On ignore_repeated_errors = On
register_globals = Off register_globals = Off
[Date]
date.timezone = "Europe/Paris"

View File

@ -30,6 +30,9 @@ use Framadate\Services\SecurityService;
use Framadate\Services\SessionService; use Framadate\Services\SessionService;
use Framadate\Utils; use Framadate\Utils;
include_once __DIR__ . '/app/inc/init.php'; include_once __DIR__ . '/app/inc/init.php';
/* Constantes */ /* Constantes */
@ -231,5 +234,6 @@ $smarty->assign('hidden', $poll->hidden);
$smarty->assign('accessGranted', $accessGranted); $smarty->assign('accessGranted', $accessGranted);
$smarty->assign('resultPubliclyVisible', $resultPubliclyVisible); $smarty->assign('resultPubliclyVisible', $resultPubliclyVisible);
$smarty->assign('editedVoteUniqueId', $editedVoteUniqueId); $smarty->assign('editedVoteUniqueId', $editedVoteUniqueId);
$smarty->assign('ValueMax', $poll->ValueMax);
$smarty->display('studs.tpl'); $smarty->display('studs.tpl');

View File

@ -116,6 +116,41 @@
<div class="collapse" id="optionnal"> <div class="collapse" id="optionnal">
{* Value MAX *}
<div class="form-group">
<label for="use_valueMax" class="col-sm-4 control-label">
{__('Step 1', 'Value Max')}<br/>
</label>
<div class="col-sm-8">
<div class="checkbox">
<label>
<input id="use_ValueMax" name="use_ValueMax" type="checkbox" >
{__('Step 1', "Limit the ammount of voters per option")}
</label>
</div>
</div>
</div>
<div class="form-group">
<div id="ValueMax"{if !$use_ValueMax} class="hidden"{/if}>
<div class="col-sm-offset-4 col-sm-8">
<label >
<input id="ValueMax" type="number" min= "0" name="ValueMax">
{__('Step 1', "ValueMax instructions")}
</label>
</div>
</div>
</div>
{* Poll identifier *} {* Poll identifier *}
<div class="form-group {$errors['customized_url']['class']}"> <div class="form-group {$errors['customized_url']['class']}">

View File

@ -160,21 +160,24 @@
<input type="text" id="name" name="name" class="form-control" title="{__('Generic', 'Your name')}" placeholder="{__('Generic', 'Your name')}" /> <input type="text" id="name" name="name" class="form-control" title="{__('Generic', 'Your name')}" placeholder="{__('Generic', 'Your name')}" />
</div> </div>
</td> </td>
{$i = 0}
{foreach $slots as $id=>$slot} {foreach $slots as $id=>$slot}
<td class="bg-info" headers="C{$id}"> <td class="bg-info" headers="C{$id}">
<ul class="list-unstyled choice"> <ul class="list-unstyled choice">
<li class="yes"> {if $best_choices['y'][$i] lt $poll->ValueMax || $poll->ValueMax eq NULL}
<input type="radio" id="y-choice-{$id}" name="choices[{$id}]" value="2" /> <li class="yes">
<label class="btn btn-default btn-xs" for="y-choice-{$id}" title="{__('Poll results', 'Vote yes for')|html} {$slot->title|html}"> <input type="radio" id="y-choice-{$id}" name="choices[{$id}]" value="2" />
<i class="glyphicon glyphicon-ok"></i><span class="sr-only">{__('Generic', 'Yes')}</span> <label class="btn btn-default btn-xs" for="y-choice-{$id}" title="{__('Poll results', 'Vote yes for')|html} {$slot->title|html}">
</label> <i class="glyphicon glyphicon-ok"></i><span class="sr-only">{__('Generic', 'Yes')}</span>
</li> </label>
<li class="ifneedbe"> </li>
<input type="radio" id="i-choice-{$id}" name="choices[{$id}]" value="1" /> <li class="ifneedbe">
<label class="btn btn-default btn-xs" for="i-choice-{$id}" title="{__('Poll results', 'Vote ifneedbe for')|html} {$slot->title|html}"> <input type="radio" id="i-choice-{$id}" name="choices[{$id}]" value="1" />
(<i class="glyphicon glyphicon-ok"></i>)<span class="sr-only">{__('Generic', 'Ifneedbe')}</span> <label class="btn btn-default btn-xs" for="i-choice-{$id}" title="{__('Poll results', 'Vote ifneedbe for')|html} {$slot->title|html}">
</label> <i class="glyphicon glyphicon-ok"></i>)<span class="sr-only">{__('Generic', 'Ifneedbe')}</span>
</li> </label>
</li>
{/if}
<li class="no"> <li class="no">
<input type="radio" id="n-choice-{$id}" name="choices[{$id}]" value="0" /> <input type="radio" id="n-choice-{$id}" name="choices[{$id}]" value="0" />
<label class="btn btn-default btn-xs startunchecked" for="n-choice-{$id}" title="{__('Poll results', 'Vote no for')|html} {$slot->title|html}"> <label class="btn btn-default btn-xs startunchecked" for="n-choice-{$id}" title="{__('Poll results', 'Vote no for')|html} {$slot->title|html}">
@ -186,6 +189,8 @@
</li> </li>
</ul> </ul>
</td> </td>
{$i = $i+1}
{/foreach} {/foreach}
<td><button type="submit" class="btn btn-success btn-md" name="save" title="{__('Poll results', 'Save the choices')}">{__('Generic', 'Save')}</button></td> <td><button type="submit" class="btn btn-success btn-md" name="save" title="{__('Poll results', 'Save the choices')}">{__('Generic', 'Save')}</button></td>
</tr> </tr>

View File

@ -219,11 +219,17 @@
<input type="text" id="name" name="name" class="form-control" title="{__('Generic', 'Your name')}" placeholder="{__('Generic', 'Your name')}" /> <input type="text" id="name" name="name" class="form-control" title="{__('Generic', 'Your name')}" placeholder="{__('Generic', 'Your name')}" />
</div> </div>
</td> </td>
{$i = 0} {$i = 0}
{foreach $slots as $slot} {foreach $slots as $slot}
{foreach $slot->moments as $moment} {foreach $slot->moments as $moment}
<td class="bg-info" headers="M{$headersM[$i]} D{$headersD[$i]} H{$headersH[$i]}"> <td class="bg-info" headers="M{$headersM[$i]} D{$headersD[$i]} H{$headersH[$i]}">
<ul class="list-unstyled choice"> <ul class="list-unstyled choice">
{if $best_choices['y'][$i] lt $poll->ValueMax || $poll->ValueMax eq NULL}
<li class="yes"> <li class="yes">
<input type="radio" id="y-choice-{$i}" name="choices[{$i}]" value="2" /> <input type="radio" id="y-choice-{$i}" name="choices[{$i}]" value="2" />
<label class="btn btn-default btn-xs" for="y-choice-{$i}" title="{__('Poll results', 'Vote yes for')|html} {$slot->day|date_format:$date_format.txt_short|html} - {$moment|html}"> <label class="btn btn-default btn-xs" for="y-choice-{$i}" title="{__('Poll results', 'Vote yes for')|html} {$slot->day|date_format:$date_format.txt_short|html} - {$moment|html}">
@ -236,6 +242,9 @@
(<i class="glyphicon glyphicon-ok"></i>)<span class="sr-only">{__('Generic', 'Ifneedbe')}</span> (<i class="glyphicon glyphicon-ok"></i>)<span class="sr-only">{__('Generic', 'Ifneedbe')}</span>
</label> </label>
</li> </li>
{/if}
<li class="no"> <li class="no">
<input type="radio" id="n-choice-{$i}" name="choices[{$i}]" value="0" /> <input type="radio" id="n-choice-{$i}" name="choices[{$i}]" value="0" />
<label class="btn btn-default btn-xs startunchecked" for="n-choice-{$i}" title="{__('Poll results', 'Vote no for')|html} {$slot->day|date_format:$date_format.txt_short|html} - {$moment|html}"> <label class="btn btn-default btn-xs startunchecked" for="n-choice-{$i}" title="{__('Poll results', 'Vote no for')|html} {$slot->day|date_format:$date_format.txt_short|html} - {$moment|html}">
@ -247,6 +256,9 @@
</li> </li>
</ul> </ul>
</td> </td>
{$i = $i+1} {$i = $i+1}
{/foreach} {/foreach}
{/foreach} {/foreach}