Skip to content

Commit 42df72c

Browse files
committed
Añadidas listas públicas, archivos y fallos menores de diseño
1 parent ff9f453 commit 42df72c

30 files changed

+1009
-339
lines changed

README.md

+56-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,62 @@
1-
# turiscyl
1+
# TurisCyL
2+
<center><img src="assets/icon/icon.png" width="200"></center>
23

3-
A new Flutter application.
4+
Aplicación Android (versión 4.1 o superior) para consultar la información turística de la comunidad
5+
autónoma de Castilla y León. Concretamente, los lugares que se pueden encontrar son los siguientes:
46

5-
## Getting Started
7+
* Registro de empresas que ofrecen otras actividades turísticas
8+
* Registro de albergues turísticos
9+
* Registro de alojamientos hoteleros
10+
* Registro de apartamentos turísticos
11+
* Registro de bares
12+
* Registro de cafeterías
13+
* Registro de campings
14+
* Relación de eventos de la agenda cultural categorizados y geolocalizados
15+
* Registro de guías de turismo
16+
* Relación de monumentos de Castilla y León
17+
* Directorio de Museos de Castilla y León
18+
* Oficinas de información turística
19+
* Registro de restaurantes
20+
* Registro de salones de banquetes
21+
* Registro de establecimientos de turismo activo
22+
* Registro de establecimientos de turismo rural
23+
* Registro de viviendas de uso turístico
24+
* Directorio de Archivos de Castilla y León
625

