diff --git a/.eslintrc.js b/.eslintrc.js index 56f4da50..dabf8ae7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,12 +7,12 @@ module.exports = { parserOptions: { parser: '@babel/eslint-parser', 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: { browser: true, - 'vue/setup-compiler-macros': true, + 'vue/setup-compiler-macros': true }, extends: [ @@ -26,7 +26,7 @@ module.exports = { // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) - 'standard', + 'standard' ], plugins: ['vue', 'prettier'], @@ -41,7 +41,7 @@ module.exports = { __QUASAR_SSR_PWA__: 'readonly', process: 'readonly', Capacitor: 'readonly', - chrome: 'readonly', + chrome: 'readonly' }, // add your custom rules here @@ -66,7 +66,7 @@ module.exports = { 'prefer-promise-reject-errors': 'off', semi: 'off', // allow debugger during development only - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' }, overrides: [ { @@ -75,8 +75,8 @@ module.exports = { rules: { semi: 'off', indent: ['error', 4, { SwitchCase: 1 }], - 'space-before-function-paren': 'off', - }, - }, - ], + 'space-before-function-paren': 'off' + } + } + ] }; diff --git a/README.md b/README.md index fee55494..c5032e41 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,26 @@ Hedera is the main web page for Verdnatura. ## Getting Started Required dependencies. - * PHP >= 7.0 - * Node.js >= 8.0 + +- PHP >= 7.0 +- Node.js >= 8.0 Launch application for development. + ``` -$ npm run dev +$ npm run dev ``` +Launch project backend. + +``` +$ php -S 127.0.0.1:3002 -t . index.php + Run server side method from command line. ``` -$ php hedera-web.php -m method_path + +$ php hedera-web.php -m method_path + ``` ## Built with @@ -23,3 +32,4 @@ $ php hedera-web.php -m method_path * [Webpack](https://webpack.js.org/) * [MooTools](https://mootools.net/) * [TinyMCE](https://www.tinymce.com/) +``` diff --git a/quasar.config.js b/quasar.config.js index 1fb70d5e..226957ad 100644 --- a/quasar.config.js +++ b/quasar.config.js @@ -8,259 +8,249 @@ // Configuration for your app // https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js -const ESLintPlugin = require('eslint-webpack-plugin') -const path = require('path') +const ESLintPlugin = require('eslint-webpack-plugin'); +const path = require('path'); -const { configure } = require('quasar/wrappers') +const { configure } = require('quasar/wrappers'); module.exports = configure(function (ctx) { - return { - // https://v2.quasar.dev/quasar-cli-webpack/supporting-ts - supportTS: false, + return { + // https://v2.quasar.dev/quasar-cli-webpack/supporting-ts + supportTS: false, - // https://v2.quasar.dev/quasar-cli-webpack/prefetch-feature - // preFetch: true, + // https://v2.quasar.dev/quasar-cli-webpack/prefetch-feature + // preFetch: true, - // app boot file (/src/boot) - // --> boot files are part of "main.js" - // https://v2.quasar.dev/quasar-cli-webpack/boot-files - boot: [ - 'i18n', - 'axios', - 'error-handler', - 'app' - ], + // app boot file (/src/boot) + // --> boot files are part of "main.js" + // https://v2.quasar.dev/quasar-cli-webpack/boot-files + boot: ['i18n', 'axios', 'error-handler', 'app'], - // https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-css - css: [ - 'app.scss', - 'width.scss', - 'responsive.scss' - ], + // https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-css + css: ['app.scss', 'width.scss', 'responsive.scss'], - // https://github.com/quasarframework/quasar/tree/dev/extras - extras: [ - // 'ionicons-v4', - // 'mdi-v5', - // 'fontawesome-v6', - // 'eva-icons', - // 'themify', - // 'line-awesome', - // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! + // https://github.com/quasarframework/quasar/tree/dev/extras + extras: [ + // 'ionicons-v4', + // 'mdi-v5', + // 'fontawesome-v6', + // 'eva-icons', + // 'themify', + // 'line-awesome', + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! - 'roboto-font', // optional, you are not bound to it - 'material-icons' // optional, you are not bound to it - ], + 'roboto-font', // optional, you are not bound to it + 'material-icons' // optional, you are not bound to it + ], - // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-build - build: { - vueRouterMode: 'hash', // available values: 'hash', 'history' + // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-build + build: { + vueRouterMode: 'hash', // available values: 'hash', 'history' - // transpile: false, - // publicPath: '/', + // transpile: false, + // publicPath: '/', - // Add dependencies for transpiling with Babel (Array of string/regex) - // (from node_modules, which are by default not transpiled). - // Applies only if "transpile" is set to true. - // transpileDependencies: [], + // Add dependencies for transpiling with Babel (Array of string/regex) + // (from node_modules, which are by default not transpiled). + // Applies only if "transpile" is set to true. + // transpileDependencies: [], - // rtl: true, // https://quasar.dev/options/rtl-support - // preloadChunks: true, - // showProgress: false, - // gzip: true, - // analyze: true, + // rtl: true, // https://quasar.dev/options/rtl-support + // preloadChunks: true, + // showProgress: false, + // gzip: true, + // analyze: true, - // Options below are automatically set depending on the env, set them if you want to override - // extractCSS: false, + // Options below are automatically set depending on the env, set them if you want to override + // extractCSS: false, - // https://v2.quasar.dev/quasar-cli-webpack/handling-webpack - // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain + // https://v2.quasar.dev/quasar-cli-webpack/handling-webpack + // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain - chainWebpack (chain) { - chain.plugin('eslint-webpack-plugin') - .use(ESLintPlugin, [{ extensions: ['js', 'vue'] }]) + chainWebpack(chain) { + chain + .plugin('eslint-webpack-plugin') + .use(ESLintPlugin, [{ extensions: ['js', 'vue'] }]); - chain.module - .rule('i18n-resource') - .test(/\.(json5?|ya?ml)$/) - .include.add(path.resolve(__dirname, './src/i18n')) - .end() - .type('javascript/auto') - .use('i18n-resource') - .loader('@intlify/vue-i18n-loader') - chain.module - .rule('i18n') - .resourceQuery(/blockType=i18n/) - .type('javascript/auto') - .use('i18n') - .loader('@intlify/vue-i18n-loader') - } + chain.module + .rule('i18n-resource') + .test(/\.(json5?|ya?ml)$/) + .include.add(path.resolve(__dirname, './src/i18n')) + .end() + .type('javascript/auto') + .use('i18n-resource') + .loader('@intlify/vue-i18n-loader'); + chain.module + .rule('i18n') + .resourceQuery(/blockType=i18n/) + .type('javascript/auto') + .use('i18n') + .loader('@intlify/vue-i18n-loader'); + } + }, - }, + // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-devServer + devServer: { + server: { + type: 'http' + }, + port: 8080, + open: false, + // static: __dirname, + headers: { 'Access-Control-Allow-Origin': '*' }, + // stats: { chunks: false }, + proxy: { + '/api': 'http://localhost:3000', + '/': { + target: 'http://localhost:3001', + bypass: req => (req.path !== '/' ? req.path : null) + } + } + }, - // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-devServer - devServer: { - server: { - type: 'http' - }, - port: 8080, - open: false, - // static: __dirname, - headers: { 'Access-Control-Allow-Origin': '*' }, - // stats: { chunks: false }, - proxy: { - '/api': 'http://localhost:3000', - '/': { - target: 'http://localhost:3001', - bypass: (req) => req.path !== '/' ? req.path : null + // https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-framework + framework: { + config: {}, + autoImportComponentCase: 'pascal', + // iconSet: 'material-icons', // Quasar icon set + // lang: 'en-US', // Quasar language pack + + // For special cases outside of where the auto-import strategy can have an impact + // (like functional components as one of the examples), + // you can manually specify Quasar components/directives to be available everywhere: + // + // components: [], + // directives: [], + + // Quasar plugins + plugins: ['Notify'] + }, + + // animations: 'all', // --- includes all animations + // https://quasar.dev/options/animations + animations: [], + + // https://v2.quasar.dev/quasar-cli-webpack/developing-ssr/configuring-ssr + ssr: { + pwa: false, + + // manualStoreHydration: true, + // manualPostHydrationTrigger: true, + + prodPort: 3000, // The default port that the production server should use + // (gets superseded if process.env.PORT is specified at runtime) + + maxAge: 1000 * 60 * 60 * 24 * 30, + // Tell browser when a file from the server should expire from cache (in ms) + + chainWebpackWebserver(chain) { + chain + .plugin('eslint-webpack-plugin') + .use(ESLintPlugin, [{ extensions: ['js'] }]); + }, + + middlewares: [ + ctx.prod ? 'compression' : '', + 'render' // keep this as last one + ] + }, + + // https://v2.quasar.dev/quasar-cli-webpack/developing-pwa/configuring-pwa + pwa: { + workboxPluginMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest' + workboxOptions: {}, // only for GenerateSW + + // for the custom service worker ONLY (/src-pwa/custom-service-worker.[js|ts]) + // if using workbox in InjectManifest mode + + chainWebpackCustomSW(chain) { + chain + .plugin('eslint-webpack-plugin') + .use(ESLintPlugin, [{ extensions: ['js'] }]); + }, + + manifest: { + name: 'Hedera', + short_name: 'Hedera', + description: "Verdnatura's webshop", + display: 'standalone', + orientation: 'portrait', + background_color: '#ffffff', + theme_color: '#027be3', + icons: [ + { + src: 'icons/icon-128x128.png', + sizes: '128x128', + type: 'image/png' + }, + { + src: 'icons/icon-192x192.png', + sizes: '192x192', + type: 'image/png' + }, + { + src: 'icons/icon-256x256.png', + sizes: '256x256', + type: 'image/png' + }, + { + src: 'icons/icon-384x384.png', + sizes: '384x384', + type: 'image/png' + }, + { + src: 'icons/icon-512x512.png', + sizes: '512x512', + type: 'image/png' + } + ] + } + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-cordova-apps/configuring-cordova + cordova: { + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-capacitor-apps/configuring-capacitor + capacitor: { + hideSplashscreen: true + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-electron-apps/configuring-electron + electron: { + bundler: 'packager', // 'packager' or 'builder' + + packager: { + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options + // OS X / Mac App Store + // appBundleId: '', + // appCategoryType: '', + // osxSign: '', + // protocol: 'myapp://path', + // Windows only + // win32metadata: { ... } + }, + + builder: { + // https://www.electron.build/configuration/configuration + + appId: 'hedera-web' + }, + + // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain + + chainWebpackMain(chain) { + chain + .plugin('eslint-webpack-plugin') + .use(ESLintPlugin, [{ extensions: ['js'] }]); + }, + + chainWebpackPreload(chain) { + chain + .plugin('eslint-webpack-plugin') + .use(ESLintPlugin, [{ extensions: ['js'] }]); + } } - } - }, - - // https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js#Property%3A-framework - framework: { - config: {}, - autoImportComponentCase: 'pascal', - // iconSet: 'material-icons', // Quasar icon set - // lang: 'en-US', // Quasar language pack - - // For special cases outside of where the auto-import strategy can have an impact - // (like functional components as one of the examples), - // you can manually specify Quasar components/directives to be available everywhere: - // - // components: [], - // directives: [], - - // Quasar plugins - plugins: [ - 'Notify' - ] - }, - - // animations: 'all', // --- includes all animations - // https://quasar.dev/options/animations - animations: [], - - // https://v2.quasar.dev/quasar-cli-webpack/developing-ssr/configuring-ssr - ssr: { - pwa: false, - - // manualStoreHydration: true, - // manualPostHydrationTrigger: true, - - prodPort: 3000, // The default port that the production server should use - // (gets superseded if process.env.PORT is specified at runtime) - - maxAge: 1000 * 60 * 60 * 24 * 30, - // Tell browser when a file from the server should expire from cache (in ms) - - chainWebpackWebserver (chain) { - chain.plugin('eslint-webpack-plugin') - .use(ESLintPlugin, [{ extensions: ['js'] }]) - }, - - middlewares: [ - ctx.prod ? 'compression' : '', - 'render' // keep this as last one - ] - }, - - // https://v2.quasar.dev/quasar-cli-webpack/developing-pwa/configuring-pwa - pwa: { - workboxPluginMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest' - workboxOptions: {}, // only for GenerateSW - - // for the custom service worker ONLY (/src-pwa/custom-service-worker.[js|ts]) - // if using workbox in InjectManifest mode - - chainWebpackCustomSW (chain) { - chain.plugin('eslint-webpack-plugin') - .use(ESLintPlugin, [{ extensions: ['js'] }]) - }, - - manifest: { - name: 'Hedera', - short_name: 'Hedera', - description: 'Verdnatura\'s webshop', - display: 'standalone', - orientation: 'portrait', - background_color: '#ffffff', - theme_color: '#027be3', - icons: [ - { - src: 'icons/icon-128x128.png', - sizes: '128x128', - type: 'image/png' - }, - { - src: 'icons/icon-192x192.png', - sizes: '192x192', - type: 'image/png' - }, - { - src: 'icons/icon-256x256.png', - sizes: '256x256', - type: 'image/png' - }, - { - src: 'icons/icon-384x384.png', - sizes: '384x384', - type: 'image/png' - }, - { - src: 'icons/icon-512x512.png', - sizes: '512x512', - type: 'image/png' - } - ] - } - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-cordova-apps/configuring-cordova - cordova: { - // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-capacitor-apps/configuring-capacitor - capacitor: { - hideSplashscreen: true - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-webpack/developing-electron-apps/configuring-electron - electron: { - bundler: 'packager', // 'packager' or 'builder' - - packager: { - // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options - - // OS X / Mac App Store - // appBundleId: '', - // appCategoryType: '', - // osxSign: '', - // protocol: 'myapp://path', - - // Windows only - // win32metadata: { ... } - }, - - builder: { - // https://www.electron.build/configuration/configuration - - appId: 'hedera-web' - }, - - // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain - - chainWebpackMain (chain) { - chain.plugin('eslint-webpack-plugin') - .use(ESLintPlugin, [{ extensions: ['js'] }]) - }, - - chainWebpackPreload (chain) { - chain.plugin('eslint-webpack-plugin') - .use(ESLintPlugin, [{ extensions: ['js'] }]) - } - - } - } -}) + }; +}); diff --git a/src/boot/axios.js b/src/boot/axios.js index b09fccc0..b5758897 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -1,7 +1,7 @@ -import { boot } from 'quasar/wrappers' -import { Connection } from '../js/db/connection' -import { userStore } from 'stores/user' -import axios from 'axios' +import { boot } from 'quasar/wrappers'; +import { Connection } from '../js/db/connection'; +import { userStore } from 'stores/user'; +import axios from 'axios'; // Be careful when using SSR for cross-request state pollution // due to creating a Singleton instance here; @@ -11,32 +11,33 @@ import axios from 'axios' // for each client) const api = axios.create({ baseURL: `//${location.hostname}:${location.port}/api/` -}) +}); -const jApi = new Connection() +const jApi = new Connection(); export default boot(({ app }) => { - const user = userStore() - function addToken (config) { + const user = userStore(); + function addToken(config) { if (user.token) { - config.headers.Authorization = user.token + config.headers.Authorization = user.token; } - return config + return config; } - api.interceptors.request.use(addToken) - jApi.use(addToken) + api.interceptors.request.use(addToken); + jApi.use(addToken); // for use inside Vue files (Options API) through this.$axios and this.$api - app.config.globalProperties.$axios = axios + app.config.globalProperties.$axios = axios; // ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form) // so you won't necessarily have to import axios in each vue file - app.config.globalProperties.$api = api + app.config.globalProperties.$api = api; // ^ ^ ^ this will allow you to use this.$api (for Vue Options API form) // so you can easily perform requests against your app's API - app.config.globalProperties.$jApi = jApi -}) + app.config.globalProperties.$jApi = jApi; + app.provide('jApi', jApi); +}); -export { api, jApi } +export { api, jApi }; diff --git a/src/components/ui/VnImg.vue b/src/components/ui/VnImg.vue new file mode 100644 index 00000000..f4e8a36c --- /dev/null +++ b/src/components/ui/VnImg.vue @@ -0,0 +1,66 @@ + + + + diff --git a/src/pages/Cms/HomeView.vue b/src/pages/Cms/HomeView.vue new file mode 100644 index 00000000..971e1544 --- /dev/null +++ b/src/pages/Cms/HomeView.vue @@ -0,0 +1,87 @@ + + + + + + + +en-US: + startOrder: Start order +es-ES: + startOrder: Empezar pedido +ca-ES: + startOrder: Començar comanda +fr-FR: + startOrder: Lancer commande +pt-PT: + startOrder: Comece uma encomenda + diff --git a/src/router/routes.js b/src/router/routes.js index 0a8dd7fd..e593edfd 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -27,12 +27,12 @@ const routes = [ { name: '', path: '', - component: () => import('src/pages/Cms/Home.vue') + component: () => import('src/pages/Cms/HomeView.vue') }, { name: 'home', path: '/cms/home', - component: () => import('src/pages/Cms/Home.vue') + component: () => import('src/pages/Cms/HomeView.vue') }, { name: 'orders', @@ -63,6 +63,6 @@ const routes = [ path: '/:catchAll(.*)*', component: () => import('pages/ErrorNotFound.vue') } -] +]; -export default routes +export default routes;