embalse individual
This commit is contained in:
		| @@ -7,6 +7,10 @@ export default class Api { | ||||
|     return Api._makeReq('/embalses'); | ||||
|   } | ||||
|  | ||||
|   static async embalseById(id: string): Promise<Embalse[]> { | ||||
|     return Api._makeReq(`/embalses/${id}`); | ||||
|   } | ||||
|  | ||||
|   static async _makeReq<T>(endpoint: string): Promise<T[]> { | ||||
|     let hasMore = true; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| import { render } from 'solid-js/web'; | ||||
| import { Router } from "@solidjs/router"; | ||||
| import 'leaflet/dist/leaflet.css'; | ||||
| import './styles/loader.css'; | ||||
| import './styles/bulma.scss'; | ||||
| import routes from './routes'; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ export default interface Embalse { | ||||
|   id: number | ||||
|   ambito_nombre: string | ||||
|   embalse_nombre: string | ||||
|   agua_actual: number | ||||
|   agua_total: number | ||||
|   electrico_flag: number | ||||
|   codigo: number | ||||
|   | ||||
							
								
								
									
										31
									
								
								src/partials/Card.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/partials/Card.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| import { JSX } from "solid-js"; | ||||
|  | ||||
| interface Props { | ||||
|   title: string; | ||||
|   icon: JSX.Element; | ||||
|   children: JSX.Element; | ||||
| } | ||||
|  | ||||
| function Card(props: Props) { | ||||
|   return ( | ||||
|     <div class="card"> | ||||
|       <header class="card-header"> | ||||
|         <p class="card-header-title"> | ||||
|           <span class="icon-text"> | ||||
|             <span class="icon"> | ||||
|               {props.icon} | ||||
|             </span> | ||||
|             <span>{props.title}</span> | ||||
|           </span> | ||||
|         </p> | ||||
|       </header> | ||||
|       <div class="card-content"> | ||||
|         <div class="content"> | ||||
|           {props.children} | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| } | ||||
|  | ||||
| export default Card; | ||||
| @@ -0,0 +1,7 @@ | ||||
| function Loader() { | ||||
|   return ( | ||||
|     <span class="loader"></span> | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export default Loader; | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import { RouteDefinition } from "@solidjs/router"; | ||||
| import Home from "./views/Home"; | ||||
| import Finder from "./views/Finder"; | ||||
| import Viewer from "./views/Viewer"; | ||||
| import Embalse from "./views/Embalse"; | ||||
|  | ||||
| const routes: RouteDefinition[] = [ | ||||
|   { | ||||
| @@ -9,12 +10,16 @@ const routes: RouteDefinition[] = [ | ||||
|     component: Home | ||||
|   }, | ||||
|   { | ||||
|     path: '/finder', | ||||
|     path: '/embalses', | ||||
|     component: Viewer | ||||
|   }, | ||||
|   { | ||||
|     path: '/embalses/nearby', | ||||
|     component: Finder | ||||
|   }, | ||||
|   { | ||||
|     path: '/viewer', | ||||
|     component: Viewer | ||||
|     path: '/embalses/:id', | ||||
|     component: Embalse | ||||
|   } | ||||
| ]; | ||||
|  | ||||
|   | ||||
							
								
								
									
										20
									
								
								src/styles/loader.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/styles/loader.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| .loader { | ||||
|   width: 48px; | ||||
|   height: 48px; | ||||
|   border: 5px solid #FFF; | ||||
|   border-bottom-color: #FF3D00; | ||||
|   border-radius: 50%; | ||||
|   display: inline-block; | ||||
|   box-sizing: border-box; | ||||
|   animation: rotation 1s linear infinite; | ||||
| } | ||||
|  | ||||
| @keyframes rotation { | ||||
|   0% { | ||||
|     transform: rotate(0deg); | ||||
|   } | ||||
|  | ||||
|   100% { | ||||
|     transform: rotate(360deg); | ||||
|   } | ||||
| } | ||||
| @@ -1,16 +1,77 @@ | ||||
| import { createSignal } from "solid-js"; | ||||
| import { createSignal, onMount, Show } from "solid-js"; | ||||
| import { Params, useParams } from "@solidjs/router"; | ||||
| import EmbalseType from "../interfaces/Embalse"; | ||||
| import Navbar from "../partials/Navbar"; | ||||
| import Loader from "../partials/Loader"; | ||||
| import Api from "../helpers/Api"; | ||||
| import Card from "../partials/Card"; | ||||
| import { FaSolidLocationDot, FaSolidLocationPin, FaSolidMapLocationDot, FaSolidWater } from "solid-icons/fa"; | ||||
|  | ||||
| interface CustomParams extends Params { | ||||
|   id: string; | ||||
| } | ||||
|  | ||||
| function Embalse() { | ||||
|   const [embalse, setEmbalse] = createSignal<EmbalseType | null>(null); | ||||
|  | ||||
|   const params = useParams<CustomParams>(); | ||||
|   const [embalse, setEmbalse] = createSignal<EmbalseType>(); | ||||
|  | ||||
|   onMount(() => { | ||||
|     getEmbalse(); | ||||
|   }); | ||||
|  | ||||
|   const getEmbalse = async () => { | ||||
|     const res = await Api.embalseById(params.id); | ||||
|  | ||||
|     setEmbalse(res[0]); | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <> | ||||
|       <Navbar /> | ||||
|       <section class="section"> | ||||
|  | ||||
|       </section> | ||||
|       <Show when={embalse() !== undefined} fallback={<Loader />}> | ||||
|         <section class="hero is-fullheight"> | ||||
|           <div class="hero-body"> | ||||
|             <div class="container has-text-centered"> | ||||
|               <div class="columns is-centered"> | ||||
|                 <div class="column is-half"> | ||||
|                   <p class="title">{embalse()!.nombre}</p> | ||||
|                   <p class="subtitle"> | ||||
|                     <span class="icon-text"> | ||||
|                       <span class="icon"> | ||||
|                         <FaSolidMapLocationDot /> | ||||
|                       </span> | ||||
|                       <span>{embalse()!.provincia}, {embalse()!.ccaa}</span> | ||||
|                     </span> | ||||
|                   </p> | ||||
|                   <div class="columns is-centered is-vcentered is-multiline"> | ||||
|                     <div class="column is-narrow"> | ||||
|                       {/* Ubicación */} | ||||
|                       <Card title="Ubicación" icon={<FaSolidLocationDot />}> | ||||
|                         <> | ||||
|                           <p><b>Latitud</b>: {embalse()!.x}</p> | ||||
|                           <p><b>Longitud</b>: {embalse()!.y}</p> | ||||
|                         </> | ||||
|                       </Card> | ||||
|                     </div> | ||||
|                     <div class="column is-narrow"> | ||||
|                       <Card title="Caudal" icon={<FaSolidWater />}> | ||||
|                         <> | ||||
|                           <p><b>Actual</b>: {embalse()!.agua_actual} l/m2</p> | ||||
|                           <p><b>Total</b>: {embalse()!.agua_total} l/m2</p> | ||||
|                           <p><b>Porcentaje</b>: {embalse()!.agua_actual / embalse()!.agua_total * 100}%</p> | ||||
|                         </> | ||||
|                       </Card> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </section> | ||||
|       </Show> | ||||
|     </> | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export default Embalse; | ||||
|   | ||||
| @@ -1,16 +1,14 @@ | ||||
| import { FaSolidGlassWaterDroplet } from "solid-icons/fa" | ||||
| import Navbar from "../partials/Navbar" | ||||
| import { createSignal } from "solid-js" | ||||
| import Photo from "../helpers/Photo" | ||||
| import { A } from "@solidjs/router"; | ||||
|  | ||||
| function Home() { | ||||
|   const [photo, setPhoto] = createSignal(Photo.random()); | ||||
|   const photo = Photo.random(); | ||||
|  | ||||
|   return ( | ||||
|     <> | ||||
|       <section class="hero is-fullheight" style={{ | ||||
|         "background-image": `url('${photo()}')`, | ||||
|         "background-image": `url('${photo}')`, | ||||
|         "background-position": 'center center', | ||||
|         "background-size": 'cover', | ||||
|       }}> | ||||
| @@ -35,7 +33,10 @@ function Home() { | ||||
|                           <span>Malackathon</span> | ||||
|                         </span> | ||||
|                       </p> | ||||
|                       <A class="button is-primary" href="/finder">Buscar</A> | ||||
|                       <div class="buttons"> | ||||
|                         <A class="button is-primary" href="/embalses">Todos los embalses</A> | ||||
|                         <A class="button is-primary" href="/embalses/nearby">Buscar</A> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                 </div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user