mirror of
https://github.com/rmontanana/inventario2.git
synced 2025-08-17 00:16:01 +00:00
En mantenimiento puesta la gestión de URL para que vuelva siempre a donde estaba tanto desde altas, modificaciones o bajas
Reformateado de ficheros
This commit is contained in:
@@ -29,7 +29,6 @@ class Mantenimiento {
|
||||
private $descripcion;
|
||||
protected $bdd;
|
||||
protected $url;
|
||||
protected $cabecera;
|
||||
protected $tabla;
|
||||
protected $cadenaBusqueda;
|
||||
protected $campos = array();
|
||||
@@ -37,39 +36,85 @@ class Mantenimiento {
|
||||
protected $campoBusca = "Descripcion";
|
||||
protected $comandoConsulta = "";
|
||||
protected $perfil;
|
||||
protected $datosURL = array();
|
||||
protected $datosURLb = array();
|
||||
|
||||
public function __construct($baseDatos, $perfil, $nombre) {
|
||||
public function __construct($baseDatos, $perfil, $nombre)
|
||||
{
|
||||
$this->bdd = $baseDatos;
|
||||
$this->url = "index.php?$nombre&opc=inicial";
|
||||
$this->cabecera = 'Location: ' . $this->url;
|
||||
$this->url = "index.php?$nombre";
|
||||
//$this->datosURL['']
|
||||
$this->tabla = ucfirst($nombre);
|
||||
$this->perfil = $perfil;
|
||||
$this->cargaDatosURL();
|
||||
}
|
||||
|
||||
public function ejecuta() {
|
||||
$opc = $_GET['opc'];
|
||||
$id = $_GET['id'];
|
||||
$orden = isset($_GET['orden']) ? $_GET['orden'] : '';
|
||||
$sentido = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc';
|
||||
//Sólo tiene sentido para las modificaciones.
|
||||
//Es la página donde estaba el registro
|
||||
$pag = isset($_GET['pag']) ? $_GET['pag'] : '0';
|
||||
$this->cadenaBusqueda = $_GET['buscar'];
|
||||
/**
|
||||
* Carga en los atributos de la clase los datos de la URL
|
||||
* Los datos constantes en la URL son:
|
||||
* - opc = {inicial, editar, eliminar, nuevo, insertar, modificar, borrar}
|
||||
* - orden = {id, ... } nombre del campo por el que se ordena la visualización
|
||||
* - sentido = {asc, desc}
|
||||
* - pag = nº página 0, 1, 2, ...
|
||||
* Los datos opcionales de la URL son:
|
||||
* - buscar = cadena de búsqueda
|
||||
* - id = nº de la clave necesario para la edición o el borrado
|
||||
*/
|
||||
public function cargaDatosURL()
|
||||
{
|
||||
$this->datosURL['opc'] = isset($_GET['opc']) ? $_GET['opc'] : 'inicial';
|
||||
$this->datosURL['orden'] = isset($_GET['orden']) ? $_GET['orden'] : 'id';
|
||||
$this->datosURL['sentido'] = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc';
|
||||
$this->datosURL['pag'] = isset($_GET['pag']) ? $_GET['pag'] : '0';
|
||||
$this->cadenaBusqueda = isset($_GET['buscar']) ? $_GET['buscar'] : null;
|
||||
$this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda;
|
||||
$this->datosURL['buscar'] = $this->cadenaBusqueda;
|
||||
$this->datosURL['id'] = isset($_GET['id']) ? $_GET['id'] : null;
|
||||
}
|
||||
|
||||
public function backupURL()
|
||||
{
|
||||
$this->datosURLb = $this->datosURL;
|
||||
}
|
||||
|
||||
public function restoreURL()
|
||||
{
|
||||
$this->datosURL = $this->datosURLb;
|
||||
}
|
||||
|
||||
//Monta una URL con los datos cargados en los atributos de la clase
|
||||
private function montaURL()
|
||||
{
|
||||
//Primero los datos obligatorios
|
||||
$opc = "&opc=" . $this->datosURL['opc'];
|
||||
$orden = "&orden=" . $this->datosURL['orden'];
|
||||
$sentido = "&sentido=" . $this->datosURL['sentido'];
|
||||
$pag = "&pag=" . $this->datosURL['pag'];
|
||||
//Ahora los datos opcionales
|
||||
$buscar = isset($this->cadenaBusqueda) ? "buscar=$this->cadenaBusqueda" : null;
|
||||
$id = isset($this->datosURL['id']) ? "&id=" . $this->datosURL['id'] : null;
|
||||
$enlace = $this->url . $opc . $orden . $sentido . $pag . $buscar . $id;
|
||||
return $enlace;
|
||||
}
|
||||
|
||||
public function ejecuta()
|
||||
{
|
||||
$this->obtenerCampos();
|
||||
$this->obtieneClavesForaneas();
|
||||
switch ($opc) {
|
||||
case 'inicial':return $this->consulta($id, $orden, $sentido);
|
||||
case 'editar':return $this->muestra($id, EDICION, $pag, $orden, $sentido);
|
||||
case 'eliminar':return $this->muestra($id, BORRADO);
|
||||
case 'nuevo':return $this->muestra(null, ANADIR);
|
||||
switch ($this->datosURL['opc']) {
|
||||
case 'inicial':return $this->consulta();
|
||||
case 'editar':return $this->muestra(EDICION);
|
||||
case 'eliminar':return $this->muestra(BORRADO);
|
||||
case 'nuevo':return $this->muestra(ANADIR);
|
||||
case 'insertar':return $this->insertar();
|
||||
case 'modificar':return $this->modificar($id, $pag, $orden, $sentido);
|
||||
case 'borrar':return $this->borrar($id);
|
||||
default:return 'La clase Mantenimiento No entiende lo solicitado.';
|
||||
case 'modificar':return $this->modificar();
|
||||
case 'borrar':return $this->borrar();
|
||||
default: return "La clase Mantenimiento No entiende lo solicitado [" . $this->datosURL['opc'] . "]";
|
||||
}
|
||||
}
|
||||
|
||||
protected function obtieneClavesForaneas() {
|
||||
protected function obtieneClavesForaneas()
|
||||
{
|
||||
$salida = null;
|
||||
foreach ($this->campos as $clave => $valor) {
|
||||
$trozos = explode(",", $valor["Comment"]);
|
||||
@@ -87,21 +132,23 @@ class Mantenimiento {
|
||||
$this->foraneas = $salida;
|
||||
}
|
||||
|
||||
private function consulta($pagina, $orden, $sentido) {
|
||||
private function consulta()
|
||||
{
|
||||
$orden = $this->datosURL['orden'];
|
||||
$sentido = $this->datosURL['sentido'];
|
||||
//Calcula los números de página anterior y siguiente.
|
||||
$pagina = $pagina + 0;
|
||||
$pagina = $this->datosURL['pag'];
|
||||
$pagSigte = $pagina <= 0 ? 1 : $pagina + 1;
|
||||
$pagAnt = $pagSigte - 2;
|
||||
$pagAnt = $pagSigte - 2 < 0 ? 0 : $pagSigte -2;
|
||||
$pagFwd = $pagSigte + 3;
|
||||
$pagRew = $pagAnt - 3 < 0 ? $pagAnt : $pagAnt - 3;
|
||||
$pagRew = $pagAnt - 3 < 0 ? 0 : $pagAnt - 3;
|
||||
//Tengo que procesar la cabecera antes de lo de la cadena de búsqueda por el tema de las búsquedas
|
||||
$cabecera = $this->cabeceraTabla();
|
||||
//Trata con la cadena de búsqueda si viene del post debe quedarse con ella sino con la del get y si no está definida => vacía
|
||||
$this->cadenaBusqueda = isset($_GET['buscar']) ? $_GET['buscar'] : null;
|
||||
$this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda;
|
||||
//$this->cadenaBusqueda = isset($_GET['buscar']) ? $_GET['buscar'] : null;
|
||||
//$this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda;
|
||||
if (isset($this->cadenaBusqueda) && strlen($this->cadenaBusqueda)) {
|
||||
$sufijo = " where $this->campoBusca like '%" . $this->bdd->filtra($this->cadenaBusqueda) . "%'";
|
||||
$sufijoEnlace = '&buscar=' . $this->cadenaBusqueda .'';
|
||||
$comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta);
|
||||
} else {
|
||||
$comando = str_replace('{buscar}', '', $this->comandoConsulta);
|
||||
@@ -114,36 +161,35 @@ class Mantenimiento {
|
||||
$comando = str_replace('{orden}', ' ', $comando);
|
||||
}
|
||||
//Introduce un botón para hacer búsquedas y el número de la página
|
||||
$salida = $this->enlaceBusqueda($pagSigte, $this->cadenaBusqueda);
|
||||
//Esta orden de centrado se cierra en el pie de la tabla
|
||||
//$salida.='<center><h4>Página ' . $pagSigte . '</h4>';
|
||||
// $salida .='<div class="nav-bar navbar-fixed"><ul class="nav nav-pills nav-stacked">
|
||||
// <li class="active">
|
||||
// <a href="#">
|
||||
// <span class="badge pull-right">' . $pagSigte . '</span>
|
||||
// Página
|
||||
// </a>
|
||||
// </li>
|
||||
// </ul></div>';
|
||||
$salida = $this->enlaceBusqueda($pagSigte);
|
||||
$salida.= $cabecera;
|
||||
//Consulta paginada de todas las tuplas
|
||||
$comando = str_replace('{inferior}', ($pagAnt + 1) * NUMFILAS, $comando);
|
||||
$comando = str_replace('{inferior}', $pagina * NUMFILAS, $comando);
|
||||
$comando = str_replace('{superior}', NUMFILAS, $comando);
|
||||
//$salida.=$comando;
|
||||
$tabla = strtolower($this->tabla);
|
||||
$this->bdd->ejecuta($comando);
|
||||
$numRegistros = $this->bdd->numeroTotalTuplas();
|
||||
//Si el número de la página fwd es mayor que el total de páginas lo establece a éste
|
||||
if (NUMFILAS > 0) {
|
||||
$totalPags = (int) ($numRegistros / NUMFILAS) - 1;
|
||||
if ($numRegistros % NUMFILAS) {
|
||||
$totalPags++;
|
||||
}
|
||||
} else {
|
||||
$totalPags = 0;
|
||||
}
|
||||
$pagFwd = $pagFwd > $totalPags ? $totalPags : $pagFwd;
|
||||
if ($this->bdd->numeroTuplas() == 0) {
|
||||
if ($pagSigte > 1) {
|
||||
// Si no hay datos en la consulta y no es la primera página,
|
||||
// carga la página inicial
|
||||
header('Location: ' . $this->url);
|
||||
// carga la página final
|
||||
$this->datosURL['pag'] = $totalPags;
|
||||
header('Location: ' . $this->montaURL());
|
||||
} else {
|
||||
$salida = "<p align=\"center\"><center><h2>No hay registros</h2></center></p><br>";
|
||||
}
|
||||
}
|
||||
//$salida.=print_r($this->perfil);
|
||||
//$salida.=$comando;
|
||||
//var_dump($this->campos);
|
||||
while ($fila = $this->bdd->procesaResultado()) {
|
||||
$salida.='<tr align="center" bottom="middle">';
|
||||
foreach ($fila as $clave => $valor) {
|
||||
@@ -170,37 +216,56 @@ class Mantenimiento {
|
||||
}
|
||||
//Añade el icono de editar
|
||||
if ($this->perfil['Modificacion']) {
|
||||
$salida.='<td><a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden . $sufijoEnlace.
|
||||
//$salida.='<td><a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden . $sufijoEnlace .
|
||||
$this->backupURL(); $this->datosURL['opc'] = "editar"; $this->datosURL['id'] = $id;
|
||||
$salida.='<td><a href="' . $this->montaURL() .
|
||||
'"><img title="Editar" src="img/' . ESTILO . '/editar.png" alt="editar"></a>';
|
||||
$this->restoreURL();
|
||||
}
|
||||
//Añade el icono de eliminar
|
||||
if ($this->perfil['Borrado']) {
|
||||
$salida.=' <a href="index.php?' . $tabla . '&opc=eliminar&id=' . $id . $sufijoEnlace.
|
||||
//$salida.=' <a href="index.php?' . $tabla . '&opc=eliminar&id=' . $id . $sufijoEnlace .
|
||||
$this->backupURL(); $this->datosURL['opc'] = "eliminar"; $this->datosURL['id'] = $id;
|
||||
$salida.=' <a href="' . $this->montaURL() .
|
||||
'"><img title="Eliminar" src="img/' . ESTILO . '/eliminar.png" alt="eliminar"></a></td></tr>' . "\n";
|
||||
$this->restoreURL();
|
||||
}
|
||||
}
|
||||
$salida.="</tbody></table></center></p>";
|
||||
//Añade botones de comandos
|
||||
$enlace = '<a href="' . $this->url . $sufijoOrden . '&id=';
|
||||
if ($this->bdd->numeroTuplas()) {
|
||||
$anterior = $enlace . $pagAnt . $sufijoEnlace . "\"><img title=\"Pag. Anterior\" alt=\"anterior\" src=\"img/" . ESTILO . "/anterior.png\"></a>\n";
|
||||
$siguiente = $enlace . $pagSigte . $sufijoEnlace . "\"><img title=\"Pag. Siguiente\" alt=\"siguiente\" src=\"img/" . ESTILO . "/siguiente.png\"></a>\n";
|
||||
$fwd = $enlace . $pagFwd . $sufijoEnlace . "\"><img title=\"+5 Pags.\" alt=\"mas5p\" src=\"img/" . ESTILO . "/fwd.png\"></a>\n";
|
||||
$rew = $enlace . $pagRew . $sufijoEnlace . "\"><img title=\"-5 Pags.\" alt=\"menos5p\" src=\"img/" . ESTILO . "/rew.png\"></a>\n";
|
||||
if (strlen($orden) > 0) {
|
||||
$az = '<a href="' . $this->url . '&orden=' . $orden . '&sentido=asc"><img alt="asc" title="Orden ascendente" src="img/' . ESTILO . '/ascendente.png"></a>';
|
||||
$za = '<a href="' . $this->url . '&orden=' . $orden . '&sentido=desc"><img alt="desc" title="Orden descendente" src="img/' . ESTILO . '/descendente.png"></a>';
|
||||
} else {
|
||||
$az = $za = '';
|
||||
}
|
||||
|
||||
if ($numRegistros) {
|
||||
$this->backupURL();
|
||||
$this->datosURL['pag'] = $pagAnt;
|
||||
$anterior = $this->montaURL();
|
||||
$this->datosURL['pag'] = $pagSigte;
|
||||
$siguiente = $this->montaURL();
|
||||
$this->datosURL['pag'] = $pagFwd;
|
||||
$fwd = $this->montaURL();
|
||||
$this->datosURL['pag'] = $pagRew;
|
||||
$rew = $this->montaURL();
|
||||
$anterior = '<a href="' . $anterior . "\"><img title=\"Pag. Anterior\" alt=\"anterior\" src=\"img/" . ESTILO . "/anterior.png\"></a>\n";
|
||||
$siguiente = '<a href="' . $siguiente . "\"><img title=\"Pag. Siguiente\" alt=\"siguiente\" src=\"img/" . ESTILO . "/siguiente.png\"></a>\n";
|
||||
$fwd = '<a href="' . $fwd . "\"><img title=\"+4 Pags.\" alt=\"mas4pags\" src=\"img/" . ESTILO . "/fwd.png\"></a>\n";
|
||||
$rew = '<a href="' . $rew . "\"><img title=\"-4 Pags.\" alt=\"menos4pags\" src=\"img/" . ESTILO . "/rew.png\"></a>\n";
|
||||
$this->restoreURL();
|
||||
$this->datosURL['sentido'] = "asc";
|
||||
$az = $this->montaURL();
|
||||
$az = '<a href="' . $az . '"><img alt="asc" title="Orden ascendente" src="img/' . ESTILO . '/ascendente.png"></a>';
|
||||
$this->datosURL['sentido'] = "desc";
|
||||
$za = $this->montaURL();
|
||||
$za = '<a href="' . $za . '"><img alt="desc" title="Orden descendente" src="img/' . ESTILO . '/descendente.png"></a>';
|
||||
$this->restoreURL();
|
||||
if ($this->perfil['Informe']) {
|
||||
$informe = '<a href="index.php?' . $tabla . '&opc=informe" target="_blank"><img src="img/' . ESTILO . '/informe.png" alt="informe" title="Informe pdf"></a>';
|
||||
} else {
|
||||
$informe = "";
|
||||
}
|
||||
$this->restoreURL();
|
||||
}
|
||||
if ($this->perfil['Alta']) {
|
||||
$anadir = '<a href="index.php?' . $tabla . '&opc=nuevo">' .
|
||||
$this->datosURL['opc'] = 'nuevo';
|
||||
$anadir = '<a href="' . $this->montaURL() . '">' .
|
||||
'<img title="Añadir registro" alt="nuevo" src="img/' . ESTILO . '/nuevo.png"></a>';
|
||||
} else {
|
||||
$anadir = "";
|
||||
@@ -210,41 +275,35 @@ class Mantenimiento {
|
||||
return $salida;
|
||||
}
|
||||
|
||||
private function enlaceBusqueda($pagina, $valorAnterior) {
|
||||
//$salida = '<p align="center">';
|
||||
//$salida .='<center><form name="busqueda" method="POST"><input type="text" class="form-control" name="buscar"';
|
||||
//$salida .='value="' . $this->cadenaBusqueda . '" size="40" /><input type="submit" class="btn btn-primary" value="Buscar" name=';
|
||||
//$salida .='"Buscar" />';
|
||||
//$salida .= '</form></center>';
|
||||
//$salida.='</p>';
|
||||
$valor = isset($valorAnterior) ? 'value="'.$valorAnterior.'"' : '';
|
||||
private function enlaceBusqueda($pagina)
|
||||
{
|
||||
$valor = isset($this->cadenaBusqueda) ? 'value="' . $this->cadenaBusqueda . '"' : '';
|
||||
$salida = '<form name="busqueda" method="POST"><div class="col-sm-4 col-lg-6"><div class="input-group">
|
||||
<input type="text" name="buscar" placeholder="Descripción" class="form-control" ' . $valor . '>
|
||||
<span class="input-group-btn"><button class="btn btn-primary" type="button">Buscar</button>
|
||||
</span></div></div></form>';
|
||||
//$salida .= '<div class="col-lg-1 pull-right"><ul class="nav nav-pills nav-stacked "><li class="active">
|
||||
// <a href="#"><span class="badge pull-right">'.$pagina.'</span>Página</a></li></ul></div>';
|
||||
$salida .= '<button class="btn btn-info pull-right" type="button">Página <span class="badge">'
|
||||
. $pagina . '</span></button>';
|
||||
// $salida .= '<div class="progress progress-striped">
|
||||
// <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
|
||||
// Página 5 de 6<span class="sr-only">20% Complete</span>
|
||||
// </div>
|
||||
//</div>';
|
||||
return $salida;
|
||||
}
|
||||
|
||||
protected function borrar($id) {
|
||||
protected function borrar()
|
||||
{
|
||||
//@todo hay que tener en cuenta aquí la cadena de búsqueda y la página en la url
|
||||
$id = $this->datosURL['id'];
|
||||
$comando = "delete from " . $this->tabla . " where id=\"$id\"";
|
||||
if (!$this->bdd->ejecuta($comando)) {
|
||||
return $this->errorBD($comando);
|
||||
}
|
||||
header('Location: ' . $this->url);
|
||||
$this->datosURL['opc'] = 'inicial';
|
||||
$this->datosURL['id'] = null;
|
||||
$url = $this->montaURL();
|
||||
header('Location: ' . $url);
|
||||
return;
|
||||
}
|
||||
|
||||
protected function insertar() {
|
||||
protected function insertar()
|
||||
{
|
||||
$comando = "insert into " . $this->tabla . " (";
|
||||
$lista = explode("&", $_POST['listacampos']);
|
||||
$primero = true;
|
||||
@@ -288,12 +347,14 @@ class Mantenimiento {
|
||||
if (!$this->bdd->ejecuta($comando)) {
|
||||
return $this->errorBD($comando);
|
||||
}
|
||||
list($enlace, $resto) = explode("&", $this->url);
|
||||
$this->datosURL['opc'] = 'inicial';
|
||||
$this->datosURL['id'] = null;
|
||||
$enlace.="&opc=inicial";
|
||||
return "<h1><a href=\"$enlace\">Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "</a></h1>";
|
||||
return "<h1><a href=\"".$this->montaURL()."\">Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "</a></h1>";
|
||||
}
|
||||
|
||||
protected function modificar($id, $pag, $orden, $sentido) {
|
||||
protected function modificar()
|
||||
{
|
||||
//Los datos a utilizar para actualizar la tupla vienen en $_POST.
|
||||
//La lista de atributos de la tupla viene en el campo oculto listacampos
|
||||
//print_r($_GET);
|
||||
@@ -301,7 +362,6 @@ class Mantenimiento {
|
||||
//@todo hay que tener en cuenta aquí la página en la que se encuentra y la cadena de búsqueda
|
||||
$comando = "update " . $this->tabla . " set ";
|
||||
$lista = explode("&", $_POST['listacampos']);
|
||||
//var_dump($lista);
|
||||
$primero = true;
|
||||
foreach ($lista as $campo) {
|
||||
if ($campo == "id" || $campo == "")
|
||||
@@ -327,20 +387,20 @@ class Mantenimiento {
|
||||
}
|
||||
}
|
||||
}
|
||||
$comando.=" where id=\"$id\"";
|
||||
$comando.=" where id=\"" . $this->datosURL['id'] . "\"";
|
||||
if (!$this->bdd->ejecuta($comando)) {
|
||||
return $this->errorBD($comando);
|
||||
}
|
||||
|
||||
list($enlace, $resto) = explode("&", $this->url);
|
||||
$enlace.="&opc=inicial&orden=" . $orden . "&sentido=" . $sentido . "&id=" . $pag;
|
||||
//echo $comando;
|
||||
header('Location: ' . $enlace);
|
||||
$this->datosURL['id'] = null;
|
||||
$this->datosURL['opc'] = inicial;
|
||||
header('Location: ' . $this->montaURL());
|
||||
return;
|
||||
}
|
||||
|
||||
protected function muestra($id, $tipoAccion, $pag = "", $orden = "", $sentido = "") {
|
||||
if (isset($id)) {
|
||||
protected function muestra($tipoAccion)
|
||||
{
|
||||
$id = $this->datosURL['id'];
|
||||
if ($tipoAccion != ANADIR) {
|
||||
$comando = "select * from " . $this->tabla . " where id='$id'";
|
||||
$resultado = $this->bdd->ejecuta($comando);
|
||||
if (!$resultado) {
|
||||
@@ -350,14 +410,10 @@ class Mantenimiento {
|
||||
} else {
|
||||
$fila = null;
|
||||
}
|
||||
//list($tipo,$valor)=explode($columna["Type"]);
|
||||
$accion = "index.php?" . strtolower($this->tabla) . "&id=$id&opc=";
|
||||
/*$accion = "index.php?" . strtolower($this->tabla) . "&id=$id&opc=";
|
||||
switch ($tipoAccion) {
|
||||
case EDICION:
|
||||
$accion.="modificar";
|
||||
$accion.=isset($pag) ? "&pag=$pag" : '';
|
||||
$accion.=isset($orden) ? "&orden=$orden" : '';
|
||||
$accion.=isset($sentido) ? "&sentido=$sentido" : '';
|
||||
break;
|
||||
case BORRADO:
|
||||
$accion.="borrar";
|
||||
@@ -366,13 +422,18 @@ class Mantenimiento {
|
||||
$accion.="insertar";
|
||||
break;
|
||||
}
|
||||
$accion.=isset($pag) ? "&pag=$pag" : '';
|
||||
$accion.=isset($orden) ? "&orden=$orden" : '';
|
||||
$accion.=isset($sentido) ? "&sentido=$sentido" : '';
|
||||
$accion.=isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : '';*/
|
||||
//Genera un formulario con los datos de la tupla seleccionada.
|
||||
return $this->formularioCampos($accion, $tipoAccion, $fila);
|
||||
return $this->formularioCampos($tipoAccion, $fila);
|
||||
}
|
||||
|
||||
//Función que genera un campo de lista con los valores de descripción de la
|
||||
//tabla a la cual pertenece la clave foránea.
|
||||
protected function generaLista($datos, $campo, $valorInicial, $modo) {
|
||||
protected function generaLista($datos, $campo, $valorInicial, $modo)
|
||||
{
|
||||
$salida = "<select class=\"form-control\" name=\"$campo\">\n";
|
||||
list($tabla, $atributos) = explode(",", $datos);
|
||||
$atributos = str_replace("/", ",", $atributos);
|
||||
@@ -405,7 +466,8 @@ class Mantenimiento {
|
||||
return $salida;
|
||||
}
|
||||
|
||||
private function obtenerCampos() {
|
||||
private function obtenerCampos()
|
||||
{
|
||||
//Si hay un fichero de descripción xml lo utiliza.
|
||||
$nombre = "xml/mantenimiento" . $this->tabla . ".xml";
|
||||
if (file_exists($nombre)) {
|
||||
@@ -424,11 +486,12 @@ class Mantenimiento {
|
||||
$this->campos[$datos[$i]["Field"]]["Campo"] = $datos[$i]["Field"];
|
||||
$this->campos[$datos[$i]["Field"]]["Editable"] = "si";
|
||||
}
|
||||
$this->comandoConsulta = "select * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
|
||||
$this->comandoConsulta = "select SQL_CALC_FOUND_ROWS * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
|
||||
}
|
||||
}
|
||||
|
||||
private function cabeceraTabla() {
|
||||
private function cabeceraTabla()
|
||||
{
|
||||
//$salida = '<p align="center"><table border=1 class="tablaDatos"><tbody>';
|
||||
$salida = '<p align="center"><table border=1 class="table table-striped table-bordered table-condensed table-hover"><tbody>';
|
||||
foreach ($this->campos as $clave => $datos) {
|
||||
@@ -448,7 +511,7 @@ class Mantenimiento {
|
||||
$clave = str_ireplace("ubicacion", "Ubicación", $clave);
|
||||
$clave = str_ireplace("articulo", "Artículo", $clave);
|
||||
if ($ordenable) {
|
||||
$salida.="<th><b><a title=\"Establece orden por $clave \" href=\"$this->url&orden=" . strtolower($clave2) . "\"> " . ucfirst($clave) . " </a></b></th>\n";
|
||||
$salida.="<th><b><a title=\"Establece orden por $clave \" href=\"". $this->montaURL() . "\"> " . ucfirst($clave) . " </a></b></th>\n";
|
||||
} else {
|
||||
$salida.='<th><b>' . ucfirst($clave) . '</b></th>' . "\n";
|
||||
}
|
||||
@@ -460,14 +523,26 @@ class Mantenimiento {
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $accion URL de la acción del POST
|
||||
* @param string $tipo ANADIR,EDITAR,BORRADO
|
||||
* @param string $tipo ANADIR,EDICION,BORRADO
|
||||
* @param array $datos Vector con los datos del registro
|
||||
* @return array lista de campos y formulario de entrada
|
||||
*/
|
||||
private function formularioCampos($accion, $tipo, $datos) {
|
||||
private function formularioCampos($tipo, $datos)
|
||||
{
|
||||
$modo = $tipo == BORRADO ? "readonly" : "";
|
||||
$nfechas = 0;
|
||||
switch ($tipo) {
|
||||
case ANADIR:
|
||||
$this->datosURL['opc'] = "insertar"; $this->datosURL['id'] = null;
|
||||
break;
|
||||
case EDICION:
|
||||
$this->datosURL['opc'] = "modificar";
|
||||
break;
|
||||
case BORRADO:
|
||||
$this->datosURL['opc'] = "borrar";
|
||||
break;
|
||||
}
|
||||
$accion = $this->montaURL();
|
||||
$salida.='<div class="col-sm-8"><form name="mantenimiento.form" class="form-horizontal" role="form" method="post" action="' . $accion . '">' . "\n";
|
||||
$salida.="<fieldset style=\"width: 96%;\"><p><legend style=\"color: red;\"><b>$tipo</b></legend>\n";
|
||||
foreach ($this->campos as $clave => $valor) {
|
||||
@@ -501,9 +576,6 @@ class Mantenimiento {
|
||||
$tamano = "19";
|
||||
$tipo_campo = "datetime";
|
||||
$nfechas++;
|
||||
//
|
||||
//Prueba
|
||||
//
|
||||
$salida .= '<div class="input-group date" id="datetimepicker' . $nfechas . '">
|
||||
<input type="text" name="' . $campo . '" data-format="YYYY/MM/DD" value="' . $valorDato . '" ' . $modoEfectivo . ' class="form-control" />
|
||||
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
|
||||
@@ -528,7 +600,6 @@ class Mantenimiento {
|
||||
}
|
||||
if ($tipoCampo == "Boolean(1)") {
|
||||
$checked = $valorDato == '1' ? 'checked' : '';
|
||||
//$salida .= '<div class="checkbox">';
|
||||
$modocheck = $modoEfectivo == "readonly" ? 'onclick="javascript: return false;" readonly ' : '';
|
||||
$salida .= '<input type="checkbox" name="' . $campo . '" ' . $checked . ' ' . $modocheck . ' class="form-control">';
|
||||
$salida .= '</div></div>';
|
||||
@@ -547,19 +618,32 @@ class Mantenimiento {
|
||||
$salida .= '<input name="listacampos" type="hidden" value="' . $campos . "\">\n";
|
||||
$salida .= "</fieldset><p>";
|
||||
$salida .= '<center>';
|
||||
$salida .= '<button type="button" onClick="location.href=' . "'$this->url'" . '" class="btn btn-info">Volver</button>';
|
||||
$this->datosURL['opc'] = 'inicial';
|
||||
$salida .= '<button type="button" onClick="location.href=' . "'" . $this->montaURL() . "'" . '" class="btn btn-info">Volver</button>';
|
||||
$salida .= ' <button type="reset" class="btn btn-danger">Cancelar</button>';
|
||||
$salida .= ' <button type=submit class="btn btn-primary">Aceptar</button>';
|
||||
$salida .= '<br></center></div>';
|
||||
return $salida;
|
||||
}
|
||||
|
||||
protected function errorBD($comando, $mensaje = "") {
|
||||
if (!$mensaje) {
|
||||
return "<h1>No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError() . " </h1>";
|
||||
protected function errorBD($comando, $texto = "", $tipo = "danger", $cabecera = "¡Atención!")
|
||||
{
|
||||
if (!$texto) {
|
||||
$texto = "No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError();
|
||||
} else {
|
||||
return "<h1>$mensaje error=" . $this->bdd->mensajeError() . "</h1>";
|
||||
$texto = "$texto error=" . $this->bdd->mensajeError();
|
||||
}
|
||||
return $this->panelMensaje($texto, "danger", $cabecera="¡Error!");
|
||||
}
|
||||
|
||||
private function panelMensaje($info, $tipo = "danger", $cabecera = "¡Atención!") {
|
||||
$mensaje = '<div class="panel panel-' . $tipo . '"><div class="panel-heading">';
|
||||
$mensaje .= '<h3 class="panel-title">' . $cabecera . '</h3></div>';
|
||||
$mensaje .= '<div class="panel-body">';
|
||||
$mensaje .= $info;
|
||||
$mensaje .= '</div>';
|
||||
$mensaje .= '</div>';
|
||||
return $mensaje;
|
||||
}
|
||||
|
||||
}
|
||||
|
16
Sql.php
16
Sql.php
@@ -152,6 +152,22 @@ class Sql {
|
||||
public function numeroTuplas() {
|
||||
return $this->numero;
|
||||
}
|
||||
/**
|
||||
* Devuelve el número de tuplas total si se ha hecho una consulta select
|
||||
* con SELECT SQL_CALC_FOUND_ROWS * ...
|
||||
* @return integer Número de tuplas.
|
||||
*/
|
||||
public function numeroTotalTuplas()
|
||||
{
|
||||
$comando = "select found_rows();";
|
||||
if (!$peticion=$this->bdd->query($comando)) {
|
||||
$this->error=true;
|
||||
$this->mensajeError='No pudo ejecutar la petición: '.$comando;
|
||||
return false;
|
||||
}
|
||||
$numero = $peticion->fetch_row();
|
||||
return $numero[0] ;
|
||||
}
|
||||
/**
|
||||
* Devuelve la condición de error de la última petición
|
||||
* @return boolean condición de error.
|
||||
|
825
css/bootstrap-datetimepicker.min.js
vendored
825
css/bootstrap-datetimepicker.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -226,4 +226,5 @@
|
||||
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
||||
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
</defs>
|
||||
</svg>
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 64 KiB |
344
css/bootstrap/js/bootstrap.js
vendored
344
css/bootstrap/js/bootstrap.js
vendored
@@ -4,7 +4,9 @@
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
|
||||
if (typeof jQuery === 'undefined') {
|
||||
throw new Error('Bootstrap\'s JavaScript requires jQuery')
|
||||
}
|
||||
|
||||
/* ========================================================================
|
||||
* Bootstrap: transition.js v3.1.1
|
||||
@@ -43,8 +45,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
// http://blog.alexmaccaw.com/css-transitions
|
||||
$.fn.emulateTransitionEnd = function(duration) {
|
||||
var called = false, $el = this
|
||||
$(this).one($.support.transition.end, function () { called = true })
|
||||
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
|
||||
$(this).one($.support.transition.end, function() {
|
||||
called = true
|
||||
})
|
||||
var callback = function() {
|
||||
if (!called)
|
||||
$($el).trigger($.support.transition.end)
|
||||
}
|
||||
setTimeout(callback, duration)
|
||||
return this
|
||||
}
|
||||
@@ -86,7 +93,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
var $parent = $(selector)
|
||||
|
||||
if (e) e.preventDefault()
|
||||
if (e)
|
||||
e.preventDefault()
|
||||
|
||||
if (!$parent.length) {
|
||||
$parent = $this.hasClass('alert') ? $this : $this.parent()
|
||||
@@ -94,7 +102,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
$parent.trigger(e = $.Event('close.bs.alert'))
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
$parent.removeClass('in')
|
||||
|
||||
@@ -120,8 +129,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $this = $(this)
|
||||
var data = $this.data('bs.alert')
|
||||
|
||||
if (!data) $this.data('bs.alert', (data = new Alert(this)))
|
||||
if (typeof option == 'string') data[option].call($this)
|
||||
if (!data)
|
||||
$this.data('bs.alert', (data = new Alert(this)))
|
||||
if (typeof option == 'string')
|
||||
data[option].call($this)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -177,7 +188,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
state = state + 'Text'
|
||||
|
||||
if (!data.resetText) $el.data('resetText', $el[val]())
|
||||
if (!data.resetText)
|
||||
$el.data('resetText', $el[val]())
|
||||
|
||||
$el[val](data[state] || this.options[state])
|
||||
|
||||
@@ -200,13 +212,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
if ($parent.length) {
|
||||
var $input = this.$element.find('input')
|
||||
if ($input.prop('type') == 'radio') {
|
||||
if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
|
||||
else $parent.find('.active').removeClass('active')
|
||||
if ($input.prop('checked') && this.$element.hasClass('active'))
|
||||
changed = false
|
||||
else
|
||||
$parent.find('.active').removeClass('active')
|
||||
}
|
||||
if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
|
||||
if (changed)
|
||||
$input.prop('checked', !this.$element.hasClass('active')).trigger('change')
|
||||
}
|
||||
|
||||
if (changed) this.$element.toggleClass('active')
|
||||
if (changed)
|
||||
this.$element.toggleClass('active')
|
||||
}
|
||||
|
||||
|
||||
@@ -221,10 +237,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.button')
|
||||
var options = typeof option == 'object' && option
|
||||
|
||||
if (!data) $this.data('bs.button', (data = new Button(this, options)))
|
||||
if (!data)
|
||||
$this.data('bs.button', (data = new Button(this, options)))
|
||||
|
||||
if (option == 'toggle') data.toggle()
|
||||
else if (option) data.setState(option)
|
||||
if (option == 'toggle')
|
||||
data.toggle()
|
||||
else if (option)
|
||||
data.setState(option)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -245,7 +264,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
$(document).on('click.bs.button.data-api', '[data-toggle^=button]', function(e) {
|
||||
var $btn = $(e.target)
|
||||
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
|
||||
if (!$btn.hasClass('btn'))
|
||||
$btn = $btn.closest('.btn')
|
||||
$btn.button('toggle')
|
||||
e.preventDefault()
|
||||
})
|
||||
@@ -311,10 +331,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var that = this
|
||||
var activeIndex = this.getActiveIndex()
|
||||
|
||||
if (pos > (this.$items.length - 1) || pos < 0) return
|
||||
if (pos > (this.$items.length - 1) || pos < 0)
|
||||
return
|
||||
|
||||
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
|
||||
if (activeIndex == pos) return this.pause().cycle()
|
||||
if (this.sliding)
|
||||
return this.$element.one('slid.bs.carousel', function() {
|
||||
that.to(pos)
|
||||
})
|
||||
if (activeIndex == pos)
|
||||
return this.pause().cycle()
|
||||
|
||||
return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
|
||||
}
|
||||
@@ -333,12 +358,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Carousel.prototype.next = function() {
|
||||
if (this.sliding) return
|
||||
if (this.sliding)
|
||||
return
|
||||
return this.slide('next')
|
||||
}
|
||||
|
||||
Carousel.prototype.prev = function() {
|
||||
if (this.sliding) return
|
||||
if (this.sliding)
|
||||
return
|
||||
return this.slide('prev')
|
||||
}
|
||||
|
||||
@@ -351,15 +378,18 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var that = this
|
||||
|
||||
if (!$next.length) {
|
||||
if (!this.options.wrap) return
|
||||
if (!this.options.wrap)
|
||||
return
|
||||
$next = this.$element.find('.item')[fallback]()
|
||||
}
|
||||
|
||||
if ($next.hasClass('active')) return this.sliding = false
|
||||
if ($next.hasClass('active'))
|
||||
return this.sliding = false
|
||||
|
||||
var e = $.Event('slide.bs.carousel', {relatedTarget: $next[0], direction: direction})
|
||||
this.$element.trigger(e)
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
this.sliding = true
|
||||
|
||||
@@ -383,7 +413,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
$next.removeClass([type, direction].join(' ')).addClass('active')
|
||||
$active.removeClass(['active', direction].join(' '))
|
||||
that.sliding = false
|
||||
setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
|
||||
setTimeout(function() {
|
||||
that.$element.trigger('slid.bs.carousel')
|
||||
}, 0)
|
||||
})
|
||||
.emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
|
||||
} else {
|
||||
@@ -411,10 +443,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||
var action = typeof option == 'string' ? option : options.slide
|
||||
|
||||
if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
|
||||
if (typeof option == 'number') data.to(option)
|
||||
else if (action) data[action]()
|
||||
else if (options.interval) data.pause().cycle()
|
||||
if (!data)
|
||||
$this.data('bs.carousel', (data = new Carousel(this, options)))
|
||||
if (typeof option == 'number')
|
||||
data.to(option)
|
||||
else if (action)
|
||||
data[action]()
|
||||
else if (options.interval)
|
||||
data.pause().cycle()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -438,7 +474,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
||||
var options = $.extend({}, $target.data(), $this.data())
|
||||
var slideIndex = $this.attr('data-slide-to')
|
||||
if (slideIndex) options.interval = false
|
||||
if (slideIndex)
|
||||
options.interval = false
|
||||
|
||||
$target.carousel(options)
|
||||
|
||||
@@ -478,8 +515,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
this.options = $.extend({}, Collapse.DEFAULTS, options)
|
||||
this.transitioning = null
|
||||
|
||||
if (this.options.parent) this.$parent = $(this.options.parent)
|
||||
if (this.options.toggle) this.toggle()
|
||||
if (this.options.parent)
|
||||
this.$parent = $(this.options.parent)
|
||||
if (this.options.toggle)
|
||||
this.toggle()
|
||||
}
|
||||
|
||||
Collapse.DEFAULTS = {
|
||||
@@ -492,17 +531,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Collapse.prototype.show = function() {
|
||||
if (this.transitioning || this.$element.hasClass('in')) return
|
||||
if (this.transitioning || this.$element.hasClass('in'))
|
||||
return
|
||||
|
||||
var startEvent = $.Event('show.bs.collapse')
|
||||
this.$element.trigger(startEvent)
|
||||
if (startEvent.isDefaultPrevented()) return
|
||||
if (startEvent.isDefaultPrevented())
|
||||
return
|
||||
|
||||
var actives = this.$parent && this.$parent.find('> .panel > .in')
|
||||
|
||||
if (actives && actives.length) {
|
||||
var hasData = actives.data('bs.collapse')
|
||||
if (hasData && hasData.transitioning) return
|
||||
if (hasData && hasData.transitioning)
|
||||
return
|
||||
actives.collapse('hide')
|
||||
hasData || actives.data('bs.collapse', null)
|
||||
}
|
||||
@@ -525,7 +567,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
this.$element.trigger('shown.bs.collapse')
|
||||
}
|
||||
|
||||
if (!$.support.transition) return complete.call(this)
|
||||
if (!$.support.transition)
|
||||
return complete.call(this)
|
||||
|
||||
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
|
||||
|
||||
@@ -536,11 +579,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Collapse.prototype.hide = function() {
|
||||
if (this.transitioning || !this.$element.hasClass('in')) return
|
||||
if (this.transitioning || !this.$element.hasClass('in'))
|
||||
return
|
||||
|
||||
var startEvent = $.Event('hide.bs.collapse')
|
||||
this.$element.trigger(startEvent)
|
||||
if (startEvent.isDefaultPrevented()) return
|
||||
if (startEvent.isDefaultPrevented())
|
||||
return
|
||||
|
||||
var dimension = this.dimension()
|
||||
|
||||
@@ -563,7 +608,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
.addClass('collapse')
|
||||
}
|
||||
|
||||
if (!$.support.transition) return complete.call(this)
|
||||
if (!$.support.transition)
|
||||
return complete.call(this)
|
||||
|
||||
this.$element
|
||||
[dimension](0)
|
||||
@@ -587,9 +633,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.collapse')
|
||||
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||
|
||||
if (!data && options.toggle && option == 'show') option = !option
|
||||
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data && options.toggle && option == 'show')
|
||||
option = !option
|
||||
if (!data)
|
||||
$this.data('bs.collapse', (data = new Collapse(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -620,7 +669,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $parent = parent && $(parent)
|
||||
|
||||
if (!data || !data.transitioning) {
|
||||
if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
|
||||
if ($parent)
|
||||
$parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
|
||||
$this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
|
||||
}
|
||||
|
||||
@@ -653,7 +703,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
Dropdown.prototype.toggle = function(e) {
|
||||
var $this = $(this)
|
||||
|
||||
if ($this.is('.disabled, :disabled')) return
|
||||
if ($this.is('.disabled, :disabled'))
|
||||
return
|
||||
|
||||
var $parent = getParent($this)
|
||||
var isActive = $parent.hasClass('open')
|
||||
@@ -669,7 +720,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var relatedTarget = {relatedTarget: this}
|
||||
$parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
$parent
|
||||
.toggleClass('open')
|
||||
@@ -682,33 +734,40 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Dropdown.prototype.keydown = function(e) {
|
||||
if (!/(38|40|27)/.test(e.keyCode)) return
|
||||
if (!/(38|40|27)/.test(e.keyCode))
|
||||
return
|
||||
|
||||
var $this = $(this)
|
||||
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
|
||||
if ($this.is('.disabled, :disabled')) return
|
||||
if ($this.is('.disabled, :disabled'))
|
||||
return
|
||||
|
||||
var $parent = getParent($this)
|
||||
var isActive = $parent.hasClass('open')
|
||||
|
||||
if (!isActive || (isActive && e.keyCode == 27)) {
|
||||
if (e.which == 27) $parent.find(toggle).focus()
|
||||
if (e.which == 27)
|
||||
$parent.find(toggle).focus()
|
||||
return $this.click()
|
||||
}
|
||||
|
||||
var desc = ' li:not(.divider):visible a'
|
||||
var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
|
||||
|
||||
if (!$items.length) return
|
||||
if (!$items.length)
|
||||
return
|
||||
|
||||
var index = $items.index($items.filter(':focus'))
|
||||
|
||||
if (e.keyCode == 38 && index > 0) index-- // up
|
||||
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
|
||||
if (!~index) index = 0
|
||||
if (e.keyCode == 38 && index > 0)
|
||||
index-- // up
|
||||
if (e.keyCode == 40 && index < $items.length - 1)
|
||||
index++ // down
|
||||
if (!~index)
|
||||
index = 0
|
||||
|
||||
$items.eq(index).focus()
|
||||
}
|
||||
@@ -718,9 +777,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
$(toggle).each(function() {
|
||||
var $parent = getParent($(this))
|
||||
var relatedTarget = {relatedTarget: this}
|
||||
if (!$parent.hasClass('open')) return
|
||||
if (!$parent.hasClass('open'))
|
||||
return
|
||||
$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
$parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
|
||||
})
|
||||
}
|
||||
@@ -749,8 +810,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $this = $(this)
|
||||
var data = $this.data('bs.dropdown')
|
||||
|
||||
if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
|
||||
if (typeof option == 'string') data[option].call($this)
|
||||
if (!data)
|
||||
$this.data('bs.dropdown', (data = new Dropdown(this)))
|
||||
if (typeof option == 'string')
|
||||
data[option].call($this)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -771,7 +834,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
$(document)
|
||||
.on('click.bs.dropdown.data-api', clearMenus)
|
||||
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
|
||||
.on('click.bs.dropdown.data-api', '.dropdown form', function(e) {
|
||||
e.stopPropagation()
|
||||
})
|
||||
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
|
||||
.on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
|
||||
|
||||
@@ -823,7 +888,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
this.$element.trigger(e)
|
||||
|
||||
if (this.isShown || e.isDefaultPrevented()) return
|
||||
if (this.isShown || e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
this.isShown = true
|
||||
|
||||
@@ -865,13 +931,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Modal.prototype.hide = function(e) {
|
||||
if (e) e.preventDefault()
|
||||
if (e)
|
||||
e.preventDefault()
|
||||
|
||||
e = $.Event('hide.bs.modal')
|
||||
|
||||
this.$element.trigger(e)
|
||||
|
||||
if (!this.isShown || e.isDefaultPrevented()) return
|
||||
if (!this.isShown || e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
this.isShown = false
|
||||
|
||||
@@ -935,17 +1003,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
.appendTo(document.body)
|
||||
|
||||
this.$element.on('click.dismiss.bs.modal', $.proxy(function(e) {
|
||||
if (e.target !== e.currentTarget) return
|
||||
if (e.target !== e.currentTarget)
|
||||
return
|
||||
this.options.backdrop == 'static'
|
||||
? this.$element[0].focus.call(this.$element[0])
|
||||
: this.hide.call(this)
|
||||
}, this))
|
||||
|
||||
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
||||
if (doAnimate)
|
||||
this.$backdrop[0].offsetWidth // force reflow
|
||||
|
||||
this.$backdrop.addClass('in')
|
||||
|
||||
if (!callback) return
|
||||
if (!callback)
|
||||
return
|
||||
|
||||
doAnimate ?
|
||||
this.$backdrop
|
||||
@@ -979,9 +1050,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.modal')
|
||||
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||
|
||||
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
|
||||
if (typeof option == 'string') data[option](_relatedTarget)
|
||||
else if (options.show) data.show(_relatedTarget)
|
||||
if (!data)
|
||||
$this.data('bs.modal', (data = new Modal(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option](_relatedTarget)
|
||||
else if (options.show)
|
||||
data.show(_relatedTarget)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1006,7 +1080,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
|
||||
var option = $target.data('bs.modal') ? 'toggle' : $.extend({remote: !/#/.test(href) && href}, $target.data(), $this.data())
|
||||
|
||||
if ($this.is('a')) e.preventDefault()
|
||||
if ($this.is('a'))
|
||||
e.preventDefault()
|
||||
|
||||
$target
|
||||
.modal(option, this)
|
||||
@@ -1016,8 +1091,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
})
|
||||
|
||||
$(document)
|
||||
.on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
|
||||
.on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
|
||||
.on('show.bs.modal', '.modal', function() {
|
||||
$(document.body).addClass('modal-open')
|
||||
})
|
||||
.on('hidden.bs.modal', '.modal', function() {
|
||||
$(document.body).removeClass('modal-open')
|
||||
})
|
||||
|
||||
}(jQuery);
|
||||
|
||||
@@ -1109,7 +1188,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var defaults = this.getDefaults()
|
||||
|
||||
this._options && $.each(this._options, function(key, value) {
|
||||
if (defaults[key] != value) options[key] = value
|
||||
if (defaults[key] != value)
|
||||
options[key] = value
|
||||
})
|
||||
|
||||
return options
|
||||
@@ -1123,10 +1203,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
self.hoverState = 'in'
|
||||
|
||||
if (!self.options.delay || !self.options.delay.show) return self.show()
|
||||
if (!self.options.delay || !self.options.delay.show)
|
||||
return self.show()
|
||||
|
||||
self.timeout = setTimeout(function() {
|
||||
if (self.hoverState == 'in') self.show()
|
||||
if (self.hoverState == 'in')
|
||||
self.show()
|
||||
}, self.options.delay.show)
|
||||
}
|
||||
|
||||
@@ -1138,10 +1220,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
self.hoverState = 'out'
|
||||
|
||||
if (!self.options.delay || !self.options.delay.hide) return self.hide()
|
||||
if (!self.options.delay || !self.options.delay.hide)
|
||||
return self.hide()
|
||||
|
||||
self.timeout = setTimeout(function() {
|
||||
if (self.hoverState == 'out') self.hide()
|
||||
if (self.hoverState == 'out')
|
||||
self.hide()
|
||||
}, self.options.delay.hide)
|
||||
}
|
||||
|
||||
@@ -1151,14 +1235,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
if (this.hasContent() && this.enabled) {
|
||||
this.$element.trigger(e)
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
var that = this;
|
||||
|
||||
var $tip = this.tip()
|
||||
|
||||
this.setContent()
|
||||
|
||||
if (this.options.animation) $tip.addClass('fade')
|
||||
if (this.options.animation)
|
||||
$tip.addClass('fade')
|
||||
|
||||
var placement = typeof this.options.placement == 'function' ?
|
||||
this.options.placement.call(this, $tip[0], this.$element[0]) :
|
||||
@@ -1166,7 +1252,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
var autoToken = /\s?auto?\s?/i
|
||||
var autoPlace = autoToken.test(placement)
|
||||
if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
|
||||
if (autoPlace)
|
||||
placement = placement.replace(autoToken, '') || 'top'
|
||||
|
||||
$tip
|
||||
.detach()
|
||||
@@ -1227,8 +1314,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var marginLeft = parseInt($tip.css('margin-left'), 10)
|
||||
|
||||
// we must check for NaN for ie 8/9
|
||||
if (isNaN(marginTop)) marginTop = 0
|
||||
if (isNaN(marginLeft)) marginLeft = 0
|
||||
if (isNaN(marginTop))
|
||||
marginTop = 0
|
||||
if (isNaN(marginLeft))
|
||||
marginLeft = 0
|
||||
|
||||
offset.top = offset.top + marginTop
|
||||
offset.left = offset.left + marginLeft
|
||||
@@ -1273,7 +1362,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
this.replaceArrow(actualHeight - height, actualHeight, 'top')
|
||||
}
|
||||
|
||||
if (replace) $tip.offset(offset)
|
||||
if (replace)
|
||||
$tip.offset(offset)
|
||||
}
|
||||
|
||||
Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
|
||||
@@ -1294,13 +1384,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var e = $.Event('hide.bs.' + this.type)
|
||||
|
||||
function complete() {
|
||||
if (that.hoverState != 'in') $tip.detach()
|
||||
if (that.hoverState != 'in')
|
||||
$tip.detach()
|
||||
that.$element.trigger('hidden.bs.' + that.type)
|
||||
}
|
||||
|
||||
this.$element.trigger(e)
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
$tip.removeClass('in')
|
||||
|
||||
@@ -1402,9 +1494,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.tooltip')
|
||||
var options = typeof option == 'object' && option
|
||||
|
||||
if (!data && option == 'destroy') return
|
||||
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data && option == 'destroy')
|
||||
return
|
||||
if (!data)
|
||||
$this.data('bs.tooltip', (data = new Tooltip(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1440,7 +1535,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
this.init('popover', element, options)
|
||||
}
|
||||
|
||||
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
|
||||
if (!$.fn.tooltip)
|
||||
throw new Error('Popover requires tooltip.js')
|
||||
|
||||
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
|
||||
placement: 'right',
|
||||
@@ -1475,7 +1571,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
|
||||
// this manually by checking the contents.
|
||||
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
|
||||
if (!$tip.find('.popover-title').html())
|
||||
$tip.find('.popover-title').hide()
|
||||
}
|
||||
|
||||
Popover.prototype.hasContent = function() {
|
||||
@@ -1497,7 +1594,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Popover.prototype.tip = function() {
|
||||
if (!this.$tip) this.$tip = $(this.options.template)
|
||||
if (!this.$tip)
|
||||
this.$tip = $(this.options.template)
|
||||
return this.$tip
|
||||
}
|
||||
|
||||
@@ -1513,9 +1611,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.popover')
|
||||
var options = typeof option == 'object' && option
|
||||
|
||||
if (!data && option == 'destroy') return
|
||||
if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data && option == 'destroy')
|
||||
return
|
||||
if (!data)
|
||||
$this.data('bs.popover', (data = new Popover(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1589,7 +1690,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
&& $href.is(':visible')
|
||||
&& [[$href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href]]) || null
|
||||
})
|
||||
.sort(function (a, b) { return a[0] - b[0] })
|
||||
.sort(function(a, b) {
|
||||
return a[0] - b[0]
|
||||
})
|
||||
.each(function() {
|
||||
self.offsets.push(this[0])
|
||||
self.targets.push(this[1])
|
||||
@@ -1657,8 +1760,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.scrollspy')
|
||||
var options = typeof option == 'object' && option
|
||||
|
||||
if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data)
|
||||
$this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1715,7 +1820,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
||||
}
|
||||
|
||||
if ($this.parent('li').hasClass('active')) return
|
||||
if ($this.parent('li').hasClass('active'))
|
||||
return
|
||||
|
||||
var previous = $ul.find('.active:last a')[0]
|
||||
var e = $.Event('show.bs.tab', {
|
||||
@@ -1724,7 +1830,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
$this.trigger(e)
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
var $target = $(selector)
|
||||
|
||||
@@ -1785,8 +1892,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var $this = $(this)
|
||||
var data = $this.data('bs.tab')
|
||||
|
||||
if (!data) $this.data('bs.tab', (data = new Tab(this)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data)
|
||||
$this.data('bs.tab', (data = new Tab(this)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1848,7 +1957,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Affix.prototype.getPinnedOffset = function() {
|
||||
if (this.pinnedOffset) return this.pinnedOffset
|
||||
if (this.pinnedOffset)
|
||||
return this.pinnedOffset
|
||||
this.$element.removeClass(Affix.RESET).addClass('affix')
|
||||
var scrollTop = this.$window.scrollTop()
|
||||
var position = this.$element.offset()
|
||||
@@ -1860,7 +1970,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
}
|
||||
|
||||
Affix.prototype.checkPosition = function() {
|
||||
if (!this.$element.is(':visible')) return
|
||||
if (!this.$element.is(':visible'))
|
||||
return
|
||||
|
||||
var scrollHeight = $(document).height()
|
||||
var scrollTop = this.$window.scrollTop()
|
||||
@@ -1869,25 +1980,32 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var offsetTop = offset.top
|
||||
var offsetBottom = offset.bottom
|
||||
|
||||
if (this.affixed == 'top') position.top += scrollTop
|
||||
if (this.affixed == 'top')
|
||||
position.top += scrollTop
|
||||
|
||||
if (typeof offset != 'object') offsetBottom = offsetTop = offset
|
||||
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
|
||||
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
|
||||
if (typeof offset != 'object')
|
||||
offsetBottom = offsetTop = offset
|
||||
if (typeof offsetTop == 'function')
|
||||
offsetTop = offset.top(this.$element)
|
||||
if (typeof offsetBottom == 'function')
|
||||
offsetBottom = offset.bottom(this.$element)
|
||||
|
||||
var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
|
||||
offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
|
||||
offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
|
||||
|
||||
if (this.affixed === affix) return
|
||||
if (this.unpin) this.$element.css('top', '')
|
||||
if (this.affixed === affix)
|
||||
return
|
||||
if (this.unpin)
|
||||
this.$element.css('top', '')
|
||||
|
||||
var affixType = 'affix' + (affix ? '-' + affix : '')
|
||||
var e = $.Event(affixType + '.bs.affix')
|
||||
|
||||
this.$element.trigger(e)
|
||||
|
||||
if (e.isDefaultPrevented()) return
|
||||
if (e.isDefaultPrevented())
|
||||
return
|
||||
|
||||
this.affixed = affix
|
||||
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
|
||||
@@ -1914,8 +2032,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
var data = $this.data('bs.affix')
|
||||
var options = typeof option == 'object' && option
|
||||
|
||||
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
if (!data)
|
||||
$this.data('bs.affix', (data = new Affix(this, options)))
|
||||
if (typeof option == 'string')
|
||||
data[option]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1941,8 +2061,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
|
||||
|
||||
data.offset = data.offset || {}
|
||||
|
||||
if (data.offsetBottom) data.offset.bottom = data.offsetBottom
|
||||
if (data.offsetTop) data.offset.top = data.offsetTop
|
||||
if (data.offsetBottom)
|
||||
data.offset.bottom = data.offsetBottom
|
||||
if (data.offsetTop)
|
||||
data.offset.top = data.offsetTop
|
||||
|
||||
$spy.affix(data)
|
||||
})
|
||||
|
584
css/bootstrap/js/bootstrap.min.js
vendored
584
css/bootstrap/js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
2309
css/jquery.min.js
vendored
2309
css/jquery.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -22,7 +22,6 @@
|
||||
*/
|
||||
SimpleColorPicker.prototype = {
|
||||
constructor: SimpleColorPicker,
|
||||
|
||||
init: function(type, select, options) {
|
||||
var self = this;
|
||||
|
||||
@@ -103,7 +102,6 @@
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Changes the selected color.
|
||||
*
|
||||
@@ -122,7 +120,6 @@
|
||||
console.error("The given color '" + color + "' could not be found");
|
||||
}
|
||||
},
|
||||
|
||||
showPicker: function() {
|
||||
var pos = this.$icon.offset();
|
||||
this.$picker.css({
|
||||
@@ -133,11 +130,9 @@
|
||||
|
||||
this.$picker.show(this.options.pickerDelay);
|
||||
},
|
||||
|
||||
hidePicker: function() {
|
||||
this.$picker.hide(this.options.pickerDelay);
|
||||
},
|
||||
|
||||
/**
|
||||
* Selects the given span inside $colorList.
|
||||
*
|
||||
@@ -161,7 +156,6 @@
|
||||
// Change HTML select value
|
||||
this.$select.val(color);
|
||||
},
|
||||
|
||||
/**
|
||||
* The user clicked on a color inside $colorList.
|
||||
*/
|
||||
@@ -172,7 +166,6 @@
|
||||
this.$select.trigger('change');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Prevents the mousedown event from "eating" the click event.
|
||||
*/
|
||||
@@ -180,7 +173,6 @@
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this.options.picker === true) {
|
||||
this.$icon.off('.' + this.type);
|
||||
@@ -224,10 +216,8 @@
|
||||
$.fn.simplecolorpicker.defaults = {
|
||||
// No theme by default
|
||||
theme: '',
|
||||
|
||||
// Show the picker or make it inline
|
||||
picker: false,
|
||||
|
||||
// Animation delay in milliseconds
|
||||
pickerDelay: 0
|
||||
};
|
||||
|
794
css/moment.min.js
vendored
794
css/moment.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Courier';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Courier-Bold';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Courier-BoldOblique';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Courier-Oblique';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Helvetica';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Helvetica-Bold';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Helvetica-BoldOblique';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Helvetica-Oblique';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/* * *****************************************************************************
|
||||
* Utility to generate font definition files *
|
||||
* *
|
||||
@@ -15,18 +16,15 @@ function ReadMap($enc)
|
||||
if (empty($a))
|
||||
die('<b>Error:</b> encoding not found: ' . $enc);
|
||||
$cc2gn = array();
|
||||
foreach($a as $l)
|
||||
{
|
||||
if($l[0]=='!')
|
||||
{
|
||||
foreach ($a as $l) {
|
||||
if ($l[0] == '!') {
|
||||
$e = preg_split('/[ \\t]+/', rtrim($l));
|
||||
$cc = hexdec(substr($e[0], 1));
|
||||
$gn = $e[2];
|
||||
$cc2gn[$cc] = $gn;
|
||||
}
|
||||
}
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
for ($i = 0; $i <= 255; $i++) {
|
||||
if (!isset($cc2gn[$i]))
|
||||
$cc2gn[$i] = '.notdef';
|
||||
}
|
||||
@@ -49,37 +47,30 @@ function ReadAFM($file, &$map)
|
||||
'Tcedilla' => 'Tcommaaccent', 'tcedilla' => 'tcommaaccent', 'Dslash' => 'Dcroat', 'dslash' => 'dcroat', 'Dmacron' => 'Dcroat', 'dmacron' => 'dcroat',
|
||||
'combininggraveaccent' => 'gravecomb', 'combininghookabove' => 'hookabovecomb', 'combiningtildeaccent' => 'tildecomb',
|
||||
'combiningacuteaccent' => 'acutecomb', 'combiningdotbelow' => 'dotbelowcomb', 'dongsign' => 'dong');
|
||||
foreach($a as $l)
|
||||
{
|
||||
foreach ($a as $l) {
|
||||
$e = explode(' ', rtrim($l));
|
||||
if (count($e) < 2)
|
||||
continue;
|
||||
$code = $e[0];
|
||||
$param = $e[1];
|
||||
if($code=='C')
|
||||
{
|
||||
if ($code == 'C') {
|
||||
//Character metrics
|
||||
$cc = (int) $e[1];
|
||||
$w = $e[4];
|
||||
$gn = $e[7];
|
||||
if (substr($gn, -4) == '20AC')
|
||||
$gn = 'Euro';
|
||||
if(isset($fix[$gn]))
|
||||
{
|
||||
if (isset($fix[$gn])) {
|
||||
//Fix incorrect glyph name
|
||||
foreach($map as $c=>$n)
|
||||
{
|
||||
foreach ($map as $c => $n) {
|
||||
if ($n == $fix[$gn])
|
||||
$map[$c] = $gn;
|
||||
}
|
||||
}
|
||||
if(empty($map))
|
||||
{
|
||||
if (empty($map)) {
|
||||
//Symbolic font: use built-in encoding
|
||||
$widths[$cc] = $w;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
$widths[$gn] = $w;
|
||||
if ($gn == 'X')
|
||||
$fm['CapXHeight'] = $e[13];
|
||||
@@ -112,17 +103,14 @@ function ReadAFM($file, &$map)
|
||||
}
|
||||
if (!isset($fm['FontName']))
|
||||
die('FontName not found');
|
||||
if(!empty($map))
|
||||
{
|
||||
if (!empty($map)) {
|
||||
if (!isset($widths['.notdef']))
|
||||
$widths['.notdef'] = 600;
|
||||
if (!isset($widths['Delta']) && isset($widths['increment']))
|
||||
$widths['Delta'] = $widths['increment'];
|
||||
//Order widths according to map
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
if(!isset($widths[$map[$i]]))
|
||||
{
|
||||
for ($i = 0; $i <= 255; $i++) {
|
||||
if (!isset($widths[$map[$i]])) {
|
||||
echo '<b>Warning:</b> character ' . $map[$i] . ' is missing<br>';
|
||||
$widths[$i] = $widths['.notdef'];
|
||||
}
|
||||
@@ -190,8 +178,7 @@ function MakeWidthArray($fm)
|
||||
//Make character width array
|
||||
$s = "array(\n\t";
|
||||
$cw = $fm['Widths'];
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
for ($i = 0; $i <= 255; $i++) {
|
||||
if (chr($i) == "'")
|
||||
$s.="'\\''";
|
||||
elseif (chr($i) == "\\")
|
||||
@@ -216,10 +203,8 @@ function MakeFontEncoding($map)
|
||||
$ref = ReadMap('cp1252');
|
||||
$s = '';
|
||||
$last = 0;
|
||||
for($i=32;$i<=255;$i++)
|
||||
{
|
||||
if($map[$i]!=$ref[$i])
|
||||
{
|
||||
for ($i = 32; $i <= 255; $i++) {
|
||||
if ($map[$i] != $ref[$i]) {
|
||||
if ($i != $last + 1)
|
||||
$s.=$i . ' ';
|
||||
$last = $i;
|
||||
@@ -262,17 +247,14 @@ function CheckTTF($file)
|
||||
fseek($f, 6, SEEK_CUR);
|
||||
//Seek OS/2 table
|
||||
$found = false;
|
||||
for($i=0;$i<$nb;$i++)
|
||||
{
|
||||
if(fread($f,4)=='OS/2')
|
||||
{
|
||||
for ($i = 0; $i < $nb; $i++) {
|
||||
if (fread($f, 4) == 'OS/2') {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
fseek($f, 12, SEEK_CUR);
|
||||
}
|
||||
if(!$found)
|
||||
{
|
||||
if (!$found) {
|
||||
fclose($f);
|
||||
return;
|
||||
}
|
||||
@@ -297,14 +279,14 @@ function CheckTTF($file)
|
||||
* patch: optional patch for encoding *
|
||||
* type: font type if fontfile is empty *
|
||||
* ***************************************************************************** */
|
||||
|
||||
function MakeFont($fontfile, $afmfile, $enc = 'cp1252', $patch = array(), $type = 'TrueType')
|
||||
{
|
||||
//Generate a font definition file
|
||||
if (get_magic_quotes_runtime())
|
||||
@set_magic_quotes_runtime(0);
|
||||
ini_set('auto_detect_line_endings', '1');
|
||||
if($enc)
|
||||
{
|
||||
if ($enc) {
|
||||
$map = ReadMap($enc);
|
||||
foreach ($patch as $cc => $gn)
|
||||
$map[$cc] = $gn;
|
||||
@@ -320,8 +302,7 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
$diff = '';
|
||||
$fd = MakeFontDescriptor($fm, empty($map));
|
||||
//Find font type
|
||||
if($fontfile)
|
||||
{
|
||||
if ($fontfile) {
|
||||
$ext = strtolower(substr($fontfile, -3));
|
||||
if ($ext == 'ttf')
|
||||
$type = 'TrueType';
|
||||
@@ -330,8 +311,7 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
else
|
||||
die('<b>Error:</b> unrecognized font file extension: ' . $ext);
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
if ($type != 'TrueType' && $type != 'Type1')
|
||||
die('<b>Error:</b> incorrect font type: ' . $type);
|
||||
}
|
||||
@@ -351,8 +331,7 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
$s.='$enc=\'' . $enc . "';\n";
|
||||
$s.='$diff=\'' . $diff . "';\n";
|
||||
$basename = substr(basename($afmfile), 0, -4);
|
||||
if($fontfile)
|
||||
{
|
||||
if ($fontfile) {
|
||||
//Embedded font
|
||||
if (!file_exists($fontfile))
|
||||
die('<b>Error:</b> font file not found: ' . $fontfile);
|
||||
@@ -363,12 +342,10 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
die('<b>Error:</b> Can\'t open ' . $fontfile);
|
||||
$file = fread($f, filesize($fontfile));
|
||||
fclose($f);
|
||||
if($type=='Type1')
|
||||
{
|
||||
if ($type == 'Type1') {
|
||||
//Find first two sections and discard third one
|
||||
$header = (ord($file[0]) == 128);
|
||||
if($header)
|
||||
{
|
||||
if ($header) {
|
||||
//Strip first binary header
|
||||
$file = substr($file, 6);
|
||||
}
|
||||
@@ -376,8 +353,7 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
if (!$pos)
|
||||
die('<b>Error:</b> font file does not seem to be valid Type1');
|
||||
$size1 = $pos + 6;
|
||||
if($header && ord($file[$size1])==128)
|
||||
{
|
||||
if ($header && ord($file[$size1]) == 128) {
|
||||
//Strip second binary header
|
||||
$file = substr($file, 0, $size1) . substr($file, $size1 + 6);
|
||||
}
|
||||
@@ -387,28 +363,23 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
$size2 = $pos - $size1;
|
||||
$file = substr($file, 0, $size1 + $size2);
|
||||
}
|
||||
if(function_exists('gzcompress'))
|
||||
{
|
||||
if (function_exists('gzcompress')) {
|
||||
$cmp = $basename . '.z';
|
||||
SaveToFile($cmp, gzcompress($file), 'b');
|
||||
$s.='$file=\'' . $cmp . "';\n";
|
||||
echo 'Font file compressed (' . $cmp . ')<br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
$s.='$file=\'' . basename($fontfile) . "';\n";
|
||||
echo '<b>Notice:</b> font file could not be compressed (zlib extension not available)<br>';
|
||||
}
|
||||
if($type=='Type1')
|
||||
{
|
||||
if ($type == 'Type1') {
|
||||
$s.='$size1=' . $size1 . ";\n";
|
||||
$s.='$size2=' . $size2 . ";\n";
|
||||
}
|
||||
else
|
||||
$s.='$originalsize=' . filesize($fontfile) . ";\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
//Not embedded font
|
||||
$s.='$file=' . "'';\n";
|
||||
}
|
||||
@@ -416,4 +387,5 @@ function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='Tru
|
||||
SaveToFile($basename . '.php', $s, 't');
|
||||
echo 'Font definition file generated (' . $basename . '.php' . ')<br>';
|
||||
}
|
||||
|
||||
?>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Symbol';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Times-Roman';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Times-Bold';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Times-BoldItalic';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'Times-Italic';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$type = 'Core';
|
||||
$name = 'ZapfDingbats';
|
||||
$up = -100;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Fichero de configuración donde se introducirán los valores para
|
||||
* la conexión con el servidor MySQL y otros para personalizar la aplicación.
|
||||
|
@@ -16,7 +16,8 @@ class ConfiguracionTest extends PHPUnit_Framework_TestCase {
|
||||
* Sets up the fixture, for example, opens a network connection.
|
||||
* This method is called before a test is executed.
|
||||
*/
|
||||
protected function setUp() {
|
||||
protected function setUp()
|
||||
{
|
||||
$this->config = new Configuracion;
|
||||
}
|
||||
|
||||
@@ -24,14 +25,16 @@ class ConfiguracionTest extends PHPUnit_Framework_TestCase {
|
||||
* Tears down the fixture, for example, closes a network connection.
|
||||
* This method is called after a test is executed.
|
||||
*/
|
||||
protected function tearDown() {
|
||||
protected function tearDown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Configuracion::ejecuta
|
||||
*/
|
||||
public function testEjecuta() {
|
||||
public function testEjecuta()
|
||||
{
|
||||
$this->assertFileExists('inc/Configuracion.inc', "El fichero de configuración no existe");
|
||||
$permisos = fileperms('inc/Configuracion.inc');
|
||||
//Comprueba que el propietario o el grupo tengan derecho de escritura
|
||||
@@ -68,4 +71,5 @@ class ConfiguracionTest extends PHPUnit_Framework_TestCase {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@@ -1,11 +1,12 @@
|
||||
<?php
|
||||
|
||||
require_once('Menu.php');
|
||||
|
||||
/**
|
||||
* Generated by PHPUnit_SkeletonGenerator 1.2.1 on 2014-03-08 at 17:47:42.
|
||||
*/
|
||||
class MenuTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
class MenuTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var Menu
|
||||
*/
|
||||
@@ -26,6 +27,7 @@ class MenuTest extends PHPUnit_Framework_TestCase
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,5 +41,7 @@ class MenuTest extends PHPUnit_Framework_TestCase
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
require_once('inc/configuracion.inc');
|
||||
require_once('Sql.php');
|
||||
|
||||
/**
|
||||
* Generated by PHPUnit_SkeletonGenerator 1.2.1 on 2014-03-08 at 01:19:34.
|
||||
*/
|
||||
class SqlTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
class SqlTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var Sql
|
||||
*/
|
||||
@@ -29,6 +31,7 @@ class SqlTest extends PHPUnit_Framework_TestCase
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -62,8 +65,6 @@ class SqlTest extends PHPUnit_Framework_TestCase
|
||||
public function testEjecuta()
|
||||
{
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -197,5 +198,7 @@ class SqlTest extends PHPUnit_Framework_TestCase
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@@ -2,7 +2,7 @@
|
||||
<Mantenimiento>
|
||||
<Titulo>Mantenimiento de Elementos</Titulo>
|
||||
<Consulta>
|
||||
SELECT E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie,
|
||||
SELECT SQL_CALC_FOUND_ROWS E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie,
|
||||
DATE_FORMAT(E.fechacompra, '%d/%m/%Y') as fechaCompra,E.cantidad as cantidad
|
||||
FROM Elementos E inner join Articulos A on E.id_articulo=A.id inner join
|
||||
Ubicaciones U on E.id_ubicacion=U.id {buscar} {orden} limit {inferior},{superior};
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<Mantenimiento>
|
||||
<Titulo>Mantenimiento de Usuarios</Titulo>
|
||||
<Consulta>
|
||||
SELECT id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config
|
||||
SELECT SQL_CALC_FOUND_ROWS id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config
|
||||
FROM Usuarios {buscar} {orden} limit {inferior}, {superior};
|
||||
</Consulta>
|
||||
<Campos>
|
||||
|
Reference in New Issue
Block a user