Productos view
This commit is contained in:
13
electron.js
13
electron.js
@@ -1,14 +1,18 @@
|
|||||||
const { app, BrowserWindow } = require('electron');
|
const {app, BrowserWindow} = require('electron');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
function createWindow() {
|
function createWindow() {
|
||||||
const win = new BrowserWindow({
|
const win = new BrowserWindow({
|
||||||
width: 1024,
|
width: 1100,
|
||||||
height: 720,
|
height: 790,
|
||||||
|
resizable: false,
|
||||||
|
frame: false,
|
||||||
|
transparent: true,
|
||||||
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
preload: path.join(__dirname, 'preload.js'),
|
preload: path.join(__dirname, 'preload.js'),
|
||||||
nodeIntegration: true,
|
nodeIntegration: true,
|
||||||
contextIsolation: false
|
contextIsolation: false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
win.loadURL('http://localhost:8080');
|
win.loadURL('http://localhost:8080');
|
||||||
@@ -21,7 +25,6 @@ app.on('window-all-closed', () => {
|
|||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.on('activate', () => {
|
app.on('activate', () => {
|
||||||
if (BrowserWindow.getAllWindows().length === 0) {
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
createWindow();
|
createWindow();
|
||||||
|
|||||||
546
package-lock.json
generated
546
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
@@ -21,16 +21,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"bootstrap": "^5.3.3",
|
||||||
|
"boxicons": "^2.1.4",
|
||||||
"pinia": "^2.2.2",
|
"pinia": "^2.2.2",
|
||||||
"vue": "^3.2.13",
|
"vue": "^3.2.13",
|
||||||
"vue-router": "^4.0.3"
|
"vue-router": "^4.0.3",
|
||||||
|
"vuedigitalpowerui": "^0.1.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vue/cli-plugin-router": "~5.0.0",
|
"@vue/cli-plugin-router": "~5.0.0",
|
||||||
"@vue/cli-service": "~5.0.0",
|
"@vue/cli-service": "~5.0.0",
|
||||||
"electron": "^32.1.2",
|
"electron": "^32.1.2",
|
||||||
"electron-builder": "^25.0.5",
|
"electron-builder": "^25.0.5",
|
||||||
"sass": "^1.32.7",
|
"jquery": "^3.7.1",
|
||||||
"sass-loader": "^12.0.0"
|
"popper.js": "^1.16.1",
|
||||||
|
"sass": "^1.79.3",
|
||||||
|
"sass-loader": "^12.6.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
85
src/App.vue
85
src/App.vue
@@ -1,14 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<nav>
|
<head>
|
||||||
<router-link to="/">Home</router-link> |
|
<link rel="stylesheet" href="https://digitalpower.ar/cdn/digitalpower.css">
|
||||||
<router-link to="/about">About</router-link>
|
</head>
|
||||||
</nav>
|
<div class="window-container">
|
||||||
<router-view />
|
<div id="title-bar" noselect></div>
|
||||||
|
<Nav/>
|
||||||
|
<router-view/>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from 'vue';
|
import {onMounted, ref} from 'vue';
|
||||||
import {useRouter} from 'vue-router';
|
import {useRouter} from 'vue-router';
|
||||||
|
import Nav from "@/components/app/Nav.vue";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@@ -18,6 +22,16 @@ onMounted(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
:root {
|
||||||
|
--header-height: 150px !important;
|
||||||
|
--app-shadow: rgba(0, 0, 0, 0.45);
|
||||||
|
--navmenu-height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
#app {
|
#app {
|
||||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
font-family: Avenir, Helvetica, Arial, sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
@@ -38,4 +52,63 @@ nav {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
padding: 2em;
|
||||||
|
width: 1024px;
|
||||||
|
height: 720px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-container {
|
||||||
|
box-shadow: 0px 0px 20px 0px #0a0a0a;
|
||||||
|
border-radius: 15px;
|
||||||
|
width: 1024px;
|
||||||
|
height: 720px;
|
||||||
|
background: white;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#title-bar {
|
||||||
|
-webkit-app-region: drag;
|
||||||
|
height: 20px;
|
||||||
|
background: var(--primary);
|
||||||
|
color: white;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-wrapper::after {
|
||||||
|
content: ">" !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideOut {
|
||||||
|
from {
|
||||||
|
transform: translateX(0);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave-active {
|
||||||
|
transition: opacity var(--duration), transform var(--duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave-to {
|
||||||
|
animation: slideOut var(--duration) forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
[selectedNav="true"] {
|
||||||
|
background: white;
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
color: var(--text-color) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
16
src/components/app/Layout.vue
Normal file
16
src/components/app/Layout.vue
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<script setup>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div id="app-layout">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
#app-layout {
|
||||||
|
padding: 1em 2em;
|
||||||
|
height: calc(100vh - var(--header-height));
|
||||||
|
}
|
||||||
|
</style>
|
||||||
127
src/components/app/Nav.vue
Normal file
127
src/components/app/Nav.vue
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
<script setup>
|
||||||
|
import NavMenu from "@/components/app/NavMenu.vue";
|
||||||
|
import {ref} from "vue";
|
||||||
|
import {useUi} from "@/pinia/ui";
|
||||||
|
import {useRouter} from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const ui = useUi();
|
||||||
|
const options = ref([
|
||||||
|
{
|
||||||
|
name: "Aplicacion", items: [
|
||||||
|
{name: "Manual"},
|
||||||
|
{name: "Solicitar Ayuda"},
|
||||||
|
{name: "Digital Power"},
|
||||||
|
{
|
||||||
|
name: "Cerrar",
|
||||||
|
callback: () => {
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Productos", items: [
|
||||||
|
{name: "Agregar Producto"},
|
||||||
|
{name: "Generar Venta"},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Imprimir",
|
||||||
|
items: [
|
||||||
|
{name: "Listado de productos"},
|
||||||
|
{name: "Estadisticas"},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Estadisticas",
|
||||||
|
items: [],
|
||||||
|
url: '/',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
function openMenu(items, name, url) {
|
||||||
|
ui.setCurrentMenu(null);
|
||||||
|
if (!items) return;
|
||||||
|
if (url) {
|
||||||
|
router.push(url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setTimeout(() => {
|
||||||
|
ui.setCurrentMenu(items);
|
||||||
|
ui.selectedMenu = name;
|
||||||
|
}, 5)
|
||||||
|
setTimeout(() => {
|
||||||
|
let $menu = document.querySelector("#menu-dropdown");
|
||||||
|
let $option = document.querySelector("#" + name);
|
||||||
|
const rect = ($option.getBoundingClientRect())
|
||||||
|
|
||||||
|
$menu.setAttribute("style", `
|
||||||
|
position: fixed;
|
||||||
|
left: ${rect.left}px;
|
||||||
|
bottom: ${rect.bottom}px;
|
||||||
|
top: ${rect.top + rect.height}px;
|
||||||
|
`)
|
||||||
|
}, 20)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleClick(item) {
|
||||||
|
item?.callback();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<nav>
|
||||||
|
<div class="list" noselect>
|
||||||
|
<div class="item" :selectedNav="opt.name === ui.selectedMenu" :id="opt?.name" v-for="(opt, key) in options" :key
|
||||||
|
@click="openMenu(opt?.items, opt?.name, opt?.url)"><p>
|
||||||
|
{{
|
||||||
|
opt?.name
|
||||||
|
}}</p></div>
|
||||||
|
</div>
|
||||||
|
<NavMenu @callback="handleClick" v-if="ui.currentMenu"></NavMenu>
|
||||||
|
</nav>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
nav {
|
||||||
|
background: var(--primary);
|
||||||
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
|
padding: 0;
|
||||||
|
z-index: 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
justify-content: start;
|
||||||
|
align-items: end;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
transition: var(--duration);
|
||||||
|
border-top-right-radius: 15px;
|
||||||
|
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
background: white;
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
transition: var(--duration);
|
||||||
|
margin: 0;
|
||||||
|
padding: 1em;
|
||||||
|
border-top-right-radius: 15px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
54
src/components/app/NavMenu.vue
Normal file
54
src/components/app/NavMenu.vue
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<script setup>
|
||||||
|
import {useUi} from "@/pinia/ui";
|
||||||
|
|
||||||
|
const emits = defineEmits(["callback"]);
|
||||||
|
const ui = useUi();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="nav-menu" id="menu-dropdown">
|
||||||
|
<div v-for="(item, key) in ui.currentMenu" :key class="item" @click="emits('callback', item)">
|
||||||
|
{{ item?.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.nav-menu {
|
||||||
|
width: 250px;
|
||||||
|
height: var(--navmenu-height);
|
||||||
|
|
||||||
|
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.4);
|
||||||
|
background: white;
|
||||||
|
border-bottom-left-radius: 15px;
|
||||||
|
border-bottom-right-radius: 15px;
|
||||||
|
|
||||||
|
animation: fade .2s ease-in-out forwards;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
padding: .5em 1em;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
text-align: left;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
transition: var(--duration);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: white;
|
||||||
|
background: var(--primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
height: 0
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
height: var(--navmenu-height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
34
src/components/productos/Filters.vue
Normal file
34
src/components/productos/Filters.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<script setup>
|
||||||
|
import {Input} from 'vuedigitalpowerui'
|
||||||
|
import {ref} from "vue";
|
||||||
|
|
||||||
|
const emits = defineEmits(["search"]);
|
||||||
|
const props = defineProps(["filters"])
|
||||||
|
const filter = ref("");
|
||||||
|
const value = ref("");
|
||||||
|
|
||||||
|
function search() {
|
||||||
|
emits("search", {filter: filter.value, value: value.value})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div id="filters" class="mt-3">
|
||||||
|
<form @submit.prevent="search" flex gapped flex-wrap>
|
||||||
|
<Input class="filter" type="select" v-model="filter" :options="filters"/>
|
||||||
|
<Input class="filter" placeholder="Busqueda" v-model="value"/>
|
||||||
|
<Input type="button" value="Buscar" background="var(--primary)" color="white" @click="search"/>
|
||||||
|
<Input type="button" value="Limpiar" background="var(--primary)" color="white"/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
#filters {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter {
|
||||||
|
width: 250px !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
86
src/components/productos/Table.vue
Normal file
86
src/components/productos/Table.vue
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<script setup>
|
||||||
|
import {useUi} from "@/pinia/ui";
|
||||||
|
|
||||||
|
const props = defineProps(["items", "headers"])
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div id="table-container" radius-border>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th v-for="(head, key) in headers" :key>{{ head?.name }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="(item, key) in items">
|
||||||
|
<td v-for="(head, key) in headers" :class="head">{{ item?.[head?.name] }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
#table-container {
|
||||||
|
box-shadow: 0px 0px 5px 0px var(--app-shadow);
|
||||||
|
border-radius: 15px;
|
||||||
|
height: 80%;
|
||||||
|
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead > tr > th {
|
||||||
|
border-top: none;
|
||||||
|
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody > tr {
|
||||||
|
transition: var(--duration);
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
& > td {
|
||||||
|
border-bottom: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--primary);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
padding: 1em 2em;
|
||||||
|
//border: 1px solid var(--text-color);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.27);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 1em 2em;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.27);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Nombre {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -2,7 +2,13 @@ import {createApp} from 'vue'
|
|||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
import {createPinia} from "pinia";
|
import {createPinia} from "pinia";
|
||||||
|
import "../src/styles/digitalpower.css"
|
||||||
|
import 'boxicons'
|
||||||
|
import * as bootstrap from 'bootstrap'
|
||||||
|
import 'bootstrap'
|
||||||
|
import 'bootstrap/dist/css/bootstrap.min.css'
|
||||||
|
import 'jquery/src/jquery.js'
|
||||||
|
import 'bootstrap/dist/js/bootstrap.min.js'
|
||||||
|
|
||||||
const pinia = createPinia();
|
const pinia = createPinia();
|
||||||
const app = createApp(App).use(pinia).use(router).mount('#app')
|
const app = createApp(App).use(pinia).use(router).mount('#app')
|
||||||
|
|||||||
15
src/pinia/ui.js
Normal file
15
src/pinia/ui.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import {defineStore} from "pinia";
|
||||||
|
|
||||||
|
export const useUi = defineStore('ui', {
|
||||||
|
state: () => ({
|
||||||
|
currentMenu: null,
|
||||||
|
selectedMenu: null,
|
||||||
|
}),
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
setCurrentMenu(state) {
|
||||||
|
if (!state) this.selectedMenu = null;
|
||||||
|
this.currentMenu = state;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
662
src/styles/digitalpower.css
Normal file
662
src/styles/digitalpower.css
Normal file
@@ -0,0 +1,662 @@
|
|||||||
|
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: "Poppins", sans-serif;
|
||||||
|
/* Esto afectará a cualquier scrollbar en tu página web */
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 3px;
|
||||||
|
height: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Track */
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: var(--gray-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle */
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle on hover */
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: var(--secondary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--gray: rgba(0, 0, 0, 0.3);
|
||||||
|
--gray-light: rgba(0, 0, 0, 0.1);
|
||||||
|
--gray-very-light: rgba(0, 0, 0, 0.08);
|
||||||
|
--primary-blue: #3a7ca5;
|
||||||
|
--primary: dodgerblue;
|
||||||
|
--primary-active-item: #efefef;
|
||||||
|
--secondary: #0887a1;
|
||||||
|
--red: #d14c4c;
|
||||||
|
--back-color: white;
|
||||||
|
--text-color: rgba(62, 62, 62, 0.7);
|
||||||
|
--sidebar-color: dodgerblue;
|
||||||
|
--sidebar-color-hover: white;
|
||||||
|
--input-bg: white;
|
||||||
|
--input-button: #efefef;
|
||||||
|
--input-bg-hover: #dbdbdb;
|
||||||
|
--shadow: 0px 0px 5px 0px var(--gray);
|
||||||
|
|
||||||
|
--admin-title-height: 67px;
|
||||||
|
--duration: 0.3s;
|
||||||
|
|
||||||
|
--header-height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
background: var(--back-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#app-layout {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#notification-container {
|
||||||
|
position: fixed;
|
||||||
|
top: calc(var(--header-height) + 1.5em);
|
||||||
|
right: 0;
|
||||||
|
margin-right: 1em;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, p, b {
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background: lightgray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-enter-active,
|
||||||
|
.page-leave-active {
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-enter-from,
|
||||||
|
.page-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-modal-html {
|
||||||
|
width: 80vw;
|
||||||
|
height: fit-content;
|
||||||
|
max-height: 100vh;
|
||||||
|
max-width: 100vh;
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 200000;
|
||||||
|
color: var(--text-color);
|
||||||
|
background: var(--back-color);
|
||||||
|
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
.title {
|
||||||
|
padding: 0.5em;
|
||||||
|
border-bottom: 1px solid var(--gray);
|
||||||
|
|
||||||
|
h5,
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 2em;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actions {
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: dodgerblue;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active-item {
|
||||||
|
background: var(--secondary);
|
||||||
|
color: var(--sidebar-color-hover) !important;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
fill: var(--sidebar-color-hover) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification {
|
||||||
|
padding: 1em;
|
||||||
|
background: var(--primary);
|
||||||
|
color: white;
|
||||||
|
margin: 1em 0;
|
||||||
|
min-width: 200px;
|
||||||
|
|
||||||
|
pointer-events: none;
|
||||||
|
user-select: none;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-enter {
|
||||||
|
animation-name: notificationAnimationEnter;
|
||||||
|
animation-duration: 0.25s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-exit {
|
||||||
|
animation-name: notificationAnimationExit;
|
||||||
|
animation-duration: 0.25s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ck-editor {
|
||||||
|
display: block;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ck {
|
||||||
|
color: var(--text-color) !important;
|
||||||
|
background: var(--input-bg) !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red {
|
||||||
|
background: var(--red) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[limited-text] {
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[flex] {
|
||||||
|
display: flex !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[flex-wrap] {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[nopointer] {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[subitem] {
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
[groupitem] {
|
||||||
|
border-bottom: 1px solid var(--gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
[grouplabel] {
|
||||||
|
background: var(--gray-light);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
[menuitem] {
|
||||||
|
border-bottom: 1px solid var(--gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
[menuitem],
|
||||||
|
[subitem] {
|
||||||
|
transition: 0.2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--secondary);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[shadow] {
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
[borderbottom] {
|
||||||
|
border-bottom: 1px solid var(--gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
[bordered] {
|
||||||
|
border: 1px solid var(--gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
[radius-border] {
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[bound] {
|
||||||
|
background: var(--gray-light);
|
||||||
|
background-image: linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 20%,
|
||||||
|
var(--gray-very-light) 60%
|
||||||
|
);
|
||||||
|
background-size: 200% 100%;
|
||||||
|
transition: background-position 0.2s ease-out;
|
||||||
|
animation: boundAnimation 2s ease infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
[custominput] {
|
||||||
|
border: 1px solid var(--gray-light);
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border: 1px solid var(--gray);
|
||||||
|
box-shadow: 0px 0px 5px 0px var(--gray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[customselect] {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
select {
|
||||||
|
padding: 0.6em 1em;
|
||||||
|
width: 100%;
|
||||||
|
appearance: none;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-wrapper {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "â–¼";
|
||||||
|
font-size: 1rem;
|
||||||
|
top: 50%;
|
||||||
|
right: 1em;
|
||||||
|
position: absolute;
|
||||||
|
color: var(--gray);
|
||||||
|
|
||||||
|
transform: translateY(-50%);
|
||||||
|
|
||||||
|
z-index: 100000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-button-html {
|
||||||
|
padding: 0.6em 1.5em;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1em;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
width: fit-content;
|
||||||
|
|
||||||
|
transition: 0.2s;
|
||||||
|
|
||||||
|
color: white;
|
||||||
|
background: var(--primary);
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
filter: brightness(0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[flex-center] {
|
||||||
|
display: flex !important;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
[flex-start] {
|
||||||
|
display: flex !important;
|
||||||
|
align-items: start;
|
||||||
|
justify-content: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
[flex-column] {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
[block-center] {
|
||||||
|
display: block;
|
||||||
|
margin: auto;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
[overlay] {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
|
||||||
|
z-index: 15;
|
||||||
|
background: var(--gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
[inside-verlay] {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
display: none;
|
||||||
|
transition: var(--duration);
|
||||||
|
|
||||||
|
z-index: 15;
|
||||||
|
background: rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
[fade] {
|
||||||
|
animation-name: fadeAnim;
|
||||||
|
animation-duration: 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
[delayedfade] {
|
||||||
|
animation: fadeAnim 0.2s forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[absolute-centered] {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
[list] {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[gapped] {
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
[noselect] {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[underline] {
|
||||||
|
/*
|
||||||
|
border-bottom: 1px solid var(--primary);
|
||||||
|
|
||||||
|
*/
|
||||||
|
padding-bottom: 10px;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 2px;
|
||||||
|
background: var(--primary);
|
||||||
|
|
||||||
|
animation-name: underlineAnim;
|
||||||
|
animation-duration: var(--duration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[nowrap] {
|
||||||
|
text-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[pointer] {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
[select] {
|
||||||
|
user-select: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
[slide] {
|
||||||
|
animation: slide;
|
||||||
|
animation-duration: var(--duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[slideRight] {
|
||||||
|
animation: slideRight;
|
||||||
|
animation-duration: var(--duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[slideUp] {
|
||||||
|
animation: slideUp;
|
||||||
|
animation-duration: var(--duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[slideDown] {
|
||||||
|
animation: slideDown;
|
||||||
|
animation-duration: var(--duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[fixed] {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 100;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
border: 3px solid;
|
||||||
|
border-color: #fff #fff transparent transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader::after,
|
||||||
|
.loader::before {
|
||||||
|
content: "";
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
margin: auto;
|
||||||
|
border: 3px solid;
|
||||||
|
border-color: transparent transparent var(--primary-blue) var(--primary-blue);
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotationBack 0.5s linear infinite;
|
||||||
|
transform-origin: center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader::before {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-color: #fff #fff transparent transparent;
|
||||||
|
animation: rotation 1.5s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotationBack {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(-360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes prixClipFix {
|
||||||
|
0% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0);
|
||||||
|
}
|
||||||
|
75%,
|
||||||
|
100% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes boundAnimation {
|
||||||
|
0% {
|
||||||
|
background-position: 0 0;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
background-position: 100% 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes notificationAnimationEnter {
|
||||||
|
0% {
|
||||||
|
transform: translateX(150%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateX(0%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes notificationAnimationExit {
|
||||||
|
0% {
|
||||||
|
transform: translateX(0%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateX(150%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeAnim {
|
||||||
|
0% {
|
||||||
|
opacity: 0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes underlineAnim {
|
||||||
|
0% {
|
||||||
|
width: 0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slide {
|
||||||
|
0% {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateX(0%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideRight {
|
||||||
|
0% {
|
||||||
|
transform: translateX(100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateX(0%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideUp {
|
||||||
|
0% {
|
||||||
|
transform: translateY(100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateY(0%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideDown {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateY(0%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1000px) {
|
||||||
|
.dp-container {
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-modal-html {
|
||||||
|
height: 60vh;
|
||||||
|
|
||||||
|
.actions {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5em !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,49 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="home">
|
<Layout @click="handleClick">
|
||||||
<img alt="Vue logo" src="../assets/logo.png">
|
<Table :headers :items="productos"></Table>
|
||||||
<HelloWorld msg="Welcome to Your Vue.js App"/>
|
<Filters :filters="headers"></Filters>
|
||||||
</div>
|
</Layout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import HelloWorld from '@/components/HelloWorld.vue'
|
import Layout from "@/components/app/Layout.vue";
|
||||||
|
import Table from "@/components/productos/Table.vue";
|
||||||
|
import {computed, onMounted, ref} from "vue";
|
||||||
|
import Filters from "@/components/productos/Filters.vue";
|
||||||
|
import {useUi} from "@/pinia/ui";
|
||||||
|
|
||||||
|
const ui = useUi();
|
||||||
|
const headers = computed(() => {
|
||||||
|
const producto = productos.value?.[0];
|
||||||
|
if (!producto) return [];
|
||||||
|
|
||||||
|
return Object.keys(producto).map((x) => {
|
||||||
|
return {value: x, name: x};
|
||||||
|
})
|
||||||
|
})
|
||||||
|
const productos = ref([
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
{Nombre: "Producto de prueba de longitud", Precio: "Precio", Stock: "Stock", Vendidos: 0, Acciones: 0},
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
function handleClick() {
|
||||||
|
ui.setCurrentMenu(null)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user