7-
This project is a starting point for a Flutter application.
26+
Los datos se han extraído del [portal de Datos Abiertos](https://datosabiertos.jcyl.es) de la
27+
[Junta de Castilla y León](http://www.jcyl.es).
828

9-
A few resources to get you started if this is your first Flutter project:
29+
Permite guardar los distintos lugares en listas para planificar de forma más cómoda y sencilla la
30+
estancia en la comunidad. También es posible guardar los eventos en el calendario para no olvidarlos.
1031

11-
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
12-
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
32+
## Descarga
33+
<a href='https://play.google.com/store/apps/details?id=es.davidpob99.turiscyl&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Disponible en Google Play' src='https://play.google.com/intl/es_es/badges/images/generic/es_badge_web_generic.png' height="80"/></a>
1334

14-
For help getting started with Flutter, view our
15-
[online documentation](https://flutter.dev/docs), which offers tutorials,
16-
samples, guidance on mobile development, and a full API reference.
35+
## Uso
36+
La aplicación se divide en 2 pantallas principalmente (pestañas):
37+
* Pestaña explorar: la principal de la app, la que se inicia una vez se abre
38+
* Pestaña listas: sirve para gestionar las listas de elementos creadas o importadas
39+
40+
### Pestaña explorar
41+
Es la vista dónde se pueden buscar los diferentes lugares turísticos. Para hacer más sencilla la navegación está dividida en diferentes categorías:
42+
* __¿Dónde comer?__: bares, restaurantes, cafeterías y salones de banquetes
43+
* __¿Dónde dormir?__: albergues, alojamientos hoteleros, apartamentos, campings, turismo rural y vivendas de uso turístico
44+
* __¿Qué ver?__: monumentos, museos y archivos
45+
* __¿Qué hacer?__: eventos, actividades turísticas, guías de turismo y turismo activo
46+
* __Oficinas de turismo__
47+
* __Espacios Naturales__: aplicación con información sobre los equipamientos de la Red de Espacios Naturales de Castilla y León [NaturCyL](https://github.com/davidpob99/NaturCyL)
48+
49+
### Pestaña listas
50+
Sirve para gestionar las diferentes listas de lugares creadas o añadidas por el usuario. Es posible añadir listas de cualquiera de los siguientes medios:
51+
* __Crear lista__: crea una lista desde cero, es decir, vacía. Para añadir elementos es necesario, a través de la _Pestaña explorar_, seleccionar cada elemento deseado
52+
* __Listas públicas__: selecciona de una de las listas ya creadas por otros usuarios. Cualquier persona puede participar en este proyecto proponiendo listas para publicarlas a [través del siguiente formulario](https://forms.gle/hBB41WYUSw5FFjf27). Además, las listas públicas son a su vez Datos Abiertos bajo licencia _Creative Commons Attribution 4.0 International_ en formato JSON en el [siguiente enlace](https://api.jsonbin.io/b/5f63489a65b18913fc4dd003/latest)
53+
* __Importar__: es posible añadir listas dado el código JSON de la misma (que se puede generar en el botón _Exportar_ de una lista concreta (3 puntos arriba a la izquierda))
54+
55+
## Capturas de pantalla
56+
<img src="img/capturas/1.png" width="170"/>
57+
<img src="img/capturas/2.png" width="170"/>
58+
<img src="img/capturas/3.png" width="170"/>
59+
<img src="img/capturas/4.png" width="170"/>
60+
61+
## Licencia
62+
La aplicación se distribuye siguiendo la [General Public License de la GNU, versión 3](https://www.gnu.org/licenses/gpl-3.0-standalone.html) o (a su elección) cualquier versión superior.

android/app/release/app-release.aab

209 KB
Binary file not shown.

assets/images/archivo.jpg

132 KB
Loading

assets/images/credits.txt

-26
This file was deleted.

assets/images/monumento.jpg

-3.86 MB
Loading

img/capturas/1.png

704 KB
Loading

img/capturas/2.png

530 KB
Loading

img/capturas/3.png

570 KB
Loading

img/capturas/4.png

296 KB
Loading

lib/crear_lista.dart

+62-64
Original file line numberDiff line numberDiff line change
@@ -33,76 +33,74 @@ class _CrearListaState extends State<CrearLista> {
3333
@override
3434
Widget build(BuildContext context) {
3535
return Scaffold(
36-
appBar: AppBar(
37-
title: Text("Crear lista")
38-
),
39-
body: Padding(
40-
padding: const EdgeInsets.all(10.0),
41-
child: Form(
42-
key: _formKey,
43-
child: Column(
44-
children: <Widget>[
45-
TextFormField(
46-
decoration: InputDecoration(
47-
hintText: "Nombre",
48-
icon: Icon(Icons.title),
49-
contentPadding: new EdgeInsets.all(8.0),
50-
),
51-
validator: (value) {
52-
if (value.isEmpty) {
53-
return 'Introduzca el nombre de la lista';
54-
}
55-
},
56-
onSaved: (val) => setState(() => _lista.nombre = val),
36+
appBar: AppBar(title: Text("Crear lista")),
37+
body: SingleChildScrollView(
38+
child: Padding(
39+
padding: const EdgeInsets.all(10.0),
40+
child: Form(
41+
key: _formKey,
42+
child: Column(children: <Widget>[
43+
TextFormField(
44+
decoration: InputDecoration(
45+
hintText: "Nombre",
46+
icon: Icon(Icons.title),
47+
contentPadding: new EdgeInsets.all(8.0),
5748
),
58-
TextFormField(
59-
decoration: InputDecoration(
60-
hintText: "Autor",
61-
icon: Icon(Icons.person),
62-
contentPadding: new EdgeInsets.all(8.0),
63-
),
64-
onSaved: (val){
65-
setState(() {
66-
if(val == '')
67-
_lista.autor = "Anónimo";
68-
else
69-
_lista.autor = val;
70-
});
71-
},
49+
validator: (value) {
50+
if (value.isEmpty) {
51+
return 'Introduzca el nombre de la lista';
52+
}
53+
},
54+
onSaved: (val) => setState(() => _lista.nombre = val),
55+
),
56+
TextFormField(
57+
decoration: InputDecoration(
58+
hintText: "Autor",
59+
icon: Icon(Icons.person),
60+
contentPadding: new EdgeInsets.all(8.0),
7261
),
73-
Padding(
74-
padding: const EdgeInsets.all(8.0),
75-
child: Text("Si no introduce el nombre del autor figurará como 'Anónimo'",
76-
style: TextStyle(
77-
color: Colors.grey
78-
),),
62+
onSaved: (val) {
63+
setState(() {
64+
if (val == '')
65+
_lista.autor = "Anónimo";
66+
else
67+
_lista.autor = val;
68+
});
69+
},
70+
),
71+
Padding(
72+
padding: const EdgeInsets.all(8.0),
73+
child: Text(
74+
"Si no introduce el nombre del autor figurará como 'Anónimo'",
75+
style: TextStyle(color: Colors.grey),
7976
),
80-
TextFormField(
81-
decoration: InputDecoration(
82-
hintText: "Descripción",
83-
icon: Icon(Icons.short_text),
84-
contentPadding: new EdgeInsets.all(8.0),
85-
),
86-
onSaved: (val) => setState(() => _lista.descripcion = val),
77+
),
78+
TextFormField(
79+
keyboardType: TextInputType.multiline,
80+
minLines: 1,
81+
maxLines: 10000000,
82+
decoration: InputDecoration(
83+
hintText: "Descripción",
84+
icon: Icon(Icons.short_text),
85+
contentPadding: new EdgeInsets.all(8.0),
8786
),
88-
TextFormField(
89-
decoration: InputDecoration(
87+
onSaved: (val) => setState(() => _lista.descripcion = val),
88+
),
89+
TextFormField(
90+
decoration: InputDecoration(
9091
hintText: "Número de días",
9192
icon: Icon(Icons.today),
92-
contentPadding: new EdgeInsets.all(8.0)
93-
),
94-
keyboardType: TextInputType.number,
95-
onSaved: (val) {
96-
try{
97-
_lista.dias = int.parse(val);
98-
} catch(e){
99-
_lista.dias = -1;
100-
}
101-
102-
},
103-
),
104-
]
105-
)
93+
contentPadding: new EdgeInsets.all(8.0)),
94+
keyboardType: TextInputType.number,
95+
onSaved: (val) {
96+
try {
97+
_lista.dias = int.parse(val);
98+
} catch (e) {
99+
_lista.dias = -1;
100+
}
101+
},
102+
),
103+
])),
106104
),
107105
),
108106
floatingActionButton: FloatingActionButton(

lib/db_handler.dart

+9-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'package:turiscyl/models/actividad_turistica.dart';
2121
import 'package:turiscyl/models/albergue.dart';
2222
import 'package:turiscyl/models/alojamiento_hotelero.dart';
2323
import 'package:turiscyl/models/apartamento.dart';
24+
import 'package:turiscyl/models/archivo.dart';
2425
import 'package:turiscyl/models/cafeteria.dart';
2526
import 'package:turiscyl/models/camping.dart';
2627
import 'package:turiscyl/models/evento.dart';
@@ -106,18 +107,22 @@ class DbHandler {
106107
batch.insert(objeto.DB_NOMBRE, Vivienda.fromCsv(datos[i]).toMap());
107108
break;
108109
case Monumento.NOMBRE:
109-
batch.insert(objeto.DB_NOMBRE, Monumento.fromJson(datos[i]).toMap());
110+
batch.insert(
111+
objeto.DB_NOMBRE, Monumento.fromJson(datos[i]).toMap());
110112
break;
111113
case Museo.NOMBRE:
112-
if(i == 1)
113-
break;
114+
if (i == 1) break;
114115
batch.insert(objeto.DB_NOMBRE, Museo.fromCsv(datos[i]).toMap());
115116
break;
117+
case Archivo.NOMBRE:
118+
batch.insert(objeto.DB_NOMBRE, Archivo.fromCsv(datos[i]).toMap());
119+
break;
116120
case Evento.NOMBRE:
117121
batch.insert(objeto.DB_NOMBRE, Evento.fromCsv(datos[i]).toMap());
118122
break;
119123
case ActividadTuristica.NOMBRE:
120-
batch.insert(objeto.DB_NOMBRE, ActividadTuristica.fromCsv(datos[i]).toMap());
124+
batch.insert(
125+
objeto.DB_NOMBRE, ActividadTuristica.fromCsv(datos[i]).toMap());
121126
break;
122127
case Guia.NOMBRE:
123128
batch.insert(objeto.DB_NOMBRE, Guia.fromCsv(datos[i]).toMap());

lib/filter_informacion.dart

+27-25
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18-
import 'dart:ffi';
19-
2018
import 'package:autocomplete_textfield/autocomplete_textfield.dart';
2119
import 'package:flutter/material.dart';
2220
import 'package:turiscyl/db_handler.dart';
@@ -34,12 +32,11 @@ import 'package:turiscyl/models/salon_banquetes.dart';
3432
import 'package:turiscyl/models/turismo_activo.dart';
3533
import 'package:turiscyl/models/turismo_rural.dart';
3634
import 'package:turiscyl/models/vivienda.dart';
37-
import 'package:turiscyl/utils.dart';
3835
import 'package:turiscyl/values/constantes.dart';
39-
import 'package:turiscyl/values/strings.dart';
4036
import 'package:turiscyl/view_informacion.dart';
4137

4238
import 'models/actividad_turistica.dart';
39+
import 'models/archivo.dart';
4340
import 'models/evento.dart';
4441
import 'models/monumento.dart';
4542

@@ -84,11 +81,13 @@ class _FiltroInformacionState extends State<FiltroInformacion> {
8481
: "WHERE 0=0";
8582
// Discernir entre municipios y localidades
8683
String whereMunicipios;
87-
if (widget.objetoElegido.DB_NOMBRE == Museo.NOMBRE || widget.objetoElegido.DB_NOMBRE == Evento.NOMBRE){
88-
whereMunicipios = municipiosElegidos.length > 0
84+
if (widget.objetoElegido.DB_NOMBRE == Museo.NOMBRE ||
85+
widget.objetoElegido.DB_NOMBRE == Evento.NOMBRE ||
86+
widget.objetoElegido.DB_NOMBRE == Archivo.NOMBRE) {
87+
whereMunicipios = municipiosElegidos.length > 0
8988
? "AND localidad IN ('${municipiosElegidos.join(',')}')"
9089
: "";
91-
}else{
90+
} else {
9291
whereMunicipios = municipiosElegidos.length > 0
9392
? "AND municipio IN ('${municipiosElegidos.join(',')}')"
9493
: "";
@@ -609,18 +608,20 @@ class _FiltroInformacionState extends State<FiltroInformacion> {
609608
),
610609
)
611610
: Container(),
612-
SimpleAutoCompleteTextField(
613-
decoration: new InputDecoration(
614-
icon: Icon(Icons.filter_hdr),
615-
hintText: "Provincia",
616-
),
617-
suggestions: Constantes.provincias,
618-
textSubmitted: (s) => setState(() {
619-
if (s != "") {
620-
provinciasElegidas.add(s);
621-
}
622-
}),
623-
),
611+
widget.objetoElegido.DB_NOMBRE != Archivo.NOMBRE
612+
? SimpleAutoCompleteTextField(
613+
decoration: new InputDecoration(
614+
icon: Icon(Icons.filter_hdr),
615+
hintText: "Provincia",
616+
),
617+
suggestions: Constantes.provincias,
618+
textSubmitted: (s) => setState(() {
619+
if (s != "") {
620+
provinciasElegidas.add(s);
621+
}
622+
}),
623+
)
624+
: Container(),
624625
provinciasElegidas.length > 0
625626
? Container(
626627
height: 40,
@@ -647,12 +648,13 @@ class _FiltroInformacionState extends State<FiltroInformacion> {
647648
: Container(),
648649
(
649650
widget.objetoElegido.DB_NOMBRE == ActividadTuristica.NOMBRE ||
650-
widget.objetoElegido.DB_NOMBRE == Evento.NOMBRE ||
651-
widget.objetoElegido.DB_NOMBRE == Guia.NOMBRE ||
652-
widget.objetoElegido.DB_NOMBRE == Monumento.NOMBRE ||
653-
widget.objetoElegido.DB_NOMBRE == Museo.NOMBRE ||
654-
widget.objetoElegido.DB_NOMBRE == OficinaTurismo.NOMBRE ||
655-
widget.objetoElegido.DB_NOMBRE == TurismoActivo.NOMBRE
651+
widget.objetoElegido.DB_NOMBRE == Evento.NOMBRE ||
652+
widget.objetoElegido.DB_NOMBRE == Guia.NOMBRE ||
653+
widget.objetoElegido.DB_NOMBRE == Monumento.NOMBRE ||
654+
widget.objetoElegido.DB_NOMBRE == Museo.NOMBRE ||
655+
widget.objetoElegido.DB_NOMBRE == OficinaTurismo.NOMBRE ||
656+
widget.objetoElegido.DB_NOMBRE == TurismoActivo.NOMBRE ||
657+
widget.objetoElegido.DB_NOMBRE == Archivo.NOMBRE
656658
) ? Container() :
657659
Row(children: [
658660
Icon(IconsTurisCyL.wheelchair_accessibility, color: Colors.grey),

0 commit comments

Comments
 (0)