├── .gitignore ├── assets ├── css │ ├── editar_cliente.css │ ├── register_client.css │ ├── register_product.css │ ├── lista_cliente.css │ ├── componentes │ │ ├── card.css │ │ ├── header.css │ │ ├── button.css │ │ ├── modal.css │ │ ├── table.css │ │ └── inputs.css │ ├── error_general.css │ ├── register_complete.css │ ├── edicion_concluida.css │ └── base │ │ ├── _variables.css │ │ ├── base.css │ │ └── _reset.css └── img │ ├── checkmark.svg │ ├── denied.svg │ └── doguitoadm.svg ├── db.json ├── README.md ├── package.json ├── service └── client-service.js └── screens ├── error.html ├── registro_completado.html ├── edicion_concluida.html ├── lista_cliente.html ├── registrar_cliente.html ├── editar_cliente.html └── registrar_producto.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /assets/css/editar_cliente.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/css/register_client.css: -------------------------------------------------------------------------------- 1 | .cadastro { 2 | display: flex; 3 | flex-direction: column; 4 | margin-top: 2rem; 5 | } -------------------------------------------------------------------------------- /db.json: -------------------------------------------------------------------------------- 1 | { 2 | "perfil": [ 3 | { 4 | "nombre": "Christian", 5 | "email": "Christian@alura.com", 6 | "id": 1 7 | } 8 | ] 9 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ```js 2 | json-server --watch db.json 3 | ``` 4 | 5 | Browser sync: browser-sync start --server --file . --host --port 5000 --startPath screens/lista_cliente.html 6 | -------------------------------------------------------------------------------- /assets/css/register_product.css: -------------------------------------------------------------------------------- 1 | .register_description { 2 | height: 15.75rem; 3 | } 4 | 5 | .register__price-container, 6 | .register_description-container { 7 | width: 50%; 8 | } 9 | -------------------------------------------------------------------------------- /assets/css/lista_cliente.css: -------------------------------------------------------------------------------- 1 | .clientes-container { 2 | padding-right: 1rem; 3 | padding-left: 1rem; 4 | } 5 | 6 | @media(min-width: 1200px) { 7 | .clientes-container { 8 | padding-left: calc((100vw - 900px)/2); 9 | padding-right: calc((100vw - 900px)/2); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /assets/css/componentes/card.css: -------------------------------------------------------------------------------- 1 | .card { 2 | background-color: var(--contrast-ligth-color); 3 | border-radius: 10px; 4 | box-shadow: var(--shadow); 5 | width: 100%; 6 | max-width: 45rem; 7 | padding: 1.75rem; 8 | box-sizing: border-box; 9 | margin-bottom: 1rem; 10 | } 11 | 12 | .card__title { 13 | font-size: var(--font-size-card-title); 14 | margin-bottom: 1rem; 15 | } 16 | -------------------------------------------------------------------------------- /assets/img/checkmark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/css/componentes/header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | background-color: var(--contrast-ligth-color); 3 | border-radius: 0 0 10px 10px; 4 | box-shadow: var(--shadow); 5 | display: flex; 6 | justify-content: space-between; 7 | align-items: center; 8 | height: 4.75rem; 9 | margin-bottom: 2rem; 10 | } 11 | 12 | .header__logo { 13 | width: 3rem; 14 | } 15 | 16 | .header__list-nav { 17 | display: flex; 18 | } 19 | 20 | .header__link { 21 | margin-left: 2rem; 22 | } 23 | -------------------------------------------------------------------------------- /assets/css/error_general.css: -------------------------------------------------------------------------------- 1 | .register-card { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | text-align: center; 6 | } 7 | 8 | .register-card__icon-complete { 9 | display: block; 10 | width: 3.5rem; 11 | height: 3.5rem; 12 | margin-bottom: 1rem; 13 | background-image: url(../img/denied.svg); 14 | background-size: cover; 15 | background-repeat: no-repeat; 16 | } 17 | 18 | .register-card__title { 19 | max-width: 20rem; 20 | } 21 | -------------------------------------------------------------------------------- /assets/css/register_complete.css: -------------------------------------------------------------------------------- 1 | .register-card { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | text-align: center; 6 | } 7 | 8 | .register-card__icon-complete { 9 | display: block; 10 | width: 3.5rem; 11 | height: 3.5rem; 12 | margin-bottom: 1rem; 13 | background-image: url(../img/checkmark.svg); 14 | background-size: cover; 15 | background-repeat: no-repeat; 16 | } 17 | 18 | .register-card__title { 19 | max-width: 20rem; 20 | } 21 | -------------------------------------------------------------------------------- /assets/css/edicion_concluida.css: -------------------------------------------------------------------------------- 1 | .register-card { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | text-align: center; 6 | } 7 | 8 | .register-card__icon-complete { 9 | display: block; 10 | width: 3.5rem; 11 | height: 3.5rem; 12 | 13 | margin-bottom: 1rem; 14 | 15 | background-image: url(../img/checkmark.svg); 16 | background-size: cover; 17 | background-repeat: no-repeat; 18 | } 19 | 20 | .register-card__title { 21 | max-width: 20rem; 22 | } 23 | -------------------------------------------------------------------------------- /assets/img/denied.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "admin", 3 | "version": "1.0.0", 4 | "description": "1836-crud_js_async project", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/HarlandLohora/1836-CRUD_JS_Async.git" 12 | }, 13 | "keywords": [ 14 | "Alura" 15 | ], 16 | "author": "Harland Lohora", 17 | "license": "ISC", 18 | "bugs": { 19 | "url": "https://github.com/HarlandLohora/1836-CRUD_JS_Async/issues" 20 | }, 21 | "homepage": "https://github.com/HarlandLohora/1836-CRUD_JS_Async#readme" 22 | } 23 | -------------------------------------------------------------------------------- /assets/css/componentes/button.css: -------------------------------------------------------------------------------- 1 | .button { 2 | display: block; 3 | background-color: var(--primary-color); 4 | border-radius: 7px; 5 | width: 100%; 6 | margin-top: 1rem; 7 | max-width: 20rem; 8 | padding: 1.125rem; 9 | box-sizing: border-box; 10 | color: var(--contrast-ligth-color); 11 | font-size: var(--font-size-button); 12 | align-self: center; 13 | text-align: center; 14 | } 15 | 16 | .simple-button { 17 | border: none; 18 | background-color: unset; 19 | } 20 | 21 | .simple-button--add { 22 | color: var(--primary-color); 23 | } 24 | 25 | .simple-button--delete { 26 | color: var(--info-color); 27 | } 28 | 29 | .simple-button--edit { 30 | color: var(--sucess-color); 31 | } 32 | -------------------------------------------------------------------------------- /assets/css/base/_variables.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --font-family: "Montserrat", sans-serif; 3 | --font-family-logo: "Pacifico", cursive; 4 | 5 | --font-input: 300; 6 | 7 | --font-size-logo: 28px; 8 | --font-size-card-title: 28px; 9 | --font-size-input-label: 20px; 10 | --font-size-button: 22px; 11 | --font-size-form-fieldset: 22px; 12 | --font-size-table-header: 22px; 13 | --font-size-modal-title: 28px; 14 | --font-size-modal-button: 28px; 15 | 16 | --primary-color: #0071ea; 17 | --secundary-color: #d6eaff; 18 | --contrast-dark-color: #4d4d4d; 19 | --contrast-ligth-color: #fff; 20 | --info-color: #df2525; 21 | --sucess-color: #047900; 22 | --transparency-color: #4d4d4d33; 23 | 24 | --shadow: 0 5px 10px #55a6ff38; 25 | } 26 | 27 | @media (min-width: 800px) { 28 | :root { 29 | --font-size-logo: 56px; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /assets/css/base/base.css: -------------------------------------------------------------------------------- 1 | @import url(_reset.css); 2 | @import url(_variables.css); 3 | 4 | body { 5 | background-color: var(--secundary-color); 6 | color: var(--contrast-dark-color); 7 | font-family: var(--font-family); 8 | overflow-x: hidden; 9 | } 10 | 11 | .container { 12 | padding-right: 1rem; 13 | padding-left: 1rem; 14 | } 15 | 16 | .flex { 17 | display: flex; 18 | } 19 | 20 | .flex--center { 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | 25 | .flex--column { 26 | flex-direction: column; 27 | } 28 | 29 | @media (min-width: 800px) { 30 | .container { 31 | padding-right: 2.5rem; 32 | padding-left: 2.5rem; 33 | } 34 | } 35 | 36 | @media (min-width: 1200px) { 37 | .container { 38 | padding-left: calc((100vw - 900px) / 2); 39 | padding-right: calc((100vw - 900px) / 2); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /assets/css/componentes/modal.css: -------------------------------------------------------------------------------- 1 | .modal { 2 | background-color: var(--contrast-ligth-color); 3 | border-radius: 10px; 4 | padding: 1.75rem; 5 | box-sizing: border-box; 6 | max-width: 22.5rem; 7 | position: relative; 8 | } 9 | 10 | .modal-container { 11 | background-color: var(--transparency-color); 12 | display: flex; 13 | justify-content: center; 14 | align-items: center; 15 | width: 100vw; 16 | height: 100vh; 17 | position: fixed; 18 | top: 0; 19 | left: 0; 20 | transition: 0.25s; 21 | } 22 | 23 | .modal__title { 24 | font-size: var(--font-size-modal-title); 25 | color: var(--info-color); 26 | margin-bottom: 1rem; 27 | } 28 | 29 | .modal__button { 30 | font-size: var(--font-size-modal-button); 31 | } 32 | 33 | .modal__text { 34 | margin-bottom: 3.875rem; 35 | } 36 | 37 | .modal__button--confirm { 38 | color: var(--info-color); 39 | margin-right: 2.25rem; 40 | } 41 | 42 | .modal__button-container { 43 | display: flex; 44 | } 45 | 46 | .modal__close { 47 | position: absolute; 48 | display: block; 49 | height: 1rem; 50 | width: 1rem; 51 | top: 1.75rem; 52 | right: 1.75rem; 53 | } 54 | 55 | .modal--close { 56 | left: -100vw; 57 | transition: 0.25s; 58 | } 59 | -------------------------------------------------------------------------------- /assets/css/componentes/table.css: -------------------------------------------------------------------------------- 1 | .table { 2 | margin-top: 2.25rem; 3 | width: 100%; 4 | background-color: var(--contrast-ligth-color); 5 | border-radius: 10px; 6 | box-shadow: var(--shadow); 7 | border-collapse: initial; 8 | text-align: left; 9 | } 10 | 11 | .table td:first-of-type, 12 | .table th:first-of-type { 13 | padding-left: 1.75rem; 14 | } 15 | 16 | .table td:last-of-type, 17 | .table th:last-of-type { 18 | padding-right: 1.75rem; 19 | } 20 | 21 | .table thead { 22 | font-size: var(--font-size-table-header); 23 | } 24 | 25 | .table th { 26 | padding-top: 1.75rem; 27 | padding-bottom: 1.75rem; 28 | border-bottom: 1px solid var(--secundary-color); 29 | } 30 | 31 | .table td { 32 | padding-top: 1rem; 33 | padding-bottom: 1rem; 34 | } 35 | 36 | .table__align--right { 37 | text-align: right; 38 | } 39 | 40 | .table__column--p { 41 | width: 20%; 42 | } 43 | 44 | .table__column--m { 45 | width: 25%; 46 | } 47 | 48 | .table__column--g { 49 | width: 50%; 50 | } 51 | 52 | .table tr:last-of-type td { 53 | padding-bottom: 1.75rem; 54 | } 55 | 56 | .table__button-control { 57 | display: flex; 58 | align-items: center; 59 | justify-content: flex-end; 60 | } 61 | 62 | .table__button-control li:first-of-type { 63 | margin-right: 2.25rem; 64 | } 65 | 66 | .td { 67 | padding: 1rem; 68 | } 69 | -------------------------------------------------------------------------------- /service/client-service.js: -------------------------------------------------------------------------------- 1 | //backticks 2 | const crearNuevaLinea = (nombre, email) => { 3 | const linea = document.createElement("tr"); 4 | const contenido = ` 5 | 6 | ${nombre} 7 | 8 | ${email} 9 | 10 | 25 | 26 | `; 27 | linea.innerHTML = contenido; 28 | return linea; 29 | }; 30 | 31 | const table = document.querySelector("[data-table]"); 32 | 33 | //Abrir http (método,url) 34 | 35 | // CRUD - Métodos HTTP 36 | // Create - POST 37 | // Read - GET 38 | // Update - PUT/PATCH 39 | // Delete - DELETE 40 | 41 | const listaClientes = () => { 42 | const promise = new Promise((resolve, reject) => { 43 | const http = new XMLHttpRequest(); 44 | http.open("GET", "http://localhost:3000/perfiles"); 45 | 46 | http.send(); 47 | 48 | http.onload = () => { 49 | const response = JSON.parse(http.response); 50 | if (http.status >= 400) { 51 | reject(response); 52 | } else { 53 | resolve(response); 54 | } 55 | }; 56 | }); 57 | return promise; 58 | }; 59 | 60 | listaClientes() 61 | .then((data) => { 62 | data.forEach((perfil) => { 63 | const nuevaLinea = crearNuevaLinea(perfil.nombre, perfil.email); 64 | table.appendChild(nuevaLinea); 65 | }); 66 | }) 67 | .catch((error) => alert("Ocurrió un error")); 68 | 69 | // console.log(data); 70 | // 71 | -------------------------------------------------------------------------------- /screens/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Registro concluido 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 28 |
29 |
30 |
31 | 32 |

Ops! Ocurrió un error. Prueba de nuevo en unos minutos. 🐶

33 | Regresar al inicio 34 |
35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /screens/registro_completado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Registro concluido 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 30 | 40 |
41 |
42 |
43 | 44 |

¡Registro completado!

45 | Ver clientes 46 |
47 |
48 | 49 | 50 | -------------------------------------------------------------------------------- /screens/edicion_concluida.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Registro concluido 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 30 | 40 |
41 |
42 |
43 | 44 |

45 | Cliente editado con éxito 46 |

47 | Ver clientes 48 |
49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /assets/css/base/_reset.css: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | div, 4 | span, 5 | applet, 6 | object, 7 | iframe, 8 | h1, 9 | h2, 10 | h3, 11 | h4, 12 | h5, 13 | h6, 14 | p, 15 | blockquote, 16 | pre, 17 | a, 18 | abbr, 19 | acronym, 20 | address, 21 | big, 22 | cite, 23 | code, 24 | del, 25 | dfn, 26 | em, 27 | img, 28 | ins, 29 | kbd, 30 | q, 31 | s, 32 | samp, 33 | small, 34 | strike, 35 | strong, 36 | sub, 37 | sup, 38 | tt, 39 | var, 40 | b, 41 | u, 42 | i, 43 | center, 44 | dl, 45 | dt, 46 | dd, 47 | ol, 48 | ul, 49 | li, 50 | fieldset, 51 | form, 52 | label, 53 | legend, 54 | table, 55 | caption, 56 | tbody, 57 | tfoot, 58 | thead, 59 | tr, 60 | th, 61 | td, 62 | article, 63 | aside, 64 | canvas, 65 | details, 66 | embed, 67 | figure, 68 | figcaption, 69 | footer, 70 | header, 71 | hgroup, 72 | menu, 73 | nav, 74 | output, 75 | ruby, 76 | section, 77 | summary, 78 | time, 79 | mark, 80 | audio, 81 | video { 82 | margin: 0; 83 | padding: 0; 84 | border: 0; 85 | font-size: 100%; 86 | font: inherit; 87 | vertical-align: baseline; 88 | } 89 | 90 | article, 91 | aside, 92 | details, 93 | figcaption, 94 | figure, 95 | footer, 96 | header, 97 | hgroup, 98 | menu, 99 | nav, 100 | section { 101 | display: block; 102 | } 103 | body { 104 | line-height: 1; 105 | } 106 | ol, 107 | ul { 108 | list-style: none; 109 | } 110 | blockquote, 111 | q { 112 | quotes: none; 113 | } 114 | blockquote:before, 115 | blockquote:after, 116 | q:before, 117 | q:after { 118 | content: ""; 119 | content: none; 120 | } 121 | table { 122 | border-collapse: collapse; 123 | border-spacing: 0; 124 | } 125 | 126 | a { 127 | color: inherit; 128 | text-decoration: none; 129 | } 130 | 131 | img { 132 | width: inherit; 133 | } 134 | 135 | button { 136 | font-family: inherit; 137 | font-size: inherit; 138 | color: inherit; 139 | font-weight: inherit; 140 | padding: 0; 141 | border: none; 142 | background-color: unset; 143 | } 144 | 145 | input { 146 | border: none; 147 | color: inherit; 148 | font-size: inherit; 149 | font-weight: inherit; 150 | font-family: inherit; 151 | } 152 | 153 | textarea { 154 | border: none; 155 | color: inherit; 156 | font-size: inherit; 157 | font-weight: inherit; 158 | font-family: inherit; 159 | } 160 | -------------------------------------------------------------------------------- /screens/lista_cliente.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Clientes 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 30 | 38 |
39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 53 | 54 | 55 | 56 |
NombreEmail 47 | Nuevo Cliente 52 |
57 | 70 |
71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /screens/registrar_cliente.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Cadastro de cliente 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 30 | 40 |
41 |
42 |
43 |

Nuevo Cliente

44 |
45 |
46 | 55 | 56 | Este campo es requerido 57 |
58 |
59 | 68 | 69 | Este campo es requerido 70 |
71 | 72 |
73 |
74 |
75 | 76 | 77 | -------------------------------------------------------------------------------- /screens/editar_cliente.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Actualizar cliente 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 30 | 40 |
41 |
42 |
43 |

Editar

44 |
45 |
46 | 55 | 56 | Este campo es requerido 57 |
58 |
59 | 68 | 69 | Este campo es requerido 70 |
71 | 72 |
73 |
74 |
75 | 76 | 77 | -------------------------------------------------------------------------------- /assets/css/componentes/inputs.css: -------------------------------------------------------------------------------- 1 | .formulario { 2 | margin-top: 2rem; 3 | } 4 | 5 | .formulario__legenda { 6 | font-size: var(--font-size-form-fieldset); 7 | 8 | margin-bottom: 1rem; 9 | } 10 | 11 | .input-container { 12 | font-weight: var(--font-input); 13 | position: relative; 14 | margin-bottom: 1rem; 15 | display: flex; 16 | flex-direction: column; 17 | justify-content: flex-end; 18 | box-sizing: border-box; 19 | } 20 | 21 | .input { 22 | box-sizing: border-box; 23 | border-bottom: 1px solid var(--secundary-color); 24 | padding: 1.375rem 0.5rem 0.5rem; 25 | height: 3.25rem; 26 | width: 100%; 27 | } 28 | 29 | .input::placeholder { 30 | visibility: hidden; 31 | color: #00000000; 32 | } 33 | 34 | .input:focus { 35 | outline: none; 36 | } 37 | 38 | .input-label { 39 | position: absolute; 40 | top: 1.375rem; 41 | left: 0.5rem; 42 | font-size: var(--font-size-input-label); 43 | 44 | transition: all 0.25s; 45 | } 46 | 47 | .input:not(:placeholder-shown) + .input-label, 48 | .input:focus + .input-label { 49 | font-size: 0.875rem; 50 | top: 0.25rem; 51 | transition: all 0.25s; 52 | } 53 | 54 | .input-container--invalido { 55 | margin-bottom: 0.5rem; 56 | } 57 | 58 | .input-container--invalido .input { 59 | border: 1px solid var(--info-color); 60 | border-radius: 7px; 61 | } 62 | 63 | .input-container--invalido .input-label { 64 | color: var(--info-color); 65 | } 66 | 67 | .input-menssage-error { 68 | display: none; 69 | } 70 | 71 | .input-container--invalido .input-menssage-error { 72 | color: var(--info-color); 73 | display: block; 74 | margin-top: 0.5rem; 75 | padding-left: 0.5rem; 76 | } 77 | 78 | .textarea { 79 | box-sizing: border-box; 80 | border: 1px solid var(--secundary-color); 81 | padding: 0.5rem; 82 | border-radius: 7px; 83 | width: 100%; 84 | min-height: 3rem; 85 | } 86 | 87 | .textarea-container { 88 | position: relative; 89 | margin-top: 2rem; 90 | margin-bottom: 1rem; 91 | font-weight: var(--font-input); 92 | } 93 | 94 | .textarea::placeholder { 95 | visibility: hidden; 96 | } 97 | 98 | .textarea:focus { 99 | outline: none; 100 | } 101 | 102 | .textarea-label { 103 | position: absolute; 104 | top: 0.5rem; 105 | left: 0.5rem; 106 | font-size: var(--font-size-input-label); 107 | transition: all 0.25s; 108 | } 109 | 110 | .textarea:not(:placeholder-shown) + .textarea-label, 111 | .textarea:focus + .textarea-label { 112 | font-size: 0.875rem; 113 | top: -1.25rem; 114 | transition: all 0.25s; 115 | } 116 | 117 | .textarea-container--invalido { 118 | margin-bottom: 0.5rem; 119 | } 120 | 121 | .textarea-container--invalido .textarea { 122 | border: 1px solid var(--info-color); 123 | } 124 | 125 | .textarea-container--invalido .textarea-label { 126 | color: var(--info-color); 127 | } 128 | 129 | .textarea-menssage-error { 130 | display: none; 131 | } 132 | 133 | .textarea-container--invalido .textarea-menssage-error { 134 | display: block; 135 | color: var(--info-color); 136 | margin-top: 0.5rem; 137 | padding-left: 0.5rem; 138 | } 139 | -------------------------------------------------------------------------------- /screens/registrar_producto.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Doguito Petshop | Registro de producto 7 | 8 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 31 | 41 |
42 |
43 |
44 |

Registrar un producto

45 |
46 |
47 | 54 | 55 | Error 56 |
57 |
58 | 65 | 66 | Error 67 |
68 |
74 | 80 | 81 | Error 82 |
83 | Registrar producto 86 |
87 |
88 |
89 | 90 | 91 | -------------------------------------------------------------------------------- /assets/img/doguitoadm.svg: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------