So I'm using for and if to fill my select drop down from database and separating them by groups in the process. I added another option to the list, which you can see down below in the script and is Select All (Seleccionar Todo) but whenever I click the select to see the list it shows me Opciones and i have to scroll up to see select all option. Also, when i click on select all it works and selects me every box on the drop down but closes the drop down list every time i click on it and i don't want it to do that. I'm using materialize to do this and its version is 0.100.2.
<!DOCTYPE html>
<html>
<head>
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">
<!-- Compiled and minified JavaScript -->
</head>
<body>
<div class="container">
<div class="row">
<div class="col s20 m9 l10">
<div class="content-wrapper">
<div class="input-field">
<div class = "card-panel hoverable">
<form method="POST" action="http://localhost/evaluaciones/public/evaluaciones" accept-charset="UTF-8"><input name="_token" type="hidden" value="xxI3KuBXRt2OHDkFEA3qTPvhHpWoxOFDXBeCxJKt">
<div class="input-field">
<br><select multiple class="select_todo">
<option value="" disabled selected>Opciones</option>
<optgroup label="Primer Nivel">
<option value="1">Clínicas Odontologicas</option>
<option value="2">Recepción Odontología</option>
<option value="3">Tesorería</option>
<option value="4">Pastoral Universitaria</option>
<optgroup label="Segundo Nivel">
<option value="5">Laboratorio de Biología</option>
<option value="6">Bienestar Universitario</option>
<option value="7">Registro</option>
<option value="8">Agencia Bancaria</option>
<option value="9">Librería</option>
</optgroup>
<optgroup label="Unidades Academicas">
<option value="10">Unidades Academicas</option>
<option value="11">Dirección Psicología</option>
<option value="12">Medicina</option>
<option value="13">Ciencias Administrativas</option>
<option value="14">Odontología</option>
<option value="15">Civil</option>
<option value="16">Industrial</option>
<option value="17">Computación</option>
<option value="18">Arquitectura</option>
<option value="19">Estudios Generales</option>
<option value="20">Derecho</option>
<option value="21">Enfermería</option>
</optgroup>
<optgroup label="Tercer Nivel">
<option value="22">Recepción</option>
<option value="23">Contabilidad</option>
<option value="24">Recursos Humanos</option>
<option value="25">Dirección de Campus</option>
<option value="26">Dirección Administrativa</option>
<option value="27">Dirección de Postgrado</option>
<option value="28">Marketing</option>
<option value="29">Compras</option>
<option value="30">C.T.I.T</option>
<option value="31">Biblioteca</option>
</optgroup>
<optgroup label="Cuarto Nivel">
<option value="32">Investigación</option>
</optgroup>
</select>
<label>Seleccionar uno, varios o todos los departamentos</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--JavaScript at end of body for optimized loading-->
<!--Import jQuery before materialize.js-->
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
</body>
</html>
With this script I'm creating the option Select All on the drop down select to check all elements on the drop down with one click and uncheck them otherwise.
<script>
$('select').material_select();
$('select.select_todo').siblings('ul').prepend('<li id=sm_select_todo>
<span>Seleccionar Todo</span></li>');
$('li#sm_select_todo').on('click', function () {
var jq_elem = $(this),
jq_elem_span = jq_elem.find('span'),
select_todo = jq_elem_span.text() == 'Seleccionar Todo',
poner_texto = select_todo ? 'Quitar Selección' : 'Seleccionar Todo';
jq_elem_span.text(poner_texto);
jq_elem.siblings('li').filter(function() {
return $(this).find('input').prop('checked') != select_todo;
}).click();
});
</script>
Both your JS and markup are invalid. Possibly because you copy-pasted only a bit of your markup. Still, you should run your HTML through a validator.
$('select').material_select();
$('select.select_todo').siblings('ul').prepend($('<li />', {
id: "sm_select_todo",
html: $('<span />', {
html: '<input type="checkbox"><label>Seleccionar Todo</label>'
})
}));
$('#sm_select_todo').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
let select_todo = $('span label', this).text() === 'Seleccionar Todo';
$('span label', this).text(select_todo ? 'Quitar Selección' : 'Seleccionar Todo');
$('input[type="checkbox"]:not(#sm_select_todo input)', $(this).closest('.select_todo'))
.prop('checked', select_todo).trigger('click');
$('input[type="checkbox"]', this).prop('checked',select_todo);
});
Also, in what you posted, the <form>
element is not closed, which is usually a major problem.
See it working here (note nested <optgroup>
s are invalid, I had to close them to make it validate):
$('select').material_select();
$('select.select_todo').siblings('ul').prepend($('<li />', {
id: "sm_select_todo",
html: $('<span />', {
html: '<input type="checkbox"><label>Seleccionar Todo</label>'
})
}));
$('#sm_select_todo').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
let select_todo = $('span label', this).text() === 'Seleccionar Todo';
$('span label', this).text(select_todo ? 'Quitar Selección' : 'Seleccionar Todo');
$('input[type="checkbox"]:not(#sm_select_todo input)', $(this).closest('.select_todo'))
.prop('checked', select_todo).trigger('click');
$('input[type="checkbox"]', this).prop('checked',select_todo);
});
@import url("https://fonts.googleapis.com/icon?family=Material+Icons");
#sm_select_todo {
position: absolute;
top: 0;
left: 0;
background-color: white;
z-index: 1;
height: 52px;
}
#sm_select_todo label,
#sm_select_todo span{
font-size: 16px;
color: #26a69a;
display: block;
line-height: 22px;
}
#sm_select_todo span {
padding: 2px 16px 14px 30px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
<div class="container">
<div class="row">
<div class="col s20 m9 l10">
<div class="content-wrapper">
<div class="input-field">
<div class="card-panel hoverable">
<form method="POST" action="http://localhost/evaluaciones/public/evaluaciones" accept-charset="UTF-8"><input name="_token" type="hidden" value="xxI3KuBXRt2OHDkFEA3qTPvhHpWoxOFDXBeCxJKt">
<div class="input-field">
<select multiple class="select_todo">
<option value="" disabled selected>Opciones</option>
<optgroup label="Primer Nivel">
<option value="1">Clínicas Odontologicas</option>
<option value="2">Recepción Odontología</option>
<option value="3">Tesorería</option>
<option value="4">Pastoral Universitaria</option>
</optgroup>
<optgroup label="Segundo Nivel">
<option value="5">Laboratorio de Biología</option>
<option value="6">Bienestar Universitario</option>
<option value="7">Registro</option>
<option value="8">Agencia Bancaria</option>
<option value="9">Librería</option>
</optgroup>
<optgroup label="Unidades Academicas">
<option value="10">Unidades Academicas</option>
<option value="11">Dirección Psicología</option>
<option value="12">Medicina</option>
<option value="13">Ciencias Administrativas</option>
<option value="14">Odontología</option>
<option value="15">Civil</option>
<option value="16">Industrial</option>
<option value="17">Computación</option>
<option value="18">Arquitectura</option>
<option value="19">Estudios Generales</option>
<option value="20">Derecho</option>
<option value="21">Enfermería</option>
</optgroup>
<optgroup label="Tercer Nivel">
<option value="22">Recepción</option>
<option value="23">Contabilidad</option>
<option value="24">Recursos Humanos</option>
<option value="25">Dirección de Campus</option>
<option value="26">Dirección Administrativa</option>
<option value="27">Dirección de Postgrado</option>
<option value="28">Marketing</option>
<option value="29">Compras</option>
<option value="30">C.T.I.T</option>
<option value="31">Biblioteca</option>
</optgroup>
<optgroup label="Cuarto Nivel">
<option value="32">Investigación</option>
</optgroup>
</select>
<label>Seleccionar uno, varios o todos los departamentos</label>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>