Init config #68
35
.eslintrc.js
35
.eslintrc.js
|
@ -7,15 +7,14 @@ module.exports = {
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
parser: '@babel/eslint-parser',
|
parser: '@babel/eslint-parser',
|
||||||
ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
|
ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
|
||||||
sourceType: 'module' // Allows for the use of imports
|
sourceType: 'module', // Allows for the use of imports
|
||||||
},
|
},
|
||||||
|
|
||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
'vue/setup-compiler-macros': true
|
'vue/setup-compiler-macros': true,
|
||||||
},
|
},
|
||||||
|
|
||||||
// Rules order is important, please avoid shuffling them
|
|
||||||
extends: [
|
extends: [
|
||||||
// Base ESLint recommended rules
|
// Base ESLint recommended rules
|
||||||
// 'eslint:recommended',
|
// 'eslint:recommended',
|
||||||
|
@ -31,12 +30,9 @@ module.exports = {
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
plugins: [
|
|
||||||
// https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
|
|
||||||
// required to lint *.vue files
|
|
||||||
'vue',
|
|
||||||
|
|
||||||
],
|
|
||||||
|
plugins: ['vue', 'prettier'],
|
||||||
|
|
||||||
globals: {
|
globals: {
|
||||||
ga: 'readonly', // Google Analytics
|
ga: 'readonly', // Google Analytics
|
||||||
|
@ -48,12 +44,11 @@ module.exports = {
|
||||||
__QUASAR_SSR_PWA__: 'readonly',
|
__QUASAR_SSR_PWA__: 'readonly',
|
||||||
process: 'readonly',
|
process: 'readonly',
|
||||||
Capacitor: 'readonly',
|
Capacitor: 'readonly',
|
||||||
chrome: 'readonly'
|
chrome: 'readonly',
|
||||||
},
|
},
|
||||||
|
|
||||||
// add your custom rules here
|
// add your custom rules here
|
||||||
rules: {
|
rules: {
|
||||||
|
|
||||||
// allow async-await
|
// allow async-await
|
||||||
'generator-star-spacing': 'off',
|
'generator-star-spacing': 'off',
|
||||||
// allow paren-less arrow functions
|
// allow paren-less arrow functions
|
||||||
|
@ -72,8 +67,20 @@ module.exports = {
|
||||||
'import/no-extraneous-dependencies': 'off',
|
'import/no-extraneous-dependencies': 'off',
|
||||||
|
|
||||||
'prefer-promise-reject-errors': 'off',
|
'prefer-promise-reject-errors': 'off',
|
||||||
|
semi: 'off',
|
||||||
// allow debugger during development only
|
// allow debugger during development only
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||||
}
|
},
|
||||||
}
|
overrides: [
|
||||||
|
{
|
||||||
|
extends: [
|
||||||
|
'plugin:vue/vue3-essential',
|
||||||
|
],
|
||||||
|
files: ['src/**/*.{js,vue,scss}'], // Aplica ESLint solo a archivos .js y .vue dentro de src
|
||||||
|
rules: {
|
||||||
|
semi: 'off',
|
||||||
|
indent: ['error', 4, { SwitchCase: 1 }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
module.exports = {
|
||||||
|
printWidth: 80,
|
||||||
|
tabWidth: 4,
|
||||||
|
useTabs: false,
|
||||||
|
singleQuote: true,
|
||||||
|
trailingComma: 'all',
|
||||||
|
bracketSpacing: true,
|
||||||
|
arrowParens: 'avoid',
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
|
@ -17,12 +17,14 @@
|
||||||
"assets-webpack-plugin": "^7.1.1",
|
"assets-webpack-plugin": "^7.1.1",
|
||||||
"babel-loader": "^9.1.0",
|
"babel-loader": "^9.1.0",
|
||||||
"bundle-loader": "^0.5.6",
|
"bundle-loader": "^0.5.6",
|
||||||
"eslint": "^8.10.0",
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-config-standard": "^17.0.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-plugin-import": "^2.19.1",
|
"eslint-plugin-import": "^2.19.1",
|
||||||
"eslint-plugin-n": "^15.0.0",
|
"eslint-plugin-n": "^15.0.0",
|
||||||
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-promise": "^6.0.0",
|
"eslint-plugin-promise": "^6.0.0",
|
||||||
"eslint-plugin-vue": "^9.0.0",
|
"eslint-plugin-vue": "^9.27.0",
|
||||||
"eslint-webpack-plugin": "^3.1.1",
|
"eslint-webpack-plugin": "^3.1.1",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"fs-extra": "^10.1.0",
|
"fs-extra": "^10.1.0",
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
export default async ({ app }) => {
|
export default async ({ app }) => {
|
||||||
/*
|
/*
|
||||||
window.addEventListener('error',
|
window.addEventListener('error',
|
||||||
e => onWindowError(e));
|
e => onWindowError(e));
|
||||||
window.addEventListener('unhandledrejection',
|
window.addEventListener('unhandledrejection',
|
||||||
|
|
|
@ -28,7 +28,7 @@ a.link {
|
||||||
}
|
}
|
||||||
.q-card {
|
.q-card {
|
||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
box-shadow: 0 0 3px rgba(0, 0, 0, .1);
|
box-shadow: 0 0 3px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
.q-page-sticky.fixed-bottom-right {
|
.q-page-sticky.fixed-bottom-right {
|
||||||
margin: 18px;
|
margin: 18px;
|
||||||
|
|
|
@ -12,17 +12,17 @@
|
||||||
// to match your app's branding.
|
// to match your app's branding.
|
||||||
// Tip: Use the "Theme Builder" on Quasar's documentation website.
|
// Tip: Use the "Theme Builder" on Quasar's documentation website.
|
||||||
|
|
||||||
$primary : #1A1A1A;
|
$primary: #1a1a1a;
|
||||||
$secondary : #26A69A;
|
$secondary: #26a69a;
|
||||||
$accent : #8cc63f;
|
$accent: #8cc63f;
|
||||||
|
|
||||||
$dark : #1D1D1D;
|
$dark: #1d1d1d;
|
||||||
$dark-page : #121212;
|
$dark-page: #121212;
|
||||||
|
|
||||||
$positive : #21BA45;
|
$positive: #21ba45;
|
||||||
$negative : #C10015;
|
$negative: #c10015;
|
||||||
$info : #31CCEC;
|
$info: #31ccec;
|
||||||
$warning : #F2C037;
|
$warning: #f2c037;
|
||||||
|
|
||||||
// Width
|
// Width
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
%margin-auto {
|
%margin-auto {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
|
|
@ -22,15 +22,7 @@ export default {
|
||||||
'Friday',
|
'Friday',
|
||||||
'Saturday'
|
'Saturday'
|
||||||
],
|
],
|
||||||
daysShort: [
|
daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
||||||
'Sun',
|
|
||||||
'Mon',
|
|
||||||
'Tue',
|
|
||||||
'Wed',
|
|
||||||
'Thu',
|
|
||||||
'Fri',
|
|
||||||
'Sat'
|
|
||||||
],
|
|
||||||
months: [
|
months: [
|
||||||
'January',
|
'January',
|
||||||
'February',
|
'February',
|
||||||
|
|
|
@ -22,15 +22,7 @@ export default {
|
||||||
'Viernes',
|
'Viernes',
|
||||||
'Sábado'
|
'Sábado'
|
||||||
],
|
],
|
||||||
daysShort: [
|
daysShort: ['Do', 'Lu', 'Mi', 'Mi', 'Ju', 'Vi', 'Sa'],
|
||||||
'Do',
|
|
||||||
'Lu',
|
|
||||||
'Mi',
|
|
||||||
'Mi',
|
|
||||||
'Ju',
|
|
||||||
'Vi',
|
|
||||||
'Sa'
|
|
||||||
],
|
|
||||||
months: [
|
months: [
|
||||||
'Enero',
|
'Enero',
|
||||||
'Febrero',
|
'Febrero',
|
||||||
|
|
|
@ -57,8 +57,10 @@ export class Connection extends JsonConnection {
|
||||||
})
|
})
|
||||||
|
|
||||||
for (let j = 0; j < rows.length; j++) {
|
for (let j = 0; j < rows.length; j++) {
|
||||||
const row = data[j] = {}
|
const row = (data[j] = {})
|
||||||
for (let k = 0; k < columns.length; k++) { row[columns[k].name] = rows[j][k] }
|
for (let k = 0; k < columns.length; k++) {
|
||||||
|
row[columns[k].name] = rows[j][k]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let j = 0; j < columns.length; j++) {
|
for (let j = 0; j < columns.length; j++) {
|
||||||
|
@ -74,14 +76,20 @@ export class Connection extends JsonConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (castFunc !== null) {
|
if (castFunc !== null) {
|
||||||
if (col.def != null) { col.def = castFunc(col.def) }
|
if (col.def != null) {
|
||||||
|
col.def = castFunc(col.def)
|
||||||
|
}
|
||||||
|
|
||||||
for (let k = 0; k < data.length; k++) {
|
for (let k = 0; k < data.length; k++) {
|
||||||
if (data[k][col.name] != null) { data[k][col.name] = castFunc(data[k][col.name]) }
|
if (data[k][col.name] != null) {
|
||||||
|
data[k][col.name] = castFunc(data[k][col.name])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { results.push(json[i]) }
|
}
|
||||||
|
} else {
|
||||||
|
results.push(json[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -100,7 +108,7 @@ export class Connection extends JsonConnection {
|
||||||
* @return {ResultSet} The result
|
* @return {ResultSet} The result
|
||||||
*/
|
*/
|
||||||
async execQuery (query, params) {
|
async execQuery (query, params) {
|
||||||
const sql = query.replace(/#\w+/g, key => {
|
const sql = query.replace(/#\w+/g, (key) => {
|
||||||
const value = params[key.substring(1)]
|
const value = params[key.substring(1)]
|
||||||
return value ? this.renderValue(value) : key
|
return value ? this.renderValue(value) : key
|
||||||
})
|
})
|
||||||
|
@ -128,7 +136,7 @@ export class Connection extends JsonConnection {
|
||||||
case 'number':
|
case 'number':
|
||||||
return v
|
return v
|
||||||
case 'boolean':
|
case 'boolean':
|
||||||
return (v) ? 'TRUE' : 'FALSE'
|
return v ? 'TRUE' : 'FALSE'
|
||||||
case 'string':
|
case 'string':
|
||||||
return "'" + v.replace(this.regexp, this.replaceFunc) + "'"
|
return "'" + v.replace(this.regexp, this.replaceFunc) + "'"
|
||||||
default:
|
default:
|
||||||
|
@ -136,8 +144,12 @@ export class Connection extends JsonConnection {
|
||||||
if (!isNaN(v.getTime())) {
|
if (!isNaN(v.getTime())) {
|
||||||
const unixTime = parseInt(fixTz(v).getTime() / 1000)
|
const unixTime = parseInt(fixTz(v).getTime() / 1000)
|
||||||
return 'DATE(FROM_UNIXTIME(' + unixTime + '))'
|
return 'DATE(FROM_UNIXTIME(' + unixTime + '))'
|
||||||
} else { return '0000-00-00' }
|
} else {
|
||||||
} else { return 'NULL' }
|
return '0000-00-00'
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 'NULL'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,16 +163,14 @@ export class Connection extends JsonConnection {
|
||||||
|
|
||||||
// TODO: Read time zone from db configuration
|
// TODO: Read time zone from db configuration
|
||||||
const tz = { timeZone: 'Europe/Madrid' }
|
const tz = { timeZone: 'Europe/Madrid' }
|
||||||
const isLocal = Intl
|
const isLocal = Intl.DateTimeFormat().resolvedOptions().timeZone === tz.timeZone
|
||||||
.DateTimeFormat()
|
|
||||||
.resolvedOptions()
|
|
||||||
.timeZone === tz.timeZone
|
|
||||||
|
|
||||||
function fixTz (date) {
|
function fixTz (date) {
|
||||||
if (isLocal) return date
|
if (isLocal) return date
|
||||||
|
|
||||||
const localDate = new Date(date.toLocaleString('en-US', tz))
|
const localDate = new Date(date.toLocaleString('en-US', tz))
|
||||||
const hasTime = localDate.getHours() ||
|
const hasTime =
|
||||||
|
localDate.getHours() ||
|
||||||
localDate.getMinutes() ||
|
localDate.getMinutes() ||
|
||||||
localDate.getSeconds() ||
|
localDate.getSeconds() ||
|
||||||
localDate.getMilliseconds()
|
localDate.getMilliseconds()
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
import { Result } from './result'
|
import { Result } from './result'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,10 +25,13 @@ export class ResultSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch () {
|
fetch () {
|
||||||
if (this.error) { throw this.error }
|
if (this.error) {
|
||||||
|
throw this.error
|
||||||
|
}
|
||||||
|
|
||||||
if (this.results !== null &&
|
if (this.results !== null && this.results.length > 0) {
|
||||||
this.results.length > 0) { return this.results.shift() }
|
return this.results.shift()
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -61,9 +63,13 @@ export class ResultSet {
|
||||||
fetchObject () {
|
fetchObject () {
|
||||||
const result = this.fetch()
|
const result = this.fetch()
|
||||||
|
|
||||||
if (result !== null &&
|
if (
|
||||||
|
result !== null &&
|
||||||
result.data instanceof Array &&
|
result.data instanceof Array &&
|
||||||
result.data.length > 0) { return result.data[0] }
|
result.data.length > 0
|
||||||
|
) {
|
||||||
|
return result.data[0]
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -76,8 +82,7 @@ export class ResultSet {
|
||||||
fetchData () {
|
fetchData () {
|
||||||
const result = this.fetch()
|
const result = this.fetch()
|
||||||
|
|
||||||
if (result !== null &&
|
if (result !== null && result.data instanceof Array) {
|
||||||
result.data instanceof Array) {
|
|
||||||
return result.data
|
return result.data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +97,9 @@ export class ResultSet {
|
||||||
fetchValue () {
|
fetchValue () {
|
||||||
const row = this.fetchRow()
|
const row = this.fetchRow()
|
||||||
|
|
||||||
if (row instanceof Array && row.length > 0) { return row[0] }
|
if (row instanceof Array && row.length > 0) {
|
||||||
|
return row[0]
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -105,9 +112,11 @@ export class ResultSet {
|
||||||
fetchRow () {
|
fetchRow () {
|
||||||
const result = this.fetch()
|
const result = this.fetch()
|
||||||
|
|
||||||
if (result !== null &&
|
if (
|
||||||
|
result !== null &&
|
||||||
result.data instanceof Array &&
|
result.data instanceof Array &&
|
||||||
result.data.length > 0) {
|
result.data.length > 0
|
||||||
|
) {
|
||||||
const object = result.data[0]
|
const object = result.data[0]
|
||||||
const row = new Array(result.columns.length)
|
const row = new Array(result.columns.length)
|
||||||
for (let i = 0; i < row.length; i++) {
|
for (let i = 0; i < row.length; i++) {
|
||||||
|
|
|
@ -19,7 +19,9 @@ export class Result {
|
||||||
col.index = i
|
col.index = i
|
||||||
this.columnMap[col.name] = col
|
this.columnMap[col.name] = col
|
||||||
}
|
}
|
||||||
} else { this.columnMap = null }
|
} else {
|
||||||
|
this.columnMap = null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,7 +56,9 @@ export class Result {
|
||||||
next () {
|
next () {
|
||||||
this.row++
|
this.row++
|
||||||
|
|
||||||
if (this.row >= this.data.length) { return false }
|
if (this.row >= this.data.length) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
import { VnObject } from './object'
|
import { VnObject } from './object'
|
||||||
import { JsonException } from './json-exception'
|
import { JsonException } from './json-exception'
|
||||||
|
|
||||||
|
@ -34,7 +33,9 @@ export class JsonConnection extends VnObject {
|
||||||
const elements = form.elements
|
const elements = form.elements
|
||||||
|
|
||||||
for (let i = 0; i < elements.length; i++) {
|
for (let i = 0; i < elements.length; i++) {
|
||||||
if (elements[i].name) { params[elements[i].name] = elements[i].value }
|
if (elements[i].name) {
|
||||||
|
params[elements[i].name] = elements[i].value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.sendWithUrl('POST', form.action, params)
|
return this.sendWithUrl('POST', form.action, params)
|
||||||
|
@ -93,32 +94,39 @@ export class JsonConnection extends VnObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
const promise = new Promise((resolve, reject) => {
|
const promise = new Promise((resolve, reject) => {
|
||||||
request.onreadystatechange =
|
request.onreadystatechange = () =>
|
||||||
() => this._onStateChange(request, resolve, reject)
|
this._onStateChange(request, resolve, reject)
|
||||||
})
|
})
|
||||||
|
|
||||||
request.send(config.data)
|
request.send(config.data)
|
||||||
|
|
||||||
this._requestsCount++
|
this._requestsCount++
|
||||||
|
|
||||||
if (this._requestsCount === 1) { this.emit('loading-changed', true) }
|
if (this._requestsCount === 1) {
|
||||||
|
this.emit('loading-changed', true)
|
||||||
|
}
|
||||||
|
|
||||||
return promise
|
return promise
|
||||||
}
|
}
|
||||||
|
|
||||||
_onStateChange (request, resolve, reject) {
|
_onStateChange (request, resolve, reject) {
|
||||||
if (request.readyState !== 4) { return }
|
if (request.readyState !== 4) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this._requestsCount--
|
this._requestsCount--
|
||||||
|
|
||||||
if (this._requestsCount === 0) { this.emit('loading-changed', false) }
|
if (this._requestsCount === 0) {
|
||||||
|
this.emit('loading-changed', false)
|
||||||
|
}
|
||||||
|
|
||||||
let data = null
|
let data = null
|
||||||
let error = null
|
let error = null
|
||||||
try {
|
try {
|
||||||
if (request.status === 0) {
|
if (request.status === 0) {
|
||||||
const err = new JsonException()
|
const err = new JsonException()
|
||||||
err.message = 'The server does not respond, please check your Internet connection'
|
err.message =
|
||||||
|
'The server does not respond, please check your Internet connection'
|
||||||
err.statusCode = request.status
|
err.statusCode = request.status
|
||||||
throw err
|
throw err
|
||||||
}
|
}
|
||||||
|
@ -144,8 +152,12 @@ export class JsonConnection extends VnObject {
|
||||||
let json
|
let json
|
||||||
let jsData
|
let jsData
|
||||||
|
|
||||||
if (request.responseText) { json = JSON.parse(request.responseText) }
|
if (request.responseText) {
|
||||||
if (json) { jsData = json.data || json }
|
json = JSON.parse(request.responseText)
|
||||||
|
}
|
||||||
|
if (json) {
|
||||||
|
jsData = json.data || json
|
||||||
|
}
|
||||||
|
|
||||||
if (request.status >= 200 && request.status < 300) {
|
if (request.status >= 200 && request.status < 300) {
|
||||||
data = jsData
|
data = jsData
|
||||||
|
@ -181,6 +193,8 @@ export class JsonConnection extends VnObject {
|
||||||
if (error) {
|
if (error) {
|
||||||
this.emit('error', error)
|
this.emit('error', error)
|
||||||
reject(error)
|
reject(error)
|
||||||
} else { resolve(data) }
|
} else {
|
||||||
|
resolve(data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main base class. Manages the signal system. Objects based on this class
|
* The main base class. Manages the signal system. Objects based on this class
|
||||||
* can be instantiated declaratively using XML.
|
* can be instantiated declaratively using XML.
|
||||||
|
@ -45,7 +44,9 @@ export class VnObject {
|
||||||
* @param {Object} props Properties
|
* @param {Object} props Properties
|
||||||
*/
|
*/
|
||||||
setProperties (props) {
|
setProperties (props) {
|
||||||
for (const prop in props) { this[prop] = props[prop] }
|
for (const prop in props) {
|
||||||
|
this[prop] = props[prop]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,7 +63,9 @@ export class VnObject {
|
||||||
unref () {
|
unref () {
|
||||||
this._refCount--
|
this._refCount--
|
||||||
|
|
||||||
if (this._refCount === 0) { this._destroy() }
|
if (this._refCount === 0) {
|
||||||
|
this._destroy()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,14 +94,16 @@ export class VnObject {
|
||||||
*/
|
*/
|
||||||
on (id, callback, instance) {
|
on (id, callback, instance) {
|
||||||
if (!(callback instanceof Function)) {
|
if (!(callback instanceof Function)) {
|
||||||
console.warn('Vn.Object: Invalid callback for signal \'%s\'', id)
|
console.warn("Vn.Object: Invalid callback for signal '%s'", id)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this._signalInit()
|
this._signalInit()
|
||||||
let callbacks = this._thisArg.signals[id]
|
let callbacks = this._thisArg.signals[id]
|
||||||
|
|
||||||
if (!callbacks) { callbacks = this._thisArg.signals[id] = [] }
|
if (!callbacks) {
|
||||||
|
callbacks = this._thisArg.signals[id] = []
|
||||||
|
}
|
||||||
|
|
||||||
callbacks.push({
|
callbacks.push({
|
||||||
blocked: false,
|
blocked: false,
|
||||||
|
@ -115,15 +120,23 @@ export class VnObject {
|
||||||
* @param {boolean} block %true for lock the signal, %false for unlock
|
* @param {boolean} block %true for lock the signal, %false for unlock
|
||||||
*/
|
*/
|
||||||
blockSignal (id, callback, block, instance) {
|
blockSignal (id, callback, block, instance) {
|
||||||
if (!this._thisArg) { return }
|
if (!this._thisArg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const callbacks = this._thisArg.signals[id]
|
const callbacks = this._thisArg.signals[id]
|
||||||
|
|
||||||
if (!callbacks) { return }
|
if (!callbacks) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < callbacks.length; i++) {
|
for (let i = 0; i < callbacks.length; i++) {
|
||||||
if (callbacks[i].callback === callback &&
|
if (
|
||||||
callbacks[i].instance === instance) { callbacks[i].blocked = block }
|
callbacks[i].callback === callback &&
|
||||||
|
callbacks[i].instance === instance
|
||||||
|
) {
|
||||||
|
callbacks[i].blocked = block
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,19 +146,27 @@ export class VnObject {
|
||||||
* @param {string} id The signal identifier
|
* @param {string} id The signal identifier
|
||||||
*/
|
*/
|
||||||
emit (id) {
|
emit (id) {
|
||||||
if (!this._thisArg) { return }
|
if (!this._thisArg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const callbacks = this._thisArg.signals[id]
|
const callbacks = this._thisArg.signals[id]
|
||||||
|
|
||||||
if (!callbacks) { return }
|
if (!callbacks) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const callbackArgs = []
|
const callbackArgs = []
|
||||||
callbackArgs.push(this)
|
callbackArgs.push(this)
|
||||||
|
|
||||||
for (let i = 1; i < arguments.length; i++) { callbackArgs.push(arguments[i]) }
|
for (let i = 1; i < arguments.length; i++) {
|
||||||
|
callbackArgs.push(arguments[i])
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < callbacks.length; i++) {
|
for (let i = 0; i < callbacks.length; i++) {
|
||||||
if (!callbacks[i].blocked) { callbacks[i].callback.apply(callbacks[i].instance, callbackArgs) }
|
if (!callbacks[i].blocked) {
|
||||||
|
callbacks[i].callback.apply(callbacks[i].instance, callbackArgs)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,14 +178,20 @@ export class VnObject {
|
||||||
* @param {Object} instance The instance
|
* @param {Object} instance The instance
|
||||||
*/
|
*/
|
||||||
disconnect (id, callback, instance) {
|
disconnect (id, callback, instance) {
|
||||||
if (!this._thisArg) { return }
|
if (!this._thisArg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const callbacks = this._thisArg.signals[id]
|
const callbacks = this._thisArg.signals[id]
|
||||||
|
|
||||||
if (callbacks) {
|
if (callbacks) {
|
||||||
for (let i = callbacks.length; i--;) {
|
for (let i = callbacks.length; i--;) {
|
||||||
if (callbacks[i].callback === callback &&
|
if (
|
||||||
callbacks[i].instance === instance) { callbacks.splice(i, 1) }
|
callbacks[i].callback === callback &&
|
||||||
|
callbacks[i].instance === instance
|
||||||
|
) {
|
||||||
|
callbacks.splice(i, 1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,7 +202,9 @@ export class VnObject {
|
||||||
* @param {Object} instance The instance
|
* @param {Object} instance The instance
|
||||||
*/
|
*/
|
||||||
disconnectByInstance (instance) {
|
disconnectByInstance (instance) {
|
||||||
if (!this._thisArg) { return }
|
if (!this._thisArg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const signals = this._thisArg.signals
|
const signals = this._thisArg.signals
|
||||||
|
|
||||||
|
@ -184,7 +213,9 @@ export class VnObject {
|
||||||
|
|
||||||
if (callbacks) {
|
if (callbacks) {
|
||||||
for (let i = callbacks.length; i--;) {
|
for (let i = callbacks.length; i--;) {
|
||||||
if (callbacks[i].instance === instance) { callbacks.splice(i, 1) }
|
if (callbacks[i].instance === instance) {
|
||||||
|
callbacks.splice(i, 1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,11 +227,15 @@ export class VnObject {
|
||||||
* but should always call the parent method.
|
* but should always call the parent method.
|
||||||
*/
|
*/
|
||||||
_destroy () {
|
_destroy () {
|
||||||
if (!this._thisArg) { return }
|
if (!this._thisArg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const links = this._thisArg.links
|
const links = this._thisArg.links
|
||||||
|
|
||||||
for (const key in links) { this._unlink(links[key]) }
|
for (const key in links) {
|
||||||
|
this._unlink(links[key])
|
||||||
|
}
|
||||||
|
|
||||||
this._thisArg = null
|
this._thisArg = null
|
||||||
}
|
}
|
||||||
|
@ -219,15 +254,21 @@ export class VnObject {
|
||||||
const newObject = prop[key]
|
const newObject = prop[key]
|
||||||
const oldObject = this[key]
|
const oldObject = this[key]
|
||||||
|
|
||||||
if (oldObject) { this._unlink(oldObject) }
|
if (oldObject) {
|
||||||
|
this._unlink(oldObject)
|
||||||
|
}
|
||||||
|
|
||||||
this[key] = newObject
|
this[key] = newObject
|
||||||
|
|
||||||
if (newObject) {
|
if (newObject) {
|
||||||
links[key] = newObject.ref()
|
links[key] = newObject.ref()
|
||||||
|
|
||||||
for (const signal in handlers) { newObject.on(signal, handlers[signal], this) }
|
for (const signal in handlers) {
|
||||||
} else if (oldObject) { links[key] = undefined }
|
newObject.on(signal, handlers[signal], this)
|
||||||
|
}
|
||||||
|
} else if (oldObject) {
|
||||||
|
links[key] = undefined
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<q-layout id="bg" class="fullscreen row justify-center items-center layout-view scroll">
|
<q-layout
|
||||||
|
id="bg"
|
||||||
|
class="fullscreen row justify-center items-center layout-view scroll"
|
||||||
|
>
|
||||||
<div class="column q-pa-md row items-center justify-center">
|
<div class="column q-pa-md row items-center justify-center">
|
||||||
<router-view v-slot="{ Component }">
|
<router-view v-slot="{ Component }">
|
||||||
<transition>
|
<transition>
|
||||||
|
|
|
@ -8,67 +8,61 @@
|
||||||
round
|
round
|
||||||
icon="menu"
|
icon="menu"
|
||||||
aria-label="Menu"
|
aria-label="Menu"
|
||||||
@click="toggleLeftDrawer"/>
|
@click="toggleLeftDrawer"
|
||||||
|
/>
|
||||||
<q-toolbar-title>
|
<q-toolbar-title>
|
||||||
{{$app.title}}
|
{{ $app.title }}
|
||||||
<div
|
<div v-if="$app.subtitle" class="subtitle text-caption">
|
||||||
v-if="$app.subtitle"
|
{{ $app.subtitle }}
|
||||||
class="subtitle text-caption">
|
|
||||||
{{$app.subtitle}}
|
|
||||||
</div>
|
</div>
|
||||||
</q-toolbar-title>
|
</q-toolbar-title>
|
||||||
<div id="actions" ref="actions">
|
<div id="actions" ref="actions"></div>
|
||||||
</div>
|
|
||||||
<q-btn
|
<q-btn
|
||||||
v-if="$app.useRightDrawer"
|
v-if="$app.useRightDrawer"
|
||||||
@click="$app.rightDrawerOpen = !$app.rightDrawerOpen"
|
@click="$app.rightDrawerOpen = !$app.rightDrawerOpen"
|
||||||
aria-label="Menu"
|
aria-label="Menu"
|
||||||
flat
|
flat
|
||||||
dense
|
dense
|
||||||
round>
|
round
|
||||||
<q-icon name="menu"/>
|
>
|
||||||
|
<q-icon name="menu" />
|
||||||
</q-btn>
|
</q-btn>
|
||||||
</q-toolbar>
|
</q-toolbar>
|
||||||
</q-header>
|
</q-header>
|
||||||
<q-drawer
|
<q-drawer v-model="leftDrawerOpen" :width="250" show-if-above>
|
||||||
v-model="leftDrawerOpen"
|
|
||||||
:width="250"
|
|
||||||
show-if-above>
|
|
||||||
<q-toolbar class="logo">
|
<q-toolbar class="logo">
|
||||||
<img src="statics/logo-dark.svg">
|
<img src="statics/logo-dark.svg" />
|
||||||
</q-toolbar>
|
</q-toolbar>
|
||||||
<div class="user-info">
|
<div class="user-info">
|
||||||
<div>
|
<div>
|
||||||
<span id="user-name">{{(user.nickname)}}</span>
|
<span id="user-name">{{ user.nickname }}</span>
|
||||||
<q-btn flat icon="logout" alt="_Exit" @click="logout()"/>
|
<q-btn flat icon="logout" alt="_Exit" @click="logout()" />
|
||||||
</div>
|
</div>
|
||||||
<div id="supplant" class="supplant">
|
<div id="supplant" class="supplant">
|
||||||
<span id="supplanted">{{supplantedUser}}</span>
|
<span id="supplanted">{{ supplantedUser }}</span>
|
||||||
<q-btn flat icon="logout" alt="_Exit"/>
|
<q-btn flat icon="logout" alt="_Exit" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<q-list
|
<q-list v-for="item in essentialLinks" :key="item.id">
|
||||||
v-for="item in essentialLinks"
|
<q-item v-if="!item.childs" :to="`/${item.path}`">
|
||||||
:key="item.id">
|
|
||||||
<q-item
|
|
||||||
v-if="!item.childs"
|
|
||||||
:to="`/${item.path}`">
|
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
<q-item-label>{{item.description}}</q-item-label>
|
<q-item-label>{{ item.description }}</q-item-label>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
<q-expansion-item
|
<q-expansion-item
|
||||||
v-if="item.childs"
|
v-if="item.childs"
|
||||||
:label="item.description"
|
:label="item.description"
|
||||||
expand-separator>
|
expand-separator
|
||||||
|
>
|
||||||
<q-list>
|
<q-list>
|
||||||
<q-item
|
<q-item
|
||||||
v-for="subitem in item.childs"
|
v-for="subitem in item.childs"
|
||||||
:key="subitem.id"
|
:key="subitem.id"
|
||||||
:to="`/${subitem.path}`"
|
:to="`/${subitem.path}`"
|
||||||
class="q-pl-lg">
|
class="q-pl-lg"
|
||||||
|
>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
<q-item-label>{{subitem.description}}</q-item-label>
|
<q-item-label>{{ subitem.description }}</q-item-label>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
</q-list>
|
</q-list>
|
||||||
|
@ -134,13 +128,13 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@import "src/css/responsive";
|
@import 'src/css/responsive';
|
||||||
|
|
||||||
.q-drawer {
|
.q-drawer {
|
||||||
.q-item {
|
.q-item {
|
||||||
padding-left: 38px;
|
padding-left: 38px;
|
||||||
}
|
}
|
||||||
.q-list .q-list .q-item{
|
.q-list .q-list .q-item {
|
||||||
padding-left: 50px;
|
padding-left: 50px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -215,7 +209,9 @@ export default defineComponent({
|
||||||
const parentSection = sectionMap.get(parent)
|
const parentSection = sectionMap.get(parent)
|
||||||
if (!parentSection) continue
|
if (!parentSection) continue
|
||||||
let childs = parentSection.childs
|
let childs = parentSection.childs
|
||||||
if (!childs) { childs = parentSection.childs = [] }
|
if (!childs) {
|
||||||
|
childs = parentSection.childs = []
|
||||||
|
}
|
||||||
childs.push(section)
|
childs.push(section)
|
||||||
} else {
|
} else {
|
||||||
sectionTree.push(section)
|
sectionTree.push(section)
|
||||||
|
@ -234,8 +230,8 @@ export default defineComponent({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
en-US:
|
en-US:
|
||||||
visitor: Visitor
|
visitor: Visitor
|
||||||
es-ES:
|
es-ES:
|
||||||
visitor: Visitante
|
visitor: Visitante
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
import { date as qdate, format } from 'quasar'
|
import { date as qdate, format } from 'quasar'
|
||||||
const { pad } = format
|
const { pad } = format
|
||||||
|
|
||||||
|
@ -61,7 +60,7 @@ export function elapsedTime (val) {
|
||||||
if (!(val instanceof Date)) {
|
if (!(val instanceof Date)) {
|
||||||
val = new Date(val)
|
val = new Date(val)
|
||||||
}
|
}
|
||||||
const now = (new Date()).getTime()
|
const now = new Date().getTime()
|
||||||
val = Math.floor((now - val.getTime()) / 1000)
|
val = Math.floor((now - val.getTime()) / 1000)
|
||||||
|
|
||||||
const hours = Math.floor(val / 3600)
|
const hours = Math.floor(val / 3600)
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<div style="padding: 0;">
|
<div style="padding: 0">
|
||||||
<div class="q-pa-sm row items-start">
|
<div class="q-pa-sm row items-start">
|
||||||
<div
|
<div class="new-card q-pa-sm" v-for="myNew in news" :key="myNew.id">
|
||||||
class="new-card q-pa-sm"
|
|
||||||
v-for="myNew in news"
|
|
||||||
:key="myNew.id">
|
|
||||||
<q-card>
|
<q-card>
|
||||||
<q-img :src="`${$app.imageUrl}/news/full/${myNew.image}`">
|
<q-img :src="`${$app.imageUrl}/news/full/${myNew.image}`"> </q-img>
|
||||||
</q-img>
|
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h5">{{ myNew.title }}</div>
|
<div class="text-h5">{{ myNew.title }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-section class="new-body">
|
<q-card-section class="new-body">
|
||||||
<div v-html="myNew.text"/>
|
<div v-html="myNew.text" />
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
</q-card>
|
</q-card>
|
||||||
</div>
|
</div>
|
||||||
|
@ -67,14 +63,14 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
en-US:
|
en-US:
|
||||||
startOrder: Start order
|
startOrder: Start order
|
||||||
es-ES:
|
es-ES:
|
||||||
startOrder: Empezar pedido
|
startOrder: Empezar pedido
|
||||||
ca-ES:
|
ca-ES:
|
||||||
startOrder: Començar comanda
|
startOrder: Començar comanda
|
||||||
fr-FR:
|
fr-FR:
|
||||||
startOrder: Lancer commande
|
startOrder: Lancer commande
|
||||||
pt-PT:
|
pt-PT:
|
||||||
startOrder: Comece uma encomenda
|
startOrder: Comece uma encomenda
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -8,12 +8,10 @@
|
||||||
rounded
|
rounded
|
||||||
dark
|
dark
|
||||||
dense
|
dense
|
||||||
standout>
|
standout
|
||||||
|
>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<q-icon
|
<q-icon v-if="search === ''" name="search" />
|
||||||
v-if="search === ''"
|
|
||||||
name="search"
|
|
||||||
/>
|
|
||||||
<q-icon
|
<q-icon
|
||||||
v-else
|
v-else
|
||||||
name="clear"
|
name="clear"
|
||||||
|
@ -27,37 +25,32 @@
|
||||||
:label="$t(viewMode == 'list' ? 'listView' : 'gridView')"
|
:label="$t(viewMode == 'list' ? 'listView' : 'gridView')"
|
||||||
@click="onViewModeClick()"
|
@click="onViewModeClick()"
|
||||||
rounded
|
rounded
|
||||||
no-caps/>
|
no-caps
|
||||||
|
/>
|
||||||
</Teleport>
|
</Teleport>
|
||||||
<div style="padding-bottom: 5em;">
|
<div style="padding-bottom: 5em">
|
||||||
<q-drawer
|
<q-drawer v-model="$app.rightDrawerOpen" side="right" :width="250">
|
||||||
v-model="$app.rightDrawerOpen"
|
|
||||||
side="right"
|
|
||||||
:width="250">
|
|
||||||
<div class="q-pa-md">
|
<div class="q-pa-md">
|
||||||
<div class="basket-info">
|
<div class="basket-info">
|
||||||
<p>{{date(new Date())}}</p>
|
<p>{{ date(new Date()) }}</p>
|
||||||
<p>
|
<p>
|
||||||
{{$t('warehouse')}}
|
{{ $t('warehouse') }}
|
||||||
{{'Algemesi'}}
|
{{ 'Algemesi' }}
|
||||||
</p>
|
</p>
|
||||||
<q-btn
|
<q-btn flat rounded no-caps>
|
||||||
flat
|
{{ $t('modify') }}
|
||||||
rounded
|
|
||||||
no-caps>
|
|
||||||
{{$t('modify')}}
|
|
||||||
</q-btn>
|
</q-btn>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-mt-md">
|
<div class="q-mt-md">
|
||||||
<div class="q-mb-xs text-grey-7">
|
<div class="q-mb-xs text-grey-7">
|
||||||
{{$t('category')}}
|
{{ $t('category') }}
|
||||||
<q-icon
|
<q-icon
|
||||||
v-if="category"
|
v-if="category"
|
||||||
style="font-size: 1.3em;"
|
style="font-size: 1.3em"
|
||||||
name="cancel"
|
name="cancel"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
:title="$t('deleteFilter')"
|
:title="$t('deleteFilter')"
|
||||||
@click="$router.push({params: {category: null}})"
|
@click="$router.push({ params: { category: null } })"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="categories">
|
<div class="categories">
|
||||||
|
@ -66,18 +59,18 @@
|
||||||
round
|
round
|
||||||
class="category q-pa-sm"
|
class="category q-pa-sm"
|
||||||
v-for="cat in categories"
|
v-for="cat in categories"
|
||||||
:class="{active: category == cat.id}"
|
:class="{ active: category == cat.id }"
|
||||||
:key="cat.id"
|
:key="cat.id"
|
||||||
:title="cat.name"
|
:title="cat.name"
|
||||||
:to="{params: {category: cat.id, type: null}}">
|
:to="{ params: { category: cat.id, type: null } }"
|
||||||
<img :src="`statics/category/${cat.code}.svg`">
|
>
|
||||||
|
<img :src="`statics/category/${cat.code}.svg`" />
|
||||||
</q-btn>
|
</q-btn>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-mt-md"
|
<div class="q-mt-md" v-if="category || search">
|
||||||
v-if="category || search">
|
|
||||||
<div class="q-mb-xs text-grey-7">
|
<div class="q-mb-xs text-grey-7">
|
||||||
{{$t('filterBy')}}
|
{{ $t('filterBy') }}
|
||||||
</div>
|
</div>
|
||||||
<q-select
|
<q-select
|
||||||
v-model="type"
|
v-model="type"
|
||||||
|
@ -88,7 +81,7 @@
|
||||||
clearable
|
clearable
|
||||||
:label="$t('family')"
|
:label="$t('family')"
|
||||||
@filter="filterType"
|
@filter="filterType"
|
||||||
@input="$router.push({params: {type: type && type.id}})"
|
@input="$router.push({ params: { type: type && type.id } })"
|
||||||
/>
|
/>
|
||||||
<q-select
|
<q-select
|
||||||
v-model="order"
|
v-model="order"
|
||||||
|
@ -98,16 +91,13 @@
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-pa-md"
|
<div class="q-pa-md" v-if="typeId || search">
|
||||||
v-if="typeId || search">
|
<div class="q-mb-md" v-for="tag in tags" :key="tag.uid">
|
||||||
<div class="q-mb-md"
|
|
||||||
v-for="tag in tags"
|
|
||||||
:key="tag.uid">
|
|
||||||
<div class="q-mb-xs text-caption text-grey-7">
|
<div class="q-mb-xs text-caption text-grey-7">
|
||||||
{{tag.name}}
|
{{ tag.name }}
|
||||||
<q-icon
|
<q-icon
|
||||||
v-if="tag.hasFilter"
|
v-if="tag.hasFilter"
|
||||||
style="font-size: 1.3em;"
|
style="font-size: 1.3em"
|
||||||
name="cancel"
|
name="cancel"
|
||||||
:title="$t('deleteFilter')"
|
:title="$t('deleteFilter')"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
|
@ -117,7 +107,8 @@
|
||||||
<div v-if="!tag.useRange">
|
<div v-if="!tag.useRange">
|
||||||
<div
|
<div
|
||||||
v-for="value in tag.values.slice(0, tag.showCount)"
|
v-for="value in tag.values.slice(0, tag.showCount)"
|
||||||
:key="value">
|
:key="value"
|
||||||
|
>
|
||||||
<q-checkbox
|
<q-checkbox
|
||||||
v-model="tag.filter"
|
v-model="tag.filter"
|
||||||
:dense="true"
|
:dense="true"
|
||||||
|
@ -129,17 +120,19 @@
|
||||||
<div v-if="tag.values.length > tag.showCount">
|
<div v-if="tag.values.length > tag.showCount">
|
||||||
<span
|
<span
|
||||||
class="cursor-pointer text-blue"
|
class="cursor-pointer text-blue"
|
||||||
@click="tag.showCount = Infinity">
|
@click="tag.showCount = Infinity"
|
||||||
|
>
|
||||||
<q-icon name="keyboard_arrow_down" />
|
<q-icon name="keyboard_arrow_down" />
|
||||||
{{$t('viewMore')}}
|
{{ $t('viewMore') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="tag.showCount == Infinity">
|
<div v-if="tag.showCount == Infinity">
|
||||||
<span
|
<span
|
||||||
class="cursor-pointer text-blue"
|
class="cursor-pointer text-blue"
|
||||||
@click="tag.showCount = tag.initialCount">
|
@click="tag.showCount = tag.initialCount"
|
||||||
|
>
|
||||||
<q-icon name="keyboard_arrow_up" />
|
<q-icon name="keyboard_arrow_up" />
|
||||||
{{$t('viewLess')}}
|
{{ $t('viewLess') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -166,52 +159,54 @@
|
||||||
@load="onLoad"
|
@load="onLoad"
|
||||||
scroll-taget="html"
|
scroll-taget="html"
|
||||||
:offset="800"
|
:offset="800"
|
||||||
:disable="disableScroll">
|
:disable="disableScroll"
|
||||||
|
>
|
||||||
<div class="q-pa-md row justify-center q-gutter-md">
|
<div class="q-pa-md row justify-center q-gutter-md">
|
||||||
<q-spinner
|
<q-spinner v-if="isLoading" color="primary" size="50px"> </q-spinner>
|
||||||
v-if="isLoading"
|
|
||||||
color="primary"
|
|
||||||
size="50px">
|
|
||||||
</q-spinner>
|
|
||||||
<div
|
<div
|
||||||
v-if="items && !items.length"
|
v-if="items && !items.length"
|
||||||
class="text-subtitle1 text-grey-7 q-pa-md">
|
class="text-subtitle1 text-grey-7 q-pa-md"
|
||||||
{{$t('noItemsFound')}}
|
>
|
||||||
|
{{ $t('noItemsFound') }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!items && !isLoading"
|
v-if="!items && !isLoading"
|
||||||
class="text-subtitle1 text-grey-7 q-pa-md">
|
class="text-subtitle1 text-grey-7 q-pa-md"
|
||||||
{{$t('pleaseSetFilter')}}
|
>
|
||||||
|
{{ $t('pleaseSetFilter') }}
|
||||||
</div>
|
</div>
|
||||||
<q-card
|
<q-card class="my-card" v-for="item in items" :key="item.id">
|
||||||
class="my-card"
|
|
||||||
v-for="item in items"
|
|
||||||
:key="item.id">
|
|
||||||
<img :src="`${$imageBase}/catalog/200x200/${item.image}`" />
|
<img :src="`${$imageBase}/catalog/200x200/${item.image}`" />
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="name text-subtitle1">
|
<div class="name text-subtitle1">
|
||||||
{{item.longName}}
|
{{ item.longName }}
|
||||||
</div>
|
</div>
|
||||||
<div class="sub-name text-uppercase text-subtitle1 text-grey-7 ellipsize q-pt-xs">
|
<div
|
||||||
{{item.subName}}
|
class="sub-name text-uppercase text-subtitle1 text-grey-7 ellipsize q-pt-xs"
|
||||||
|
>
|
||||||
|
{{ item.subName }}
|
||||||
</div>
|
</div>
|
||||||
<div class="tags q-pt-xs">
|
<div class="tags q-pt-xs">
|
||||||
<div v-for="tag in item.tags" :key="tag.tagFk">
|
<div v-for="tag in item.tags" :key="tag.tagFk">
|
||||||
<span class="text-grey-7">{{tag.tag.name}}</span> {{tag.value}}
|
<span class="text-grey-7">{{ tag.tag.name }}</span>
|
||||||
|
{{ tag.value }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-actions class="actions justify-between">
|
<q-card-actions class="actions justify-between">
|
||||||
<div class="q-pl-sm">
|
<div class="q-pl-sm">
|
||||||
<span class="available bg-green text-white">{{item.available}}</span>
|
<span class="available bg-green text-white">{{
|
||||||
{{$t('from')}}
|
item.available
|
||||||
<span class="price">{{currency(item.buy?.price3)}}</span>
|
}}</span>
|
||||||
|
{{ $t('from') }}
|
||||||
|
<span class="price">{{ currency(item.buy?.price3) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<q-btn
|
<q-btn
|
||||||
icon="add_shopping_cart"
|
icon="add_shopping_cart"
|
||||||
:title="$t('buy')"
|
:title="$t('buy')"
|
||||||
@click="showItem(item)"
|
@click="showItem(item)"
|
||||||
flat>
|
flat
|
||||||
|
>
|
||||||
</q-btn>
|
</q-btn>
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
@ -223,39 +218,35 @@
|
||||||
</template>
|
</template>
|
||||||
</q-infinite-scroll>
|
</q-infinite-scroll>
|
||||||
<q-dialog v-model="showItemDialog">
|
<q-dialog v-model="showItemDialog">
|
||||||
<q-card style="width: 25em;">
|
<q-card style="width: 25em">
|
||||||
<q-img
|
<q-img
|
||||||
:src="`${$imageBase}/catalog/200x200/${item.image}`"
|
:src="`${$imageBase}/catalog/200x200/${item.image}`"
|
||||||
:ratio="5/3">
|
:ratio="5 / 3"
|
||||||
|
>
|
||||||
<div class="absolute-bottom text-center q-pa-xs">
|
<div class="absolute-bottom text-center q-pa-xs">
|
||||||
<div class="text-subtitle1">
|
<div class="text-subtitle1">
|
||||||
{{item.longName}}
|
{{ item.longName }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</q-img>
|
</q-img>
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-uppercase text-subtitle1 text-grey-7 ellipsize">
|
<div class="text-uppercase text-subtitle1 text-grey-7 ellipsize">
|
||||||
{{item.subName}}
|
{{ item.subName }}
|
||||||
</div>
|
|
||||||
<div class="text-grey-7">
|
|
||||||
#{{item.id}}
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="text-grey-7">#{{ item.id }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div v-for="tag in item.tags" :key="tag.tagFk">
|
<div v-for="tag in item.tags" :key="tag.tagFk">
|
||||||
<span class="text-grey-7">{{tag.tag.name}}</span> {{tag.value}}
|
<span class="text-grey-7">{{ tag.tag.name }}</span>
|
||||||
|
{{ tag.value }}
|
||||||
</div>
|
</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-actions align="right">
|
<q-card-actions align="right">
|
||||||
<q-btn
|
<q-btn @click="showItemDialog = false" flat>
|
||||||
@click="showItemDialog = false"
|
{{ $t('cancel') }}
|
||||||
flat>
|
|
||||||
{{$t('cancel')}}
|
|
||||||
</q-btn>
|
</q-btn>
|
||||||
<q-btn
|
<q-btn @click="showItemDialog = false" flat>
|
||||||
@click="showItemDialog = false"
|
{{ $t('accept') }}
|
||||||
flat>
|
|
||||||
{{$t('accept')}}
|
|
||||||
</q-btn>
|
</q-btn>
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
@ -266,16 +257,17 @@
|
||||||
to="/ecomerce/basket"
|
to="/ecomerce/basket"
|
||||||
icon="shopping_cart"
|
icon="shopping_cart"
|
||||||
color="accent"
|
color="accent"
|
||||||
:title="$t('shoppingCart')"/>
|
:title="$t('shoppingCart')"
|
||||||
|
/>
|
||||||
</q-page-sticky>
|
</q-page-sticky>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.search {
|
.search {
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
}
|
}
|
||||||
.basket-info {
|
.basket-info {
|
||||||
background-color: #8cc63f;
|
background-color: #8cc63f;
|
||||||
color: white;
|
color: white;
|
||||||
padding: 17px 28px;
|
padding: 17px 28px;
|
||||||
|
@ -284,13 +276,13 @@
|
||||||
|
|
||||||
& > p {
|
& > p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: .4em 0;
|
padding: 0.4em 0;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.categories {
|
.categories {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
|
|
||||||
|
@ -298,32 +290,33 @@
|
||||||
width: 55px;
|
width: 55px;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background: rgba(0, 0, 0, .08);
|
background: rgba(0, 0, 0, 0.08);
|
||||||
}
|
}
|
||||||
& > img {
|
& > img {
|
||||||
height: 40px;
|
height: 40px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.tags {
|
.tags {
|
||||||
max-height: 4.6em;
|
max-height: 4.6em;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.available {
|
.available {
|
||||||
padding: .15em;
|
padding: 0.15em;
|
||||||
border-radius: .2em;
|
border-radius: 0.2em;
|
||||||
font-size: 1.3em;
|
font-size: 1.3em;
|
||||||
}
|
}
|
||||||
.price {
|
.price {
|
||||||
font-size: 1.3em;
|
font-size: 1.3em;
|
||||||
}
|
}
|
||||||
.my-card {
|
.my-card {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 17.5em;
|
max-width: 17.5em;
|
||||||
height: 32.5em;
|
height: 32.5em;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
.name, .sub-name {
|
.name,
|
||||||
|
.sub-name {
|
||||||
line-height: 1.3em;
|
line-height: 1.3em;
|
||||||
}
|
}
|
||||||
.ellipsize {
|
.ellipsize {
|
||||||
|
@ -335,7 +328,7 @@
|
||||||
height: 40px;
|
height: 40px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
@ -376,22 +369,28 @@ export default {
|
||||||
{
|
{
|
||||||
label: this.$t('relevancy'),
|
label: this.$t('relevancy'),
|
||||||
value: 'relevancy DESC, longName'
|
value: 'relevancy DESC, longName'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('name'),
|
label: this.$t('name'),
|
||||||
value: 'longName'
|
value: 'longName'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('siceAsc'),
|
label: this.$t('siceAsc'),
|
||||||
value: 'size ASC'
|
value: 'size ASC'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('sizeDesc'),
|
label: this.$t('sizeDesc'),
|
||||||
value: 'size DESC'
|
value: 'size DESC'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('priceAsc'),
|
label: this.$t('priceAsc'),
|
||||||
value: 'price ASC'
|
value: 'price ASC'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('priceDesc'),
|
label: this.$t('priceDesc'),
|
||||||
value: 'price DESC'
|
value: 'price DESC'
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
label: this.$t('available'),
|
label: this.$t('available'),
|
||||||
value: 'available'
|
value: 'available'
|
||||||
}
|
}
|
||||||
|
@ -482,12 +481,13 @@ export default {
|
||||||
let subtitle
|
let subtitle
|
||||||
|
|
||||||
if (this.category) {
|
if (this.category) {
|
||||||
const category = this.categories.find(i => i.id === this.category) || {}
|
const category =
|
||||||
|
this.categories.find((i) => i.id === this.category) || {}
|
||||||
title = category.name
|
title = category.name
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.typeId) {
|
if (this.typeId) {
|
||||||
this.type = this.orgTypes.find(i => i.id === this.typeId)
|
this.type = this.orgTypes.find((i) => i.id === this.typeId)
|
||||||
subtitle = title
|
subtitle = title
|
||||||
title = this.type && this.type.name
|
title = this.type && this.type.name
|
||||||
} else {
|
} else {
|
||||||
|
@ -558,9 +558,10 @@ export default {
|
||||||
params,
|
params,
|
||||||
cancelToken: this.source.token
|
cancelToken: this.source.token
|
||||||
}
|
}
|
||||||
return this.$axios.get('Items/catalog', config)
|
return this.$axios
|
||||||
.then(res => this.onItemsGet(res))
|
.get('Items/catalog', config)
|
||||||
.catch(err => this.onItemsError(err))
|
.then((res) => this.onItemsGet(res))
|
||||||
|
.catch((err) => this.onItemsError(err))
|
||||||
.finally(() => (this.cancel = null))
|
.finally(() => (this.cancel = null))
|
||||||
},
|
},
|
||||||
onItemsError (err) {
|
onItemsError (err) {
|
||||||
|
@ -574,12 +575,9 @@ export default {
|
||||||
|
|
||||||
if (tag.filter) {
|
if (tag.filter) {
|
||||||
tag.hasFilter = true
|
tag.hasFilter = true
|
||||||
tag.useRange =
|
tag.useRange = tag.filter.max || tag.filter.min
|
||||||
tag.filter.max ||
|
|
||||||
tag.filter.min
|
|
||||||
} else {
|
} else {
|
||||||
tag.useRange = tag.isQuantitative &&
|
tag.useRange = tag.isQuantitative && tag.values.length > this.maxTags
|
||||||
tag.values.length > this.maxTags
|
|
||||||
this.resetTagFilter(tag)
|
this.resetTagFilter(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,12 +622,15 @@ export default {
|
||||||
},
|
},
|
||||||
filterType (val, update) {
|
filterType (val, update) {
|
||||||
if (val === '') {
|
if (val === '') {
|
||||||
update(() => { this.types = this.orgTypes })
|
update(() => {
|
||||||
|
this.types = this.orgTypes
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
update(() => {
|
update(() => {
|
||||||
const needle = val.toLowerCase()
|
const needle = val.toLowerCase()
|
||||||
this.types = this.orgTypes.filter(type =>
|
this.types = this.orgTypes.filter(
|
||||||
type.name.toLowerCase().indexOf(needle) > -1)
|
(type) => type.name.toLowerCase().indexOf(needle) > -1
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -643,15 +644,16 @@ export default {
|
||||||
addressFk: conf.addressFk,
|
addressFk: conf.addressFk,
|
||||||
agencyModeFk: conf.agencyModeFk
|
agencyModeFk: conf.agencyModeFk
|
||||||
}
|
}
|
||||||
this.$axios.get(`Items/${item.id}/calcCatalog`, { params })
|
this.$axios
|
||||||
.then(res => (this.lots = res.data))
|
.get(`Items/${item.id}/calcCatalog`, { params })
|
||||||
|
.then((res) => (this.lots = res.data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
es-ES:
|
es-ES:
|
||||||
gridView: Vista de rejilla
|
gridView: Vista de rejilla
|
||||||
listView: Vista de lista
|
listView: Vista de lista
|
||||||
shoppingCart: Cesta de la compra
|
shoppingCart: Cesta de la compra
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
dark
|
dark
|
||||||
standout
|
standout
|
||||||
dense
|
dense
|
||||||
rounded />
|
rounded
|
||||||
|
/>
|
||||||
</Teleport>
|
</Teleport>
|
||||||
<div class="vn-w-sm">
|
<div class="vn-w-sm">
|
||||||
<div
|
<div
|
||||||
v-if="!invoices?.length"
|
v-if="!invoices?.length"
|
||||||
class="text-subtitle1 text-center text-grey-7 q-pa-md">
|
class="text-subtitle1 text-center text-grey-7 q-pa-md"
|
||||||
{{$t('noInvoicesFound')}}
|
>
|
||||||
|
{{ $t('noInvoicesFound') }}
|
||||||
</div>
|
</div>
|
||||||
<q-card v-if="invoices?.length">
|
<q-card v-if="invoices?.length">
|
||||||
<q-table
|
<q-table
|
||||||
|
@ -22,7 +24,8 @@
|
||||||
:rows="invoices"
|
:rows="invoices"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
hide-header
|
hide-header
|
||||||
hide-bottom>
|
hide-bottom
|
||||||
|
>
|
||||||
<template v-slot:body="props">
|
<template v-slot:body="props">
|
||||||
<q-tr :props="props">
|
<q-tr :props="props">
|
||||||
<q-td key="ref" :props="props">
|
<q-td key="ref" :props="props">
|
||||||
|
@ -42,13 +45,15 @@
|
||||||
:href="invoiceUrl(props.row.id)"
|
:href="invoiceUrl(props.row.id)"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
flat
|
flat
|
||||||
round/>
|
round
|
||||||
|
/>
|
||||||
<q-icon
|
<q-icon
|
||||||
v-else
|
v-else
|
||||||
name="warning"
|
name="warning"
|
||||||
:title="$t('notDownloadable')"
|
:title="$t('notDownloadable')"
|
||||||
color="warning"
|
color="warning"
|
||||||
size="24px"/>
|
size="24px"
|
||||||
|
/>
|
||||||
</q-td>
|
</q-td>
|
||||||
</q-tr>
|
</q-tr>
|
||||||
</template>
|
</template>
|
||||||
|
@ -63,7 +68,7 @@ import { date, currency } from 'src/lib/filters.js'
|
||||||
export default {
|
export default {
|
||||||
name: 'OrdersPendingIndex',
|
name: 'OrdersPendingIndex',
|
||||||
data () {
|
data () {
|
||||||
const curYear = (new Date()).getFullYear()
|
const curYear = new Date().getFullYear()
|
||||||
const years = []
|
const years = []
|
||||||
|
|
||||||
for (let year = curYear - 5; year <= curYear; year++) {
|
for (let year = curYear - 5; year <= curYear; year++) {
|
||||||
|
@ -116,46 +121,49 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
invoiceUrl (id) {
|
invoiceUrl (id) {
|
||||||
return '?' + new URLSearchParams({
|
return (
|
||||||
|
'?' +
|
||||||
|
new URLSearchParams({
|
||||||
srv: 'rest:dms/invoice',
|
srv: 'rest:dms/invoice',
|
||||||
invoice: id,
|
invoice: id,
|
||||||
access_token: this.$user.token
|
access_token: this.$user.token
|
||||||
}).toString()
|
}).toString()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
en-US:
|
en-US:
|
||||||
noInvoicesFound: No invoices found
|
noInvoicesFound: No invoices found
|
||||||
serial: Serial
|
serial: Serial
|
||||||
issued: Date
|
issued: Date
|
||||||
amount: Import
|
amount: Import
|
||||||
downloadInvoicePdf: Download invoice PDF
|
downloadInvoicePdf: Download invoice PDF
|
||||||
notDownloadable: Not available for download, request the invoice to your salesperson
|
notDownloadable: Not available for download, request the invoice to your salesperson
|
||||||
es-ES:
|
es-ES:
|
||||||
noInvoicesFound: No se han encontrado facturas
|
noInvoicesFound: No se han encontrado facturas
|
||||||
serial: Serie
|
serial: Serie
|
||||||
issued: Fecha
|
issued: Fecha
|
||||||
amount: Importe
|
amount: Importe
|
||||||
downloadInvoicePdf: Descargar factura en PDF
|
downloadInvoicePdf: Descargar factura en PDF
|
||||||
notDownloadable: No disponible para descarga, solicita la factura a tu comercial
|
notDownloadable: No disponible para descarga, solicita la factura a tu comercial
|
||||||
ca-ES:
|
ca-ES:
|
||||||
noInvoicesFound: No s'han trobat factures
|
noInvoicesFound: No s'han trobat factures
|
||||||
serial: Sèrie
|
serial: Sèrie
|
||||||
issued: Data
|
issued: Data
|
||||||
amount: Import
|
amount: Import
|
||||||
downloadInvoicePdf: Descarregar PDF
|
downloadInvoicePdf: Descarregar PDF
|
||||||
notDownloadable: No disponible per cescarrega, sol·licita la factura al teu comercial
|
notDownloadable: No disponible per cescarrega, sol·licita la factura al teu comercial
|
||||||
fr-FR:
|
fr-FR:
|
||||||
noInvoicesFound: Aucune facture trouvée
|
noInvoicesFound: Aucune facture trouvée
|
||||||
serial: Série
|
serial: Série
|
||||||
issued: Date
|
issued: Date
|
||||||
amount: Montant
|
amount: Montant
|
||||||
downloadInvoicePdf: Télécharger le PDF
|
downloadInvoicePdf: Télécharger le PDF
|
||||||
notDownloadable: Non disponible en téléchargement, demander la facture à votre commercial
|
notDownloadable: Non disponible en téléchargement, demander la facture à votre commercial
|
||||||
pt-PT:
|
pt-PT:
|
||||||
noInvoicesFound: Nenhuma fatura encontrada
|
noInvoicesFound: Nenhuma fatura encontrada
|
||||||
serial: Serie
|
serial: Serie
|
||||||
issued: Data
|
issued: Data
|
||||||
|
|
|
@ -1,56 +1,52 @@
|
||||||
<template>
|
<template>
|
||||||
<Teleport :to="$actions">
|
<Teleport :to="$actions">
|
||||||
<div class="balance">
|
<div class="balance">
|
||||||
<span class="label">{{$t('balance')}}</span>
|
<span class="label">{{ $t('balance') }}</span>
|
||||||
<span
|
<span class="amount" :class="{ negative: debt < 0 }">
|
||||||
class="amount"
|
{{ currency(debt || 0) }}
|
||||||
:class="{negative: debt < 0}">
|
|
||||||
{{currency(debt || 0)}}
|
|
||||||
</span>
|
</span>
|
||||||
<q-icon
|
<q-icon name="info" :title="$t('paymentInfo')" class="info" size="24px" />
|
||||||
name="info"
|
|
||||||
:title="$t('paymentInfo')"
|
|
||||||
class="info"
|
|
||||||
size="24px"/>
|
|
||||||
</div>
|
</div>
|
||||||
<q-btn
|
<q-btn
|
||||||
icon="payments"
|
icon="payments"
|
||||||
:label="$t('makePayment')"
|
:label="$t('makePayment')"
|
||||||
@click="onPayClick()"
|
@click="onPayClick()"
|
||||||
rounded
|
rounded
|
||||||
no-caps/>
|
no-caps
|
||||||
|
/>
|
||||||
<q-btn
|
<q-btn
|
||||||
to="/ecomerce/basket"
|
to="/ecomerce/basket"
|
||||||
icon="shopping_cart"
|
icon="shopping_cart"
|
||||||
:label="$t('shoppingCart')"
|
:label="$t('shoppingCart')"
|
||||||
rounded
|
rounded
|
||||||
no-caps/>
|
no-caps
|
||||||
|
/>
|
||||||
</Teleport>
|
</Teleport>
|
||||||
<div class="vn-w-sm">
|
<div class="vn-w-sm">
|
||||||
<div
|
<div
|
||||||
v-if="!orders?.length"
|
v-if="!orders?.length"
|
||||||
class="text-subtitle1 text-center text-grey-7 q-pa-md">
|
class="text-subtitle1 text-center text-grey-7 q-pa-md"
|
||||||
{{$t('noOrdersFound')}}
|
>
|
||||||
|
{{ $t('noOrdersFound') }}
|
||||||
</div>
|
</div>
|
||||||
<q-card v-if="orders?.length">
|
<q-card v-if="orders?.length">
|
||||||
<q-list bordered separator padding >
|
<q-list bordered separator padding>
|
||||||
<q-item
|
<q-item
|
||||||
v-for="order in orders"
|
v-for="order in orders"
|
||||||
:key="order.id"
|
:key="order.id"
|
||||||
:to="`ticket/${order.id}`"
|
:to="`ticket/${order.id}`"
|
||||||
clickable
|
clickable
|
||||||
v-ripple>
|
v-ripple
|
||||||
|
>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
<q-item-label>
|
<q-item-label>
|
||||||
{{date(order.landed, 'ddd, MMMM Do')}}
|
{{ date(order.landed, 'ddd, MMMM Do') }}
|
||||||
</q-item-label>
|
</q-item-label>
|
||||||
<q-item-label caption>#{{order.id}}</q-item-label>
|
<q-item-label caption>#{{ order.id }}</q-item-label>
|
||||||
<q-item-label caption>{{order.nickname}}</q-item-label>
|
<q-item-label caption>{{ order.nickname }}</q-item-label>
|
||||||
<q-item-label caption>{{order.agency}}</q-item-label>
|
<q-item-label caption>{{ order.agency }}</q-item-label>
|
||||||
</q-item-section>
|
|
||||||
<q-item-section side top>
|
|
||||||
{{order.total}}€
|
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
|
<q-item-section side top> {{ order.total }}€ </q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
</q-list>
|
</q-list>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
@ -60,7 +56,8 @@
|
||||||
icon="add_shopping_cart"
|
icon="add_shopping_cart"
|
||||||
color="accent"
|
color="accent"
|
||||||
to="/ecomerce/catalog"
|
to="/ecomerce/catalog"
|
||||||
:title="$t('startOrder')"/>
|
:title="$t('startOrder')"
|
||||||
|
/>
|
||||||
</q-page-sticky>
|
</q-page-sticky>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -107,12 +104,8 @@ export default {
|
||||||
async mounted () {
|
async mounted () {
|
||||||
await this.tpv.check(this.$route)
|
await this.tpv.check(this.$route)
|
||||||
|
|
||||||
this.orders = await this.$jApi.query(
|
this.orders = await this.$jApi.query('CALL myTicket_list(NULL, NULL)')
|
||||||
'CALL myTicket_list(NULL, NULL)'
|
this.debt = await this.$jApi.getValue('SELECT -myClient_getDebt(NULL)')
|
||||||
)
|
|
||||||
this.debt = await this.$jApi.getValue(
|
|
||||||
'SELECT -myClient_getDebt(NULL)'
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -139,7 +132,7 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
en-US:
|
en-US:
|
||||||
startOrder: Start order
|
startOrder: Start order
|
||||||
noOrdersFound: No orders found
|
noOrdersFound: No orders found
|
||||||
makePayment: Make payment
|
makePayment: Make payment
|
||||||
|
@ -150,7 +143,7 @@ export default {
|
||||||
disregards future orders. For get your order shipped, this amount must be
|
disregards future orders. For get your order shipped, this amount must be
|
||||||
equal to or greater than 0. If you want to make a down payment, click the
|
equal to or greater than 0. If you want to make a down payment, click the
|
||||||
payment button, delete the suggested amount and enter the amount you want.
|
payment button, delete the suggested amount and enter the amount you want.
|
||||||
es-ES:
|
es-ES:
|
||||||
startOrder: Empezar pedido
|
startOrder: Empezar pedido
|
||||||
noOrdersFound: No se encontrado pedidos
|
noOrdersFound: No se encontrado pedidos
|
||||||
makePayment: Realizar pago
|
makePayment: Realizar pago
|
||||||
|
@ -162,7 +155,7 @@ export default {
|
||||||
esta cantidad debe ser igual o mayor que 0. Si quieres realizar una entrega a
|
esta cantidad debe ser igual o mayor que 0. Si quieres realizar una entrega a
|
||||||
cuenta, pulsa el botón de pago, borra la cantidad sugerida e introduce la
|
cuenta, pulsa el botón de pago, borra la cantidad sugerida e introduce la
|
||||||
cantidad que desees.
|
cantidad que desees.
|
||||||
ca-ES:
|
ca-ES:
|
||||||
startOrder: Començar encàrrec
|
startOrder: Començar encàrrec
|
||||||
noOrdersFound: No s'han trobat comandes
|
noOrdersFound: No s'han trobat comandes
|
||||||
makePayment: Realitzar pagament
|
makePayment: Realitzar pagament
|
||||||
|
@ -174,7 +167,7 @@ export default {
|
||||||
enviat, aquesta quantitat ha de ser igual o més gran que 0. Si vols fer un
|
enviat, aquesta quantitat ha de ser igual o més gran que 0. Si vols fer un
|
||||||
lliurament a compte, prem el botó de pagament, esborra la quantitat suggerida
|
lliurament a compte, prem el botó de pagament, esborra la quantitat suggerida
|
||||||
e introdueix la quantitat que vulguis.
|
e introdueix la quantitat que vulguis.
|
||||||
fr-FR:
|
fr-FR:
|
||||||
startOrder: Acheter
|
startOrder: Acheter
|
||||||
noOrdersFound: Aucune commande trouvée
|
noOrdersFound: Aucune commande trouvée
|
||||||
makePayment: Effectuer un paiement
|
makePayment: Effectuer un paiement
|
||||||
|
@ -186,7 +179,7 @@ export default {
|
||||||
commande est expédiée, ce montant doit être égal ou supérieur à 0. Si vous
|
commande est expédiée, ce montant doit être égal ou supérieur à 0. Si vous
|
||||||
voulez faire un versement, le montant suggéré effacé et entrez le montant que
|
voulez faire un versement, le montant suggéré effacé et entrez le montant que
|
||||||
vous souhaitez.
|
vous souhaitez.
|
||||||
pt-PT:
|
pt-PT:
|
||||||
startOrder: Iniciar encomenda
|
startOrder: Iniciar encomenda
|
||||||
noOrdersFound: Nenhum pedido encontrado
|
noOrdersFound: Nenhum pedido encontrado
|
||||||
makePayment: Realizar pagamento
|
makePayment: Realizar pagamento
|
||||||
|
|
|
@ -5,51 +5,61 @@
|
||||||
:label="$t('printDeliveryNote')"
|
:label="$t('printDeliveryNote')"
|
||||||
@click="onPrintClick()"
|
@click="onPrintClick()"
|
||||||
rounded
|
rounded
|
||||||
no-caps/>
|
no-caps
|
||||||
|
/>
|
||||||
</Teleport>
|
</Teleport>
|
||||||
<div>
|
<div>
|
||||||
<q-card class="vn-w-sm">
|
<q-card class="vn-w-sm">
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">#{{ticket.id}}</div>
|
<div class="text-h6">#{{ ticket.id }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">{{$t('shippingInformation')}}</div>
|
<div class="text-h6">{{ $t('shippingInformation') }}</div>
|
||||||
<div>{{$t('preparation')}} {{date(ticket.shipped, 'ddd, MMMM Do')}}</div>
|
<div>
|
||||||
<div>{{$t('delivery')}} {{date(ticket.shipped, 'ddd, MMMM Do')}}</div>
|
{{ $t('preparation') }} {{ date(ticket.shipped, 'ddd, MMMM Do') }}
|
||||||
<div>{{$t(ticket.method != 'PICKUP' ? 'agency' : 'warehouse')}} {{ticket.agency}}</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ $t('delivery') }} {{ date(ticket.shipped, 'ddd, MMMM Do') }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ $t(ticket.method != 'PICKUP' ? 'agency' : 'warehouse') }}
|
||||||
|
{{ ticket.agency }}
|
||||||
|
</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">{{$t('deliveryAddress')}}</div>
|
<div class="text-h6">{{ $t('deliveryAddress') }}</div>
|
||||||
<div>{{ticket.nickname}}</div>
|
<div>{{ ticket.nickname }}</div>
|
||||||
<div>{{ticket.street}}</div>
|
<div>{{ ticket.street }}</div>
|
||||||
<div>{{ticket.postalCode}} {{ticket.city}} ({{ticket.province}})</div>
|
<div>
|
||||||
|
{{ ticket.postalCode }} {{ ticket.city }} ({{ ticket.province }})
|
||||||
|
</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-separator inset />
|
<q-separator inset />
|
||||||
<q-list v-for="row in rows" :key="row.itemFk">
|
<q-list v-for="row in rows" :key="row.itemFk">
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar>
|
<q-item-section avatar>
|
||||||
<q-avatar size="68px">
|
<q-avatar size="68px">
|
||||||
<img :src="`${$app.imageUrl}/catalog/200x200/${row.image}`">
|
<img :src="`${$app.imageUrl}/catalog/200x200/${row.image}`" />
|
||||||
</q-avatar>
|
</q-avatar>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
<q-item-label lines="1">
|
<q-item-label lines="1">
|
||||||
{{row.concept}}
|
{{ row.concept }}
|
||||||
</q-item-label>
|
</q-item-label>
|
||||||
<q-item-label lines="1" caption>
|
<q-item-label lines="1" caption>
|
||||||
{{row.value5}} {{row.value6}} {{row.value7}}
|
{{ row.value5 }} {{ row.value6 }} {{ row.value7 }}
|
||||||
</q-item-label>
|
</q-item-label>
|
||||||
<q-item-label lines="1">
|
<q-item-label lines="1">
|
||||||
{{row.quantity}} x {{currency(row.price)}}
|
{{ row.quantity }} x {{ currency(row.price) }}
|
||||||
</q-item-label>
|
</q-item-label>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
<q-item-section side class="total">
|
<q-item-section side class="total">
|
||||||
<q-item-label>
|
<q-item-label>
|
||||||
<span class="discount" v-if="row.discount">
|
<span class="discount" v-if="row.discount">
|
||||||
{{currency(discountSubtotal(row))}} -
|
{{ currency(discountSubtotal(row)) }} -
|
||||||
{{currency(row.discount)}} =
|
{{ currency(row.discount) }} =
|
||||||
</span>
|
</span>
|
||||||
{{currency(subtotal(row))}}
|
{{ currency(subtotal(row)) }}
|
||||||
</q-item-label>
|
</q-item-label>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
|
@ -87,10 +97,7 @@ export default {
|
||||||
'CALL myTicket_get(#ticket)',
|
'CALL myTicket_get(#ticket)',
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
this.rows = await this.$jApi.query(
|
this.rows = await this.$jApi.query('CALL myTicket_getRows(#ticket)', params)
|
||||||
'CALL myTicket_getRows(#ticket)',
|
|
||||||
params
|
|
||||||
)
|
|
||||||
this.services = await this.$jApi.query(
|
this.services = await this.$jApi.query(
|
||||||
'CALL myTicket_getServices(#ticket)',
|
'CALL myTicket_getServices(#ticket)',
|
||||||
params
|
params
|
||||||
|
@ -120,7 +127,9 @@ export default {
|
||||||
recipientId: this.$user.id,
|
recipientId: this.$user.id,
|
||||||
type: 'deliveryNote'
|
type: 'deliveryNote'
|
||||||
})
|
})
|
||||||
window.open(`/api/Tickets/${this.ticket.id}/delivery-note-pdf?${params.toString()}`)
|
window.open(
|
||||||
|
`/api/Tickets/${this.ticket.id}/delivery-note-pdf?${params.toString()}`
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="fullscreen bg-accent text-white text-center q-pa-md flex flex-center">
|
<div
|
||||||
|
class="fullscreen bg-accent text-white text-center q-pa-md flex flex-center"
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<div style="font-size: 30vh">
|
<div style="font-size: 30vh">404</div>
|
||||||
404
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="text-h2" style="opacity:.4">
|
<div class="text-h2" style="opacity: 0.4">Oops. Nothing here...</div>
|
||||||
Oops. Nothing here...
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<q-btn
|
<q-btn
|
||||||
class="q-mt-xl"
|
class="q-mt-xl"
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
alt="Quasar logo"
|
alt="Quasar logo"
|
||||||
src="~assets/quasar-logo-vertical.svg"
|
src="~assets/quasar-logo-vertical.svg"
|
||||||
style="width: 200px; height: 200px"
|
style="width: 200px; height: 200px"
|
||||||
>
|
/>
|
||||||
</q-page>
|
</q-page>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
@ -2,25 +2,18 @@
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<router-link to="/" class="block">
|
<router-link to="/" class="block">
|
||||||
<img
|
<img src="statics/logo.svg" alt="Verdnatura" class="block" />
|
||||||
src="statics/logo.svg"
|
|
||||||
alt="Verdnatura"
|
|
||||||
class="block"
|
|
||||||
/>
|
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<q-form @submit="onLogin" class="q-gutter-y-md">
|
<q-form @submit="onLogin" class="q-gutter-y-md">
|
||||||
<div class="q-gutter-y-sm">
|
<div class="q-gutter-y-sm">
|
||||||
<q-input
|
<q-input v-model="email" :label="$t('user')" autofocus />
|
||||||
v-model="email"
|
|
||||||
:label="$t('user')"
|
|
||||||
autofocus
|
|
||||||
/>
|
|
||||||
<q-input
|
<q-input
|
||||||
v-model="password"
|
v-model="password"
|
||||||
ref="password"
|
ref="password"
|
||||||
:label="$t('password')"
|
:label="$t('password')"
|
||||||
:type="showPwd ? 'password' : 'text'">
|
:type="showPwd ? 'password' : 'text'"
|
||||||
|
>
|
||||||
<template v-slot:append>
|
<template v-slot:append>
|
||||||
<q-icon
|
<q-icon
|
||||||
:name="showPwd ? 'visibility_off' : 'visibility'"
|
:name="showPwd ? 'visibility_off' : 'visibility'"
|
||||||
|
@ -60,20 +53,18 @@
|
||||||
</div>
|
</div>
|
||||||
<p class="password-forgotten text-center q-mt-lg">
|
<p class="password-forgotten text-center q-mt-lg">
|
||||||
<router-link to="/remember-password" class="link">
|
<router-link to="/remember-password" class="link">
|
||||||
{{$t('haveForgottenPassword')}}
|
{{ $t('haveForgottenPassword') }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</p>
|
</p>
|
||||||
</q-form>
|
</q-form>
|
||||||
<div class="footer text-center">
|
<div class="footer text-center">
|
||||||
<p>
|
<p>
|
||||||
{{$t('notACustomerYet')}}
|
{{ $t('notACustomerYet') }}
|
||||||
<a href="//verdnatura.es/register/" target="_blank" class="link">
|
<a href="//verdnatura.es/register/" target="_blank" class="link">
|
||||||
{{$t('signUp')}}
|
{{ $t('signUp') }}
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<p class="contact">
|
<p class="contact">{{ $t('loginPhone') }} · {{ $t('loginMail') }}</p>
|
||||||
{{$t('loginPhone')}} · {{$t('loginMail')}}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -106,13 +97,13 @@ a {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
.password-forgotten {
|
.password-forgotten {
|
||||||
font-size: .8rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
.footer {
|
.footer {
|
||||||
margin-bottom: $login-margin-top;
|
margin-bottom: $login-margin-top;
|
||||||
margin-top: $login-margin-between;
|
margin-top: $login-margin-between;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: .8rem;
|
font-size: 0.8rem;
|
||||||
|
|
||||||
.contact {
|
.contact {
|
||||||
margin-top: 15px;
|
margin-top: 15px;
|
||||||
|
|
|
@ -4,27 +4,27 @@
|
||||||
<q-icon
|
<q-icon
|
||||||
name="contact_support"
|
name="contact_support"
|
||||||
class="block q-mx-auto text-accent"
|
class="block q-mx-auto text-accent"
|
||||||
style="font-size: 120px;"
|
style="font-size: 120px"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<q-form @submit="onSend" class="q-gutter-y-md text-grey-8">
|
<q-form @submit="onSend" class="q-gutter-y-md text-grey-8">
|
||||||
<div class="text-h5">
|
<div class="text-h5">
|
||||||
<div>
|
<div>
|
||||||
{{$t('dontWorry')}}
|
{{ $t('dontWorry') }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{$t('fillData')}}
|
{{ $t('fillData') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<q-input
|
<q-input
|
||||||
v-model="email"
|
v-model="email"
|
||||||
:label="$t('user')"
|
:label="$t('user')"
|
||||||
:rules="[ val => !!val || $t('inputEmail')]"
|
:rules="[(val) => !!val || $t('inputEmail')]"
|
||||||
autofocus
|
autofocus
|
||||||
/>
|
/>
|
||||||
<div class="q-mt-lg">
|
<div class="q-mt-lg">
|
||||||
{{$t('weSendEmail')}}
|
{{ $t('weSendEmail') }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<q-btn
|
<q-btn
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
/>
|
/>
|
||||||
<div class="text-center q-mt-md">
|
<div class="text-center q-mt-md">
|
||||||
<router-link to="/login" class="link">
|
<router-link to="/login" class="link">
|
||||||
{{$t('return')}}
|
{{ $t('return') }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
font-size: .8rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<i18n lang="yaml">
|
<i18n lang="yaml">
|
||||||
en-US:
|
en-US:
|
||||||
user: User
|
user: User
|
||||||
inputEmail: Input email
|
inputEmail: Input email
|
||||||
rememberPassword: Rememeber password
|
rememberPassword: Rememeber password
|
||||||
|
@ -95,7 +95,7 @@ export default {
|
||||||
weHaveSentEmailToRecover: We've sent you an email where you can recover your password
|
weHaveSentEmailToRecover: We've sent you an email where you can recover your password
|
||||||
send: Send
|
send: Send
|
||||||
return: Return
|
return: Return
|
||||||
es-ES:
|
es-ES:
|
||||||
user: Usuario
|
user: Usuario
|
||||||
inputEmail: Introduce el correo electrónico
|
inputEmail: Introduce el correo electrónico
|
||||||
rememberPassword: Recordar contraseña
|
rememberPassword: Recordar contraseña
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
<q-icon
|
<q-icon
|
||||||
name="check"
|
name="check"
|
||||||
class="block q-mx-auto text-accent"
|
class="block q-mx-auto text-accent"
|
||||||
style="font-size: 120px;"
|
style="font-size: 120px"
|
||||||
/>
|
/>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<q-form @submit="onRegister" ref="form" class="q-gutter-y-md">
|
<q-form @submit="onRegister" ref="form" class="q-gutter-y-md">
|
||||||
<div class="text-grey-8 text-h5 text-center">
|
<div class="text-grey-8 text-h5 text-center">
|
||||||
{{$t('fillData')}}
|
{{ $t('fillData') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="q-gutter-y-sm">
|
<div class="q-gutter-y-sm">
|
||||||
<q-input
|
<q-input
|
||||||
|
@ -19,7 +19,8 @@
|
||||||
:type="showPwd ? 'password' : 'text'"
|
:type="showPwd ? 'password' : 'text'"
|
||||||
autofocus
|
autofocus
|
||||||
hint=""
|
hint=""
|
||||||
filled>
|
filled
|
||||||
|
>
|
||||||
<template v-slot:append>
|
<template v-slot:append>
|
||||||
<q-icon
|
<q-icon
|
||||||
:name="showPwd ? 'visibility_off' : 'visibility'"
|
:name="showPwd ? 'visibility_off' : 'visibility'"
|
||||||
|
@ -32,9 +33,10 @@
|
||||||
v-model="repeatPassword"
|
v-model="repeatPassword"
|
||||||
:label="$t('repeatPassword')"
|
:label="$t('repeatPassword')"
|
||||||
:type="showRpPwd ? 'password' : 'text'"
|
:type="showRpPwd ? 'password' : 'text'"
|
||||||
:rules="[value => value == password || $t('repeatPasswordError')]"
|
:rules="[(value) => value == password || $t('repeatPasswordError')]"
|
||||||
hint=""
|
hint=""
|
||||||
filled>
|
filled
|
||||||
|
>
|
||||||
<template v-slot:append>
|
<template v-slot:append>
|
||||||
<q-icon
|
<q-icon
|
||||||
:name="showRpPwd ? 'visibility_off' : 'visibility'"
|
:name="showRpPwd ? 'visibility_off' : 'visibility'"
|
||||||
|
@ -53,7 +55,7 @@
|
||||||
/>
|
/>
|
||||||
<div class="text-center q-mt-xs">
|
<div class="text-center q-mt-xs">
|
||||||
<router-link to="/login" class="link">
|
<router-link to="/login" class="link">
|
||||||
{{$t('return')}}
|
{{ $t('return') }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -78,9 +80,13 @@ export default {
|
||||||
const headers = {
|
const headers = {
|
||||||
Authorization: this.$route.query.access_token
|
Authorization: this.$route.query.access_token
|
||||||
}
|
}
|
||||||
await this.$axios.post('users/reset-password', {
|
await this.$axios.post(
|
||||||
|
'users/reset-password',
|
||||||
|
{
|
||||||
newPassword: this.password
|
newPassword: this.password
|
||||||
}, { headers })
|
},
|
||||||
|
{ headers }
|
||||||
|
)
|
||||||
|
|
||||||
this.$q.notify({
|
this.$q.notify({
|
||||||
message: this.$t('passwordResetSuccessfully'),
|
message: this.$t('passwordResetSuccessfully'),
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
import { route } from 'quasar/wrappers'
|
import { route } from 'quasar/wrappers'
|
||||||
import { appStore } from 'stores/app'
|
import { appStore } from 'stores/app'
|
||||||
import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router'
|
import {
|
||||||
|
createRouter,
|
||||||
|
createMemoryHistory,
|
||||||
|
createWebHistory,
|
||||||
|
createWebHashHistory
|
||||||
|
} from 'vue-router'
|
||||||
import routes from './routes'
|
import routes from './routes'
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -15,7 +20,9 @@ import routes from './routes'
|
||||||
export default route(function (/* { store, ssrContext } */) {
|
export default route(function (/* { store, ssrContext } */) {
|
||||||
const createHistory = process.env.SERVER
|
const createHistory = process.env.SERVER
|
||||||
? createMemoryHistory
|
? createMemoryHistory
|
||||||
: (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory)
|
: process.env.VUE_ROUTER_MODE === 'history'
|
||||||
|
? createWebHistory
|
||||||
|
: createWebHashHistory
|
||||||
|
|
||||||
const Router = createRouter({
|
const Router = createRouter({
|
||||||
scrollBehavior: () => ({ left: 0, top: 0 }),
|
scrollBehavior: () => ({ left: 0, top: 0 }),
|
||||||
|
@ -24,7 +31,9 @@ export default route(function (/* { store, ssrContext } */) {
|
||||||
// Leave this as is and make changes in quasar.conf.js instead!
|
// Leave this as is and make changes in quasar.conf.js instead!
|
||||||
// quasar.conf.js -> build -> vueRouterMode
|
// quasar.conf.js -> build -> vueRouterMode
|
||||||
// quasar.conf.js -> build -> publicPath
|
// quasar.conf.js -> build -> publicPath
|
||||||
history: createHistory(process.env.MODE === 'ssr' ? void 0 : process.env.VUE_ROUTER_BASE)
|
history: createHistory(
|
||||||
|
process.env.MODE === 'ssr' ? void 0 : process.env.VUE_ROUTER_BASE
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
Router.afterEach((to, from) => {
|
Router.afterEach((to, from) => {
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '/login',
|
path: '/login',
|
||||||
|
@ -8,17 +7,20 @@ const routes = [
|
||||||
name: 'login',
|
name: 'login',
|
||||||
path: '/login/:email?',
|
path: '/login/:email?',
|
||||||
component: () => import('pages/Login/Login.vue')
|
component: () => import('pages/Login/Login.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'rememberPassword',
|
name: 'rememberPassword',
|
||||||
path: '/remember-password',
|
path: '/remember-password',
|
||||||
component: () => import('pages/Login/RememberPassword.vue')
|
component: () => import('pages/Login/RememberPassword.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'resetPassword',
|
name: 'resetPassword',
|
||||||
path: '/reset-password',
|
path: '/reset-password',
|
||||||
component: () => import('pages/Login/ResetPassword.vue')
|
component: () => import('pages/Login/ResetPassword.vue')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
component: () => import('layouts/MainLayout.vue'),
|
component: () => import('layouts/MainLayout.vue'),
|
||||||
children: [
|
children: [
|
||||||
|
@ -26,23 +28,28 @@ const routes = [
|
||||||
name: '',
|
name: '',
|
||||||
path: '',
|
path: '',
|
||||||
component: () => import('src/pages/Cms/Home.vue')
|
component: () => import('src/pages/Cms/Home.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'home',
|
name: 'home',
|
||||||
path: '/cms/home',
|
path: '/cms/home',
|
||||||
component: () => import('src/pages/Cms/Home.vue')
|
component: () => import('src/pages/Cms/Home.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'orders',
|
name: 'orders',
|
||||||
path: '/ecomerce/orders',
|
path: '/ecomerce/orders',
|
||||||
component: () => import('pages/Ecomerce/Orders.vue')
|
component: () => import('pages/Ecomerce/Orders.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'ticket',
|
name: 'ticket',
|
||||||
path: '/ecomerce/ticket/:id',
|
path: '/ecomerce/ticket/:id',
|
||||||
component: () => import('pages/Ecomerce/Ticket.vue')
|
component: () => import('pages/Ecomerce/Ticket.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'invoices',
|
name: 'invoices',
|
||||||
path: '/ecomerce/invoices',
|
path: '/ecomerce/invoices',
|
||||||
component: () => import('pages/Ecomerce/Invoices.vue')
|
component: () => import('pages/Ecomerce/Invoices.vue')
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
name: 'catalog',
|
name: 'catalog',
|
||||||
path: '/ecomerce/catalog/:category?/:type?',
|
path: '/ecomerce/catalog/:category?/:type?',
|
||||||
component: () => import('pages/Ecomerce/Catalog.vue')
|
component: () => import('pages/Ecomerce/Catalog.vue')
|
||||||
|
|
|
@ -12,9 +12,7 @@ export const appStore = defineStore('hedera', {
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
async loadConfig () {
|
async loadConfig () {
|
||||||
const imageUrl = await jApi.getValue(
|
const imageUrl = await jApi.getValue('SELECT url FROM imageConfig')
|
||||||
'SELECT url FROM imageConfig'
|
|
||||||
)
|
|
||||||
this.$patch({ imageUrl })
|
this.$patch({ imageUrl })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// THIS FEATURE-FLAG FILE IS AUTOGENERATED,
|
// THIS FEATURE-FLAG FILE IS AUTOGENERATED,
|
||||||
// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING
|
// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING
|
||||||
import "quasar/dist/types/feature-flag";
|
import 'quasar/dist/types/feature-flag'
|
||||||
|
|
||||||
declare module "quasar/dist/types/feature-flag" {
|
declare module 'quasar/dist/types/feature-flag' {
|
||||||
interface QuasarFeatureFlags {
|
interface QuasarFeatureFlags {
|
||||||
store: true;
|
store: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,16 @@ export const tpvStore = defineStore('tpv', {
|
||||||
const status = route.query.tpvStatus
|
const status = route.query.tpvStatus
|
||||||
if (!(order && status)) return null
|
if (!(order && status)) return null
|
||||||
|
|
||||||
await jApi.execQuery(
|
await jApi.execQuery('CALL myTpvTransaction_end(#order, #status)', {
|
||||||
'CALL myTpvTransaction_end(#order, #status)',
|
order,
|
||||||
{ order, status }
|
status
|
||||||
)
|
})
|
||||||
|
|
||||||
if (status === 'ko') {
|
if (status === 'ko') {
|
||||||
const retry = confirm('retryPayQuestion')
|
const retry = confirm('retryPayQuestion')
|
||||||
if (retry) { this.retryPay(order) }
|
if (retry) {
|
||||||
|
this.retryPay(order)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return status
|
return status
|
||||||
|
@ -61,7 +63,9 @@ export const tpvStore = defineStore('tpv', {
|
||||||
input.name = field
|
input.name = field
|
||||||
form.appendChild(input)
|
form.appendChild(input)
|
||||||
|
|
||||||
if (postValues[field]) { input.value = postValues[field] }
|
if (postValues[field]) {
|
||||||
|
input.value = postValues[field]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
form.submit()
|
form.submit()
|
||||||
|
@ -73,7 +77,9 @@ export const tpvStore = defineStore('tpv', {
|
||||||
path += location.pathname
|
path += location.pathname
|
||||||
path += location.search ? location.search : ''
|
path += location.search ? location.search : ''
|
||||||
path += '#/ecomerce/orders'
|
path += '#/ecomerce/orders'
|
||||||
path += '?' + new URLSearchParams({
|
path +=
|
||||||
|
'?' +
|
||||||
|
new URLSearchParams({
|
||||||
tpvStatus: status,
|
tpvStatus: status,
|
||||||
tpvOrder: '_transactionId_'
|
tpvOrder: '_transactionId_'
|
||||||
}).toString()
|
}).toString()
|
||||||
|
|
|
@ -4,8 +4,7 @@ import { api, jApi } from 'boot/axios'
|
||||||
export const userStore = defineStore('user', {
|
export const userStore = defineStore('user', {
|
||||||
state: () => {
|
state: () => {
|
||||||
const token =
|
const token =
|
||||||
sessionStorage.getItem('vnToken') ||
|
sessionStorage.getItem('vnToken') || localStorage.getItem('vnToken')
|
||||||
localStorage.getItem('vnToken')
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
token,
|
token,
|
||||||
|
@ -16,7 +15,7 @@ export const userStore = defineStore('user', {
|
||||||
},
|
},
|
||||||
|
|
||||||
getters: {
|
getters: {
|
||||||
loggedIn: state => state.token != null
|
loggedIn: (state) => state.token != null
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
|
Loading…
Reference in New Issue