Bring updates from AppServ branch

This commit is contained in:
Juan Carlos Ruvalcaba 2021-08-24 13:51:24 -07:00
parent 4e967f0b1e
commit 1d99514428
23 changed files with 1951 additions and 2282 deletions

View File

@ -2,7 +2,6 @@ const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
@ -24,6 +23,10 @@ module.exports = {
entry: {
app: './src/js/app.js',
},
performance: {
hints: false,
maxEntrypointSize: 400000,
},
output: {
path: resolvePath(isCordova ? (isElectronWatch ? 'cordova/platforms/electron/www' : 'cordova/www') : 'www'),
filename: 'js/[name].js',
@ -37,16 +40,18 @@ module.exports = {
alias: {
'@': resolvePath('src'),
},
fallback: { crypto: false },
},
devtool: env === 'production' ? 'source-map' : 'eval',
devServer: {
hot: true,
open: true,
compress: true,
contentBase: '/www/',
disableHostCheck: true,
//contentBase: '/www/',
static: '/www/',
allowedHosts: "all",
historyApiFallback: true,
port: 8082,
},
optimization: {
concatenateModules: true,
@ -58,12 +63,10 @@ module.exports = {
test: /\.(mjs|js|jsx)$/,
include: [
resolvePath('src'),
],
use: [
{
loader: require.resolve('babel-loader'),
},
]
},
@ -74,8 +77,6 @@ module.exports = {
'framework7-loader',
],
},
{
test: /\.css$/,
use: [
@ -133,33 +134,24 @@ module.exports = {
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'images/[name].[ext]',
},
type: 'javascript/auto'
type: "asset/resource",
generator: {
filename: "images/[name][ext]",
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac|m4a)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name].[ext]',
},
type: 'javascript/auto'
type: "asset/resource",
generator: {
filename: "media/[name][ext]",
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'fonts/[name].[ext]',
},
type: 'javascript/auto'
type: "asset/resource",
generator: {
filename: "fonts/[name][ext]",
}
},
],
},
@ -211,6 +203,5 @@ module.exports = {
swSrc: resolvePath('src/service-worker.js'),
})
] : []),
],
};

View File

@ -1,101 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.comidacab.app" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Comida Cab</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<allow-navigation href="*" />
<platform name="android">
<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="android-minSdkVersion" value="22" />
<preference name="SplashMaintainAspectRatio" value="true" />
<splash density="land-hdpi" src="res/screen/android/drawable-hdpi/screen.png" />
<splash density="land-mdpi" src="res/screen/android/drawable-mdpi/screen.png" />
<splash density="land-xhdpi" src="res/screen/android/drawable-xhdpi/screen.png" />
<splash density="land-xxhdpi" src="res/screen/android/drawable-xxhdpi/screen.png" />
<splash density="land-xxxhdpi" src="res/screen/android/drawable-xxxhdpi/screen.png" />
<splash density="port-hdpi" src="res/screen/android/drawable-hdpi/screen.png" />
<splash density="port-mdpi" src="res/screen/android/drawable-mdpi/screen.png" />
<splash density="port-xhdpi" src="res/screen/android/drawable-xhdpi/screen.png" />
<splash density="port-xxhdpi" src="res/screen/android/drawable-xxhdpi/screen.png" />
<splash density="port-xxxhdpi" src="res/screen/android/drawable-xxxhdpi/screen.png" />
<icon density="ldpi" src="res/icon/android/mipmap-ldpi/ic_launcher.png" />
<icon density="mdpi" src="res/icon/android/mipmap-mdpi/ic_launcher.png" />
<icon density="hdpi" src="res/icon/android/mipmap-hdpi/ic_launcher.png" />
<icon density="xhdpi" src="res/icon/android/mipmap-xhdpi/ic_launcher.png" />
<icon density="xxhdpi" src="res/icon/android/mipmap-xxhdpi/ic_launcher.png" />
<icon density="xxxhdpi" src="res/icon/android/mipmap-xxxhdpi/ic_launcher.png" />
</platform>
<platform name="ios">
<config-file parent="CFBundleAllowMixedLocalizations" platform="ios" target="*-Info.plist">
<true />
</config-file>
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
<preference name="StatusBarOverlaysWebView" value="true" />
<splash src="res/screen/ios/Default@2x~universal~anyany.png" />
<icon height="180" src="res/icon/ios/icon-60x60@3x.png" width="180" />
<icon height="60" src="res/icon/ios/icon-60x60@1x.png" width="60" />
<icon height="120" src="res/icon/ios/icon-60x60@2x.png" width="120" />
<icon height="76" src="res/icon/ios/icon-76x76@1x.png" width="76" />
<icon height="152" src="res/icon/ios/icon-76x76@2x.png" width="152" />
<icon height="228" src="res/icon/ios/icon-76x76@3x.png" width="228" />
<icon height="40" src="res/icon/ios/icon-40x40@1x.png" width="40" />
<icon height="80" src="res/icon/ios/icon-40x40@2x.png" width="80" />
<icon height="87" src="res/icon/ios/icon-29x29@3x.png" width="87" />
<icon height="57" src="res/icon/ios/icon-57x57@1x.png" width="57" />
<icon height="114" src="res/icon/ios/icon-57x57@2x.png" width="114" />
<icon height="72" src="res/icon/ios/icon-72x72@1x.png" width="72" />
<icon height="144" src="res/icon/ios/icon-72x72@2x.png" width="144" />
<icon height="167" src="res/icon/ios/icon-83.5x83.5@2x.png" width="167" />
<icon height="29" src="res/icon/ios/icon-29x29@1x.png" width="29" />
<icon height="58" src="res/icon/ios/icon-29x29@2x.png" width="58" />
<icon height="50" src="res/icon/ios/icon-50x50@1x.png" width="50" />
<icon height="100" src="res/icon/ios/icon-50x50@2x.png" width="100" />
<icon height="167" src="res/icon/ios/icon-83.5x83.5@2x.png" width="167" />
<icon height="1024" src="res/icon/ios/icon-512x512@2x.png" width="1024" />
</platform>
<platform name="electron">
<preference name="ElectronSettingsFilePath" value="electron-settings.json" />
<icon src="res/icon/electron/app.png" target="app" />
<icon src="res/icon/electron/installer.png" target="installer" />
<preference name="ShowSplashScreen" value="false" />
<preference name="AutoHideSplashScreen" value="true" />
</platform>
<preference name="DisallowOverscroll" value="true" />
<preference name="BackupWebStorage" value="local" />
<preference name="AutoHideSplashScreen" value="false" />
<preference name="ShowSplashScreenSpinner" value="false" />
<preference name="SplashScreenDelay" value="0" />
<preference name="Suppresses3DTouchGesture" value="true" />
<preference name="Allow3DTouchLinkPreview" value="false" />
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
<preference name="AllowInlineMediaPlayback" value="true" />
</widget>

View File

@ -1033,6 +1033,11 @@
"integrity": "sha512-EYC5eQFVkoYXq39l7tYKE6lEjHJ04mvTmKXxGL7quHLdFPfJMNzru/UYpn92AOfpl3PQaZmou78C7EgmFOwFQQ==",
"dev": true
},
"cordova-sms-plugin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cordova-sms-plugin/-/cordova-sms-plugin-1.0.1.tgz",
"integrity": "sha512-M4PJVor41e/+KkntTIg8FoVQRDSeLzJhFiwk7AkXU82ssqdVBn/z0yb8mG3Ylx9goUCGGQYtmqdt1hJJx8lWLQ=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@ -2273,6 +2278,11 @@
"wrappy": "1"
}
},
"onesignal-cordova-plugin": {
"version": "2.11.4",
"resolved": "https://registry.npmjs.org/onesignal-cordova-plugin/-/onesignal-cordova-plugin-2.11.4.tgz",
"integrity": "sha512-Iy0u65XK/gXj4U/82prOOcNZMKm415FThhxqMY4epJcW11EjdMIm33DQr1MDnV9s3UjZcgTZ4DIlhLEoLGR05w=="
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",

View File

@ -18,14 +18,18 @@
"cordova-ios": "^6.2.0",
"cordova-plugin-keyboard": "^1.2.0",
"cordova-plugin-splashscreen": "^6.0.0",
"cordova-plugin-statusbar": "^2.4.3"
"cordova-plugin-statusbar": "^2.4.3",
"cordova-sms-plugin": "^1.0.1",
"onesignal-cordova-plugin": "^2.11.4"
},
"cordova": {
"plugins": {
"cordova-plugin-statusbar": {},
"cordova-plugin-keyboard": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-whitelist": {}
"cordova-plugin-whitelist": {},
"cordova-sms-plugin": {},
"onesignal-cordova-plugin": {}
},
"platforms": [
"ios",

View File

@ -1,39 +0,0 @@
{
"name": "com.comidacab.app",
"displayName": "Comida Cab",
"version": "1.0.0",
"description": "A sample Apache Cordova application that responds to the deviceready event.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"ecosystem:cordova"
],
"author": "Apache Cordova Team",
"license": "Apache-2.0",
"dependencies": {
"cordova-android": "^8.1.0",
"cordova-electron": "^1.1.1",
"cordova-ios": "^6.2.0",
"cordova-plugin-keyboard": "^1.2.0",
"cordova-plugin-splashscreen": "^6.0.0",
"cordova-plugin-statusbar": "^2.4.3"
},
"cordova": {
"plugins": {
"cordova-plugin-statusbar": {},
"cordova-plugin-keyboard": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-whitelist": {}
},
"platforms": [
"ios",
"android",
"electron"
]
},
"devDependencies": {
"cordova-plugin-whitelist": "^1.3.4"
}
}

3530
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@
"license": "UNLICENSED",
"scripts": {
"start": "npm run dev",
"dev": "cross-env NODE_ENV=development webpack serve --config ./build/webpack.config.js --port 8082",
"dev": "cross-env NODE_ENV=development webpack serve --config ./build/webpack.config.js",
"build": "cross-env NODE_ENV=production node ./build/build.js",
"build-cordova": "cross-env TARGET=cordova cross-env NODE_ENV=production node ./build/build.js && cd cordova && cordova build",
"build-cordova-ios": "cross-env TARGET=cordova cross-env NODE_ENV=production node ./build/build.js && cd cordova && cordova build ios",
"cordova-ios": "cross-env TARGET=cordova cross-env NODE_ENV=development node ./build/build.js && cd cordova && cordova run ios",
"build-cordova-android": "cross-env TARGET=cordova cross-env NODE_ENV=production node ./build/build.js && cd cordova && cordova build android",
"cordova-android": "cross-env TARGET=cordova cross-env NODE_ENV=development node ./build/build.js && cd cordova && cordova run android",
"build-cordova-ios": "cross-env TARGET=cordova cross-env NODE_ENV=production node ./build/build.js && cd cordova && cordova build ios",
"build-cordova-electron": "cross-env TARGET=cordova cross-env NODE_ENV=production node ./build/build.js && cd cordova && cordova build electron",
"cordova-android": "cross-env TARGET=cordova cross-env NODE_ENV=development node ./build/build.js && cd cordova && cordova run android",
"cordova-ios": "cross-env TARGET=cordova cross-env NODE_ENV=development node ./build/build.js && cd cordova && cordova run ios",
"cordova-electron": "cross-env TARGET=cordova cross-env NODE_ENV=development node ./build/build.js && concurrently --kill-others \"cross-env TARGET=cordova cross-env ELECTRON_WATCH=true cross-env NODE_ENV=development cross-env webpack --progress --config ./build/webpack.config.js --watch\" \"cd cordova && cordova run electron --nobuild\"",
"postinstall": "cpy ./node_modules/framework7-icons/fonts/*.* ./src/fonts/"
},
@ -30,21 +30,22 @@
"axios": "^0.21.1",
"crypto-js": "^4.1.1",
"dom7": "^3.0.0",
"framework7": "^6.0.22",
"framework7-icons": "^4.0.2",
"localforage": "^1.9.0",
"framework7": "^6.3.0",
"framework7-icons": "^5.0.3",
"html2pdf.js": "^0.9.3",
"localforage": "^1.10.0",
"skeleton-elements": "^3.4.0",
"swiper": "^6.8.0"
"swiper": "^6.8.3"
},
"devDependencies": {
"@babel/core": "^7.14.8",
"@babel/plugin-transform-runtime": "^7.14.5",
"@babel/preset-env": "^7.14.8",
"@babel/core": "^7.15.0",
"@babel/plugin-transform-runtime": "^7.15.0",
"@babel/preset-env": "^7.15.0",
"@babel/preset-react": "^7.14.5",
"@babel/runtime": "^7.14.8",
"@babel/runtime": "^7.15.3",
"babel-loader": "^8.2.2",
"chalk": "^4.1.1",
"concurrently": "^6.2.0",
"chalk": "^4.1.2",
"concurrently": "^6.2.1",
"copy-webpack-plugin": "^9.0.1",
"cpy-cli": "^3.1.1",
"cross-env": "^7.0.3",
@ -52,10 +53,12 @@
"css-minimizer-webpack-plugin": "^3.0.2",
"file-loader": "^6.2.0",
"framework7-loader": "^3.0.2",
"html2canvas": "^1.3.2",
"html-webpack-plugin": "^5.3.2",
"jspdf": "^2.3.1",
"less": "^4.1.1",
"less-loader": "^10.0.1",
"mini-css-extract-plugin": "^2.1.0",
"mini-css-extract-plugin": "^2.2.0",
"ora": "^5.4.1",
"postcss-loader": "^6.1.1",
"postcss-preset-env": "^6.7.0",
@ -63,9 +66,9 @@
"style-loader": "^3.2.1",
"terser-webpack-plugin": "^5.1.4",
"url-loader": "^4.1.1",
"webpack": "^5.46.0",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2",
"workbox-webpack-plugin": "^6.1.5"
"webpack": "^5.51.1",
"webpack-cli": "^4.8.0",
"webpack-dev-server": "^4.0.0",
"workbox-webpack-plugin": "^6.2.4"
}
}

View File

@ -8,12 +8,14 @@
</div>
</template>
<script>
import themes from './js/stores/theme.js';
import theme from './js/stores/theme.js';
import user from './js/stores/user.js';
export default (props, { $f7, $, $update, $onMounted }) => {
$onMounted(async () => {
await themes.dispatch('initTheme', '#app');
await theme.dispatch('initTheme', '#app');
await user.dispatch('checkData');
});
return $render;

View File

@ -4,6 +4,7 @@ import axios from 'axios';
const http = axios.create({
baseURL: `${url}`,
validateStatus: status => (status => 200 && status < 300) || (status => 400 && status < 500),
});
async function checkToken (){
@ -15,4 +16,4 @@ async function checkToken (){
checkToken();
export { http, localForage };
export { http, localForage };

View File

@ -50,6 +50,12 @@ var app = new Framework7({
closeButtonText: "[X]"
},
smartSelect:{
openIn:"popup",
searchbar:"true",
popupCloseLinkText:"Cerrar",
},
// Input settings
input: {
scrollIntoViewOnFocus: device.cordova && !device.electron,

View File

@ -0,0 +1,127 @@
let datetimePicker = {
timeConfig(selector){
let currentDate = new Date();
let hour = currentDate.getHours();
let min = currentDate.getMinutes();
hour = (hour < 10) ? '0' + hour : hour;
min = (min < 10) ? '0'+ min : min;
return {
inputEl: selector,
toolbar: true,
toolbarCloseText: 'Cerrar',
rotateEffect: true,
openIn: 'sheet',
value: [ hour, min ],
formatValue: function (values) {
return values[0] + ':' + values[1] + ':00';
},
cols: [
// Hours
{
values: (function () {
var arr = [];
for (var i = 0; i <= 23; i++) { arr.push(i < 10 ? '0' + i : i); }
return arr;
})(),
},
// Divider
{
divider: true,
content: ':'
},
// Minutes
{
values: (function () {
var arr = [];
for (var i = 0; i <= 59; i++) { arr.push(i < 10 ? '0' + i : i); }
return arr;
})(),
}
],
};
},
dateConfig(selector){
const today = new Date();
return{
inputEl: selector,
toolbar: true,
toolbarCloseText: 'Cerrar',
rotateEffect: true,
openIn: "sheet",
value: [
today.getMonth(),
today.getDate(),
today.getFullYear(),
today.getHours() < 10 ? '0' + today.getHours() : today.getHours(),
today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes()
],
formatValue: function (values, displayValues) {
let day = values[1];
let month = values[0];
month++;
month = (month < 10) ? "0" + month : month;
day = (day < 10) ? "0" + day : day;
return values[2] + '-' + month + '-' + day + ' ' + values[3] + ':' + values[4] + ':00';
},
cols: [
// Months
{
values: ('0 1 2 3 4 5 6 7 8 9 10 11').split(' '),
displayValues: ('Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre').split(' '),
textAlign: 'left'
},
// Days
{
values: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],
},
// Years
{
values: (function () {
var arr = [];
for (var i = 1950; i <= 2030; i++) { arr.push(i); }
return arr;
})(),
},
// Space divider
{
divider: true,
content: '&nbsp;&nbsp;'
},
// Hours
{
values: (function () {
var arr = [];
for (var i = 0; i <= 23; i++) { arr.push(i < 10 ? '0' + i : i); }
return arr;
})(),
},
// Divider
{
divider: true,
content: ':'
},
// Minutes
{
values: (function () {
var arr = [];
for (var i = 0; i <= 59; i++) { arr.push(i < 10 ? '0' + i : i); }
return arr;
})(),
}
],
on: {
change: function (picker, values, displayValues) {
var daysInMonth = new Date(picker.value[2], picker.value[0]*1 + 1, 0).getDate();
if (values[1] > daysInMonth) {
picker.cols[1].setValue(daysInMonth);
}
},
}
};
},
};
export default datetimePicker;

View File

@ -0,0 +1,35 @@
import $$ from 'dom7';
let Preload = {
Autocomplete(list, selectorText, selectorValue){
return {
inputEl: selectorText,
openIn: 'dropdown',
valueProperty: 'text',
textProperty: 'text',
limit: 8,
source: function (query, render) {
let results = [];
if (query.length === 0) {
render(results);
return;
}
for (let i = 0; i < list.length; i++) {
if (list[i].text.toLowerCase().indexOf(query.toLowerCase()) >= 0){
results.push(list[i]);
}
}
render(results);
},
on: {
change: function (value) {
$$(selectorValue).val(value[0].id);
}
}
}
},
}
export default Preload;

View File

@ -13,6 +13,7 @@ import Progressbar from 'framework7/components/progressbar';
import Sortable from 'framework7/components/sortable';
import Swipeout from 'framework7/components/swipeout';
import Accordion from 'framework7/components/accordion';
import Gauge from 'framework7/components/gauge';
import ContactsList from 'framework7/components/contacts-list';
import VirtualList from 'framework7/components/virtual-list';
import ListIndex from 'framework7/components/list-index';
@ -67,6 +68,7 @@ Framework7.use([
Sortable,
Swipeout,
Accordion,
Gauge,
ContactsList,
VirtualList,
ListIndex,

94
src/js/stores/file.js Normal file
View File

@ -0,0 +1,94 @@
import { createStore } from 'framework7';
import { http } from './../api/config.js';
const file = createStore({
state: {
item: {},
list: [],
},
actions: {
//Mutations
insert_list_data({ state }, data) {
state.list = data;
},
set_item({ state}, data){
state.item = data;
},
//End mutations
async getFileItem({ dispatch }, param){
let response = [];
let result = {};
result = await http.get(`file/get/${param}`);
if (result.status === 200){
response = result.data;
response.FilePath = `${http.defaults.baseURL}/${response.FilePath}/${response.FileName}`;
dispatch('set_item', response);
return response;
}
else{
return result;
}
},
async getFileRequestOrder({ dispatch }, param){
let response = [];
let result = {};
result = await http.get(`file/requestorder/${param}`);
if (result.status === 200){
response = result.data;
dispatch('set_item', response);
return response;
}
else{
return result;
}
},
async getFileRequestOrderItem({ dispatch }, param){
let response = [];
let result = {};
result = await http.get(`file/requestorder/${param}`);
if (result.status === 200){
response = result.data;
dispatch('insert_list_data', response);
return response;
}
else{
return result;
}
},
async uploadFileRequestOrder({ dispatch }, item){
let response = [];
let result = {};
result = await http.post(`file/upload/requestorder/single`, item);
if (result.status === 201){
response = result.data;
//item.RequestOrderId = response;
//dispatch('add_request_order_to_list', item);
//return item;
return response;
}
else{
return result;
}
},
async getFileBatch({ dispatch }, params){
},
async uploadFileItem({ dispatch }, params){
},
async uploadFileBatch({ dispatch }, params){
},
},
getters: {
Item({ state }) {
return state.name;
}
},
});
export default file;

View File

@ -0,0 +1,86 @@
import { createStore } from 'framework7';
import { container } from 'webpack';
import { http, localForage } from './../api/config.js';
const geolocation = createStore({
state:{
position: {
// latitude: 0.00,
// longitude: 0.00,
},
container: 'map',
},
actions: {
//Mutations
setPosition({ state }, result) {
state.position = result;
},
setContainer({ state }, result){
state.container = result;
},
//End mutations
getMapLocation({ dispatch}, item){
dispatch('setContainer', item);
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
position => {
resolve(this.mapSuccess(position));
},
error => { reject (this.mapError(error));
},
{ enableHighAccuracy: true }
);
});
//navigator.geolocation.getCurrentPosition(this.mapSuccess, this.mapError, { enableHighAccuracy: true });
},
getMap (latitude, longitude){
},
getLocationData({ dispatch }){
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
position => {
dispatch('setPosition', position);
resolve(position);
},
error => { reject(this.mapError(error)); },
{ enableHighAccuracy: true }
);
});
},
mapSuccess(position){
let mapOptions = {
center: new google.maps.LatLng(0, 0),
zoom: 1,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
const map = new google.maps.Map(document.getElementById(this.state.container), mapOptions);
const latLong = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
const marker = new google.maps.Marker({
position: latLong
});
marker.setMap(map);
map.setZoom(15);
map.setCenter(marker.getPosition());
},
mapError(error){
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
},
getters: {
Position({ state }){
return state.position;
},
Container({ state }) {
return state.container;
}
},
});
export default geolocation;

View File

@ -14,6 +14,7 @@ const theme = createStore({
//End mutations
async checkTheme({ dispatch }, selector){
let theme = await localForage.getItem('theme');
if (theme == null) theme = 'theme-dark';
if (theme != 'theme-dark'){ $(selector).removeClass('theme-dark'); }
dispatch('changeTheme', theme);
},
@ -31,7 +32,7 @@ const theme = createStore({
getters: {
Name({ state }) {
return state.name;
}
},
},
})

View File

@ -7,22 +7,19 @@ const user = createStore({
token: '',
user: {},
roles: [],
//location: {},
},
actions: {
async setBasicData({ dispatch }, { token, user, roles/*, location*/ }){
async setBasicData({ dispatch }, { token, user, roles }){
await localForage.setItem('user', user);
await localForage.setItem('token', token);
await localForage.setItem('roles', roles);
//await localForage.setItem('location', location);
dispatch('auth_success', { token, user, roles/*, location*/ });
dispatch('auth_success', { token, user, roles});
},
async getBasicData({ dispatch }){
const result = {
user: await localForage.getItem('user'),
token: await localForage.getItem('token'),
roles: await localForage.getItem('roles'),
//location: await localForage.getItem('location'),
}
dispatch('auth_success', result);
},
@ -30,12 +27,20 @@ const user = createStore({
await localForage.deleteItem('user');
await localForage.deleteItem('token');
await localForage.deleteItem('roles');
//await localForage.deleteItem('location');
},
async checkData({ dispatch }){
let token = await localForage.getItem('token');
if (token != null){
await dispatch('getBasicData');
let data = this.decodeJWT(token);
let today = new Date(); //Current date
let expirationDate = new Date(data.expiration);
if (today.getTime() < expirationDate.getTime()){
await dispatch('getBasicData');
}
else{
await dispatch('logOut');
}
}
},
async logIn({ dispatch }, data){
@ -48,7 +53,6 @@ const user = createStore({
delete response.data.token;
delete response.data.roles;
//delete response.data.location;
return response;
}
@ -64,22 +68,29 @@ const user = createStore({
delete http.defaults.headers.common['Authorization'];
},
//Mutations
decodeJWT (token) {
let base64Url = token.split('.')[1];
let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
let jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
},
logout({ state }){
state.status = '';
state.token = '';
state.user = {};
state.roles = [];
//state.location = {};
},
auth_request({ state }){
state.status = 'loading';
},
auth_success({ state }, { token, user, roles/*, location*/ }){
auth_success({ state }, { token, user, roles }){
state.status = 'success';
state.token = token;
state.user = user;
state.roles = roles;
//state.location = location;
},
auth_error({ state }){
state.status = 'error'
@ -99,9 +110,6 @@ const user = createStore({
roles({ state }){
return state.roles;
},
// location({ state }){
// return state.location
// },
displayName({ state }){
return state.user;
}

View File

@ -12,9 +12,18 @@
</div>
<div class="title sliding">Administración de app</div>
<div class="right">
<a class="link icon-only">
<i class="icon material-icons color-teal">notifications
<span class="badge color-red">5</span>
</i>
</a>
<a class="link icon-only">
<i class="icon material-icons color-orange">task
<span class="badge color-red">3</span>
</i>
</a>
<a href="/panel-right/" class="link icon-only">
<i class="icon f7-icons if-not-md">menu</i>
<i class="icon material-icons if-md">more_vert</i>
<i class="icon material-icons">more_vert</i>
</a>
</div>
<div class="title-large">
@ -33,7 +42,7 @@
<li>
<a href="/about/" class="item-content item-link">
<div class="item-inner">
<div class="item-title"><i class="icon f7-icons color-lime">info_circle</i> Acerca de</div>
<div class="item-title"><i class="icon f7-icons color-lime">info_circle</i> Acerca de ...</div>
</div>
</a>
</li>
@ -43,7 +52,10 @@
</div>
</template>
<script>
export default () => {
export default (props, { $, $f7, $on }) => {
$on('pageInit', () => {
})
return $render;
};
</script>

View File

@ -77,11 +77,11 @@ export default (props, { $f7, $, $on, $onMounted, $update, $f7router }) => {
await themes.dispatch('checkTheme', '.panel-right');
});
const logout = () => {
user.dispatch('logOut').then( () => {
$f7router.navigate('/');
$f7.toast.show( { text: "Ha cerrado sesión." });
});
const logout = async () => {
await user.dispatch('logOut');
$f7router.navigate('/');
$f7.toast.show( { text: "Ha cerrado sesión." });
};
const setTheme = async () => {

View File

@ -18,7 +18,7 @@
<div class="item-inner">
<div class="item-title item-label">Contraseña</div>
<div class="item-input-wrap">
<input id="password" type="password" name="password" alue="${password}" @input="${updatePassword}" placeholder="Ingresa tu contraseña" autocomplete="off" @keypress="${pressEnter}" />
<input id="password" type="password" name="password" value="${password}" @input="${updatePassword}" placeholder="Ingresa tu contraseña" autocomplete="off" @keypress="${pressEnter}" />
</div>
</div>
</li>
@ -53,16 +53,20 @@ export default (props, { $f7, $on, $update, $f7router }) => {
const updatePassword = (e) => {
password = e.target.value;
$update();
}
};
const checkLogin = () => {
const checkLogin = async () => {
$f7.preloader.show();
const data = {
UserData : username,
UserPassword : password,
};
user.dispatch('logIn', data).then(function(result){
try {
const data = {
UserData : username,
UserPassword : password,
};
const result = await user.dispatch('logIn', data);
$f7.preloader.hide();
if (result.status === 200){
$f7router.navigate('/');
$f7.toast.show( { text: "Ha iniciado sesión." });
@ -70,10 +74,11 @@ export default (props, { $f7, $on, $update, $f7router }) => {
else{
$f7.toast.show( { text: result.message });
}
}).catch(function(error){
}
catch (error) {
$f7.preloader.hide();
$f7.toast.show( { text: error.message });
});
}
};
const pressEnter = (e) => {