david-rosval commited on
Commit
4610681
·
0 Parent(s):

subiendo proyecto

Browse files
.eslintrc.cjs ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ root: true,
3
+ env: { browser: true, es2020: true },
4
+ extends: [
5
+ 'eslint:recommended',
6
+ 'plugin:react/recommended',
7
+ 'plugin:react/jsx-runtime',
8
+ 'plugin:react-hooks/recommended',
9
+ ],
10
+ ignorePatterns: ['dist', '.eslintrc.cjs'],
11
+ parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
12
+ settings: { react: { version: '18.2' } },
13
+ plugins: ['react-refresh'],
14
+ rules: {
15
+ 'react-refresh/only-export-components': [
16
+ 'warn',
17
+ { allowConstantExport: true },
18
+ ],
19
+ },
20
+ }
.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # React + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite + React</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.jsx"></script>
12
+ </body>
13
+ </html>
package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
package.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "intento5",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "react": "^18.2.0",
14
+ "react-dom": "^18.2.0",
15
+ "react-router": "^6.20.1",
16
+ "react-router-dom": "6.20.1"
17
+ },
18
+ "devDependencies": {
19
+ "@types/react": "^18.2.37",
20
+ "@types/react-dom": "^18.2.15",
21
+ "@vitejs/plugin-react": "^4.2.0",
22
+ "autoprefixer": "^10.4.16",
23
+ "eslint": "^8.53.0",
24
+ "eslint-plugin-react": "^7.33.2",
25
+ "eslint-plugin-react-hooks": "^4.6.0",
26
+ "eslint-plugin-react-refresh": "^0.4.4",
27
+ "postcss": "^8.4.32",
28
+ "standard": "^17.1.0",
29
+ "tailwindcss": "^3.3.5",
30
+ "vite": "^5.0.0"
31
+ }
32
+ }
postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
public/vite.svg ADDED
src/App.jsx ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Route, Routes } from "react-router-dom";
2
+ import { NavBar } from "./NavBar";
3
+ import { Prescripcion } from "./Prescripcion";
4
+
5
+ const Home = () => {
6
+ return <div>Home</div>;
7
+ };
8
+
9
+ const SearchPage = () => {
10
+ return <div>SearchPage</div>;
11
+ };
12
+
13
+ export default function App() {
14
+ return (
15
+ <div className="flex flex-col items-center h-screen">
16
+ <NavBar />
17
+ <Routes>
18
+ <Route path="/" element={<Home />} />
19
+ <Route path="/search-page" element={<SearchPage />} />
20
+ <Route path="/prescripcion" element={<Prescripcion />} />
21
+ </Routes>
22
+ </div>
23
+ );
24
+ }
src/NavBar.jsx ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import { Link } from "react-router-dom";
3
+
4
+ export const NavBar = () => {
5
+ return (
6
+ <header className="w-4/5">
7
+ <h1 className="text-5xl font-extrabold mt-20 mb-20 text-center">
8
+ Óptica Arte Visual
9
+ </h1>
10
+ <nav>
11
+ <ul className="flex flex-row justify-center text-xl">
12
+
13
+ <Link className="w-1/3 text-center" to="/">
14
+ <li className="hover:bg-slate-700 hover:text-white py-2 hover:font-semibold">
15
+ Home
16
+ </li>
17
+ </Link>
18
+ <Link className="w-1/3 text-center" to="/search-page">
19
+ <li className="hover:bg-slate-700 hover:text-white py-2 hover:font-semibold">
20
+ Search Page
21
+ </li>
22
+ </Link>
23
+ <Link className="w-1/3 text-center" to="/prescripcion">
24
+ <li className="hover:bg-slate-700 hover:text-white py-2 hover:font-semibold">
25
+ Emitir Prescripción
26
+ </li>
27
+ </Link>
28
+ </ul>
29
+ </nav>
30
+ </header>
31
+ );
32
+ };
src/Prescripcion.jsx ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState } from "react";
2
+ import { obtenerLike } from "./lib/conexionApi";
3
+
4
+ export const Prescripcion = () => {
5
+ // States para la búsqueda de clientes
6
+ const [clienteBusqueda, setClienteBusqueda] = useState("");
7
+ const [btnBuscarClick, setBtnBuscarClick] = useState(false);
8
+ const [clientes, setClientes] = useState([]);
9
+ const [cliente, setCliente] = useState({});
10
+
11
+ useEffect(() => {
12
+ if (btnBuscarClick) {
13
+ obtenerLike(
14
+ "clientes/busqueda",
15
+ { nombres_y_apellidos: clienteBusqueda },
16
+ setClientes
17
+ );
18
+ } else return;
19
+ }, [btnBuscarClick]);
20
+
21
+ const handleButtonBuscarCliente = (e) => {
22
+ e.preventDefault();
23
+ if (clienteBusqueda !== "") {
24
+ setBtnBuscarClick(true);
25
+ } else setBtnBuscarClick(false);
26
+ //console.log(clientes);
27
+ };
28
+
29
+ return (
30
+ <div className="pb-20 w-3/5 flex flex-row mt-10 px-5 h-[calc(100vh-208px)]">
31
+ <div className="w-2/5 pr-5">
32
+ {/* BARRA DE BÚSQUEDA DE CLIENTE */}
33
+ <div className="flex flex-row gap-2 mb-2">
34
+ <input
35
+ className="border w-3/4 py-2 px-3 rounded-md"
36
+ id="input-buscar-cliente"
37
+ type="text"
38
+ placeholder="Nombre del cliente"
39
+ onChange={(e) => {
40
+ setClienteBusqueda(e.target.value);
41
+ setBtnBuscarClick(false);
42
+ }}
43
+ value={clienteBusqueda}
44
+ />
45
+ <button
46
+ className="rounded-md w-1/4 bg-slate-700 hover:bg-slate-800 text-white font-semibold px-2 text-center"
47
+ onClick={handleButtonBuscarCliente}
48
+ >
49
+ Buscar
50
+ </button>
51
+ </div>
52
+
53
+ {/* DROPDOWN DE CLIENTES ENCONTRADOS */}
54
+ <ul>
55
+ {clientes && clienteBusqueda !== "" && btnBuscarClick !== false
56
+ ? clientes.map((cliente) => {
57
+ const nombresYApellidos = "nombres_y_apellidos";
58
+ const idCliente = "id_cliente";
59
+ return (
60
+ <li
61
+ key={cliente[idCliente]}
62
+ onClick={() => {
63
+ setBtnBuscarClick(false);
64
+ setClienteBusqueda("");
65
+ setCliente(cliente);
66
+ }}
67
+ className="cursor-pointer hover:font-semibold hover:bg-slate-50 p-2"
68
+ >
69
+ <p>{cliente[nombresYApellidos]}</p>
70
+ <p className="text-sm text-slate-400">{cliente["edad"]}</p>
71
+ <p className="text-sm text-slate-400">
72
+ {cliente["telefono"]}
73
+ </p>
74
+ <p className="text-sm text-slate-400">
75
+ {cliente["direccion"]}
76
+ </p>
77
+ </li>
78
+ );
79
+ })
80
+ : ""}
81
+ </ul>
82
+ </div>
83
+
84
+ <svg
85
+ xmlns="http://www.w3.org/2000/svg"
86
+ className="icon icon-tabler icon-tabler-user-plus cursor-pointer hover:stroke-slate-800 mr-5"
87
+ width="40"
88
+ height="40"
89
+ viewBox="0 0 24 24"
90
+ strokeWidth="2.5"
91
+ stroke="#334155"
92
+ fill="none"
93
+ strokeLinecap="round"
94
+ strokeLinejoin="round"
95
+ onClick={() => {
96
+ console.log("agregar");
97
+ }}
98
+ >
99
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
100
+ <path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0" />
101
+ <path d="M16 19h6" />
102
+ <path d="M19 16v6" />
103
+ <path d="M6 21v-2a4 4 0 0 1 4 -4h4" />
104
+ </svg>
105
+
106
+ {/* MOSTRAR CLIENTE SELECCIONADO */}
107
+ {Object.keys(cliente).length !== 0 ? (
108
+ <div className="px-5 flex flex-col w-3/5 h-full pb-20 border-l-2">
109
+ <div className="w-full">
110
+ <p className=" font-semibold text-4xl mb-8">
111
+ {cliente["nombres_y_apellidos"]}
112
+ </p>
113
+ <div className="flex flex-row">
114
+ <p className="w-1/2 mb-2">Edad: {cliente["edad"]}</p>
115
+ <p className="w-1/2 mb-2">Teléfono: {cliente["telefono"]}</p>
116
+ </div>
117
+ <p className="mb-2"> Dirección: {cliente["direccion"]}</p>
118
+ <label htmlFor="notaAdicional">Nota adicional: {""}</label>
119
+ <textarea
120
+ className="mt-2 border w-full py-2 px-3 rounded-md"
121
+ id="notaAdicional"
122
+ type="text"
123
+ placeholder="Detalle de lunas"
124
+ ></textarea>
125
+ </div>
126
+ <div className="flex flex-col items-center gap-8 justify-center mt-10 px-5">
127
+ <table className="text-center border-2 table-fixed w-4/5 h-[6.5rem] border-separate lg:border-collapse">
128
+ <thead className="border-2">
129
+ <tr>
130
+ <th className="border">Esfera</th>
131
+ <th className="border">Cilindro</th>
132
+ <th className="border">Eje</th>
133
+ <th className="border">A/Y</th>
134
+ </tr>
135
+ </thead>
136
+ <tbody>
137
+ <tr>
138
+ <td className="border">
139
+ <input type="text" className="w-full h-full" />
140
+ </td>
141
+ <td className="border">
142
+ <input type="text" className="w-full h-full" />
143
+ </td>
144
+ <td className="border">
145
+ <input type="text" className="w-full h-full" />
146
+ </td>
147
+ <td className="border">
148
+ <input type="text" className="w-full h-full" />
149
+ </td>
150
+ </tr>
151
+ <tr>
152
+ <td className="border">
153
+ <input type="text" className="w-full h-full" />
154
+ </td>
155
+ <td className="border">
156
+ <input type="text" className="w-full h-full" />
157
+ </td>
158
+ <td className="border">
159
+ <input type="text" className="w-full h-full" />
160
+ </td>
161
+ <td className="border">
162
+ <input type="text" className="w-full h-full" />
163
+ </td>
164
+ </tr>
165
+ </tbody>
166
+ </table>
167
+ <table className="text-center border-2 table-fixed w-4/5 h-[6.5rem] border-separate lg:border-collapse">
168
+ <thead>
169
+ <tr>
170
+ <th className="border">Esfera</th>
171
+ <th className="border">Cilindro</th>
172
+ <th className="border">Eje</th>
173
+ <th className="border">A/Y</th>
174
+ </tr>
175
+ </thead>
176
+ <tbody>
177
+ <tr>
178
+ <td className="border">
179
+ <input type="text" className="w-full h-full" />
180
+ </td>
181
+ <td className="border">
182
+ <input type="text" className="w-full h-full" />
183
+ </td>
184
+ <td className="border">
185
+ <input type="text" className="w-full h-full" />
186
+ </td>
187
+ <td className="border">
188
+ <input type="text" className="w-full h-full" />
189
+ </td>
190
+ </tr>
191
+ <tr>
192
+ <td className="border">
193
+ <input type="text" className="w-full h-full" />
194
+ </td>
195
+ <td className="border">
196
+ <input type="text" className="w-full h-full" />
197
+ </td>
198
+ <td className="border">
199
+ <input type="text" className="w-full h-full" />
200
+ </td>
201
+ <td className="border">
202
+ <input type="text" className="w-full h-full" />
203
+ </td>
204
+ </tr>
205
+ </tbody>
206
+ </table>
207
+ </div>
208
+ <button className="rounded-md w-full py-3 mt-10 bg-slate-700 hover:bg-slate-800 text-white font-semibold uppercase ">
209
+ Emitir Prescripción
210
+ </button>
211
+ </div>
212
+ ) : (
213
+ <div className="px-5 flex flex-col w-3/5 h-full pb-20 border-l-2">
214
+ <p className="text-gray-400 text-2xl font-semibold">
215
+ No se ha seleccionado ningún cliente
216
+ </p>
217
+ </div>
218
+ )}
219
+ </div>
220
+ );
221
+ };
src/assets/react.svg ADDED
src/index.css ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
src/lib/conexionApi.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const url = 'https://jairodanielmt-opticaads.hf.space'
2
+
3
+ export const obtenerGet = async (endpoint) => {
4
+ const response = await fetch(`${url}/${endpoint}`)
5
+ const data = await response.json()
6
+ return data
7
+ }
8
+
9
+ export const registrarPost = async (endpoint, data) => {
10
+ const response = await fetch(`${url}/${endpoint}`, {
11
+ method: 'POST',
12
+ body: JSON.stringify(data),
13
+ headers: {
14
+ 'Content-type': 'application/json'
15
+ }
16
+ })
17
+ const res = await response.json()
18
+ return res
19
+ }
20
+
21
+ export const obtenerLike = async (endpoint, dato, funcionSet) => {
22
+ const response = await fetch(`${url}/${endpoint}`, {
23
+ method: 'POST',
24
+ headers: {
25
+ 'Content-type': 'application/json'
26
+ },
27
+ body: JSON.stringify(dato),
28
+ })
29
+ const data = await response.json()
30
+ funcionSet(data)
31
+ }
src/main.jsx ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react'
2
+ import ReactDOM from "react-dom/client";
3
+ import App from "./App.jsx";
4
+ import "./index.css";
5
+ import { BrowserRouter } from "react-router-dom";
6
+
7
+ ReactDOM.createRoot(document.getElementById("root")).render(
8
+ <React.StrictMode>
9
+ <BrowserRouter>
10
+ <App />
11
+ </BrowserRouter>
12
+ </React.StrictMode>
13
+ );
tailwind.config.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ["index.html", "./src/**/*.jsx"],
4
+ theme: {
5
+ extend: {},
6
+ },
7
+ plugins: []
8
+ }
9
+
vite.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ })