├── git ├── static └── .gitkeep ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── .editorconfig ├── .gitignore ├── .babelrc ├── .postcssrc.js ├── index.html ├── src ├── App.vue ├── main.js ├── db │ └── index.js ├── router │ └── index.js └── components │ ├── Navbar.vue │ ├── ProductPage.vue │ └── Products.vue ├── docs ├── static │ ├── css │ │ ├── app.01fce1da86438a65fc836bc742f2e0d9.css │ │ └── app.01fce1da86438a65fc836bc742f2e0d9.css.map │ └── js │ │ ├── manifest.2ae2e69a05c33dfc65f8.js │ │ ├── manifest.2ae2e69a05c33dfc65f8.js.map │ │ ├── app.2128752eb39cfdc2da47.js │ │ └── app.2128752eb39cfdc2da47.js.map └── index.html ├── README.md └── package.json /git: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | vuejs product app 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 22 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | 7 | Vue.config.productionTip = false; 8 | 9 | /* eslint-disable no-new */ 10 | new Vue({ 11 | el: '#app', 12 | router, 13 | components: { App }, 14 | template: '' 15 | }); 16 | -------------------------------------------------------------------------------- /src/db/index.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase' 2 | import 'firebase/firestore' 3 | const config = { 4 | apiKey: 'AIzaSyDQs5-qOdPcKR5XlqVHdMi0g3DWEvkoAtU', 5 | authDomain: 'vuejs-product-app.firebaseapp.com', 6 | databaseURL: 'https://vuejs-product-app.firebaseio.com', 7 | projectId: 'vuejs-product-app', 8 | storageBucket: 'vuejs-product-app.appspot.com', 9 | messagingSenderId: '496448907799' 10 | } 11 | const firebaseapp = firebase.initializeApp(config) 12 | export default firebaseapp.firestore() -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Products from '@/components/Products' 4 | import ProductPage from '@/components/ProductPage' 5 | 6 | Vue.use(Router) 7 | 8 | export default new Router({ 9 | routes: [ 10 | { 11 | path: '/', 12 | name: 'Products', 13 | component: Products 14 | }, 15 | { 16 | path: '/product/:id', 17 | name: 'ProductPage', 18 | component: ProductPage 19 | } 20 | ] 21 | }) 22 | -------------------------------------------------------------------------------- /docs/static/css/app.01fce1da86438a65fc836bc742f2e0d9.css: -------------------------------------------------------------------------------- 1 | h1[data-v-a274dc00],h2[data-v-a274dc00]{font-weight:400}ul[data-v-a274dc00]{list-style-type:none;padding:0}li[data-v-a274dc00]{display:inline-block;margin:0 10px}a[data-v-a274dc00]{color:#42b983}h3[data-v-bf5d2bb8]{text-align:center;margin-top:30px;margin-bottom:20px}.icon[data-v-bf5d2bb8]{margin-right:10px}.icon i[data-v-bf5d2bb8]{cursor:pointer}h3[data-v-4a457dc6]{text-align:center;margin-top:30px;margin-bottom:20px} 2 | /*# sourceMappingURL=app.01fce1da86438a65fc836bc742f2e0d9.css.map */ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vuejs-product-app 2 | 3 | > A Vue.js simple product app with firestore 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /docs/static/js/manifest.2ae2e69a05c33dfc65f8.js: -------------------------------------------------------------------------------- 1 | !function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];avuejs product app
-------------------------------------------------------------------------------- /src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 36 | 37 | 38 | 54 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | 24 | /** 25 | * Source Maps 26 | */ 27 | 28 | // https://webpack.js.org/configuration/devtool/#development 29 | devtool: 'cheap-module-eval-source-map', 30 | 31 | // If you have problems debugging vue-files in devtools, 32 | // set this to false - it *may* help 33 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 34 | cacheBusting: true, 35 | 36 | cssSourceMap: true 37 | }, 38 | 39 | build: { 40 | // Template for index.html 41 | index: path.resolve(__dirname, '../dist/index.html'), 42 | 43 | // Paths 44 | assetsRoot: path.resolve(__dirname, '../dist'), 45 | assetsSubDirectory: 'static', 46 | assetsPublicPath: '/', 47 | 48 | /** 49 | * Source Maps 50 | */ 51 | 52 | productionSourceMap: true, 53 | // https://webpack.js.org/configuration/devtool/#production 54 | devtool: '#source-map', 55 | 56 | // Gzip off by default as many popular static hosts such as 57 | // Surge or Netlify already gzip all static assets for you. 58 | // Before setting to `true`, make sure to: 59 | // npm install --save-dev compression-webpack-plugin 60 | productionGzip: false, 61 | productionGzipExtensions: ['js', 'css'], 62 | 63 | // Run the build command with an extra argument to 64 | // View the bundle analyzer report after build finishes: 65 | // `npm run build --report` 66 | // Set to `true` or `false` to always turn it on or off 67 | bundleAnalyzerReport: process.env.npm_config_report 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuejs-product-app", 3 | "version": "1.0.0", 4 | "description": "A Vue.js simple product app with firestore", 5 | "author": "waseembarcha ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js" 11 | }, 12 | "dependencies": { 13 | "bootstrap": "^4.5.0", 14 | "firebase": "^4.12.1", 15 | "font-awesome": "4.6.3", 16 | "jquery": "^3.5.1", 17 | "popper.js": "^1.14.6", 18 | "vue": "^2.5.2", 19 | "vue-router": "^3.0.1" 20 | }, 21 | "devDependencies": { 22 | "autoprefixer": "^7.1.2", 23 | "babel-core": "^6.22.1", 24 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 25 | "babel-loader": "^7.1.1", 26 | "babel-plugin-syntax-jsx": "^6.18.0", 27 | "babel-plugin-transform-runtime": "^6.22.0", 28 | "babel-plugin-transform-vue-jsx": "^3.5.0", 29 | "babel-preset-env": "^1.3.2", 30 | "babel-preset-stage-2": "^6.22.0", 31 | "chalk": "^2.0.1", 32 | "copy-webpack-plugin": "^4.0.1", 33 | "css-loader": "^0.28.0", 34 | "extract-text-webpack-plugin": "^3.0.0", 35 | "file-loader": "^1.1.4", 36 | "friendly-errors-webpack-plugin": "^1.6.1", 37 | "html-webpack-plugin": "^2.30.1", 38 | "node-notifier": "^5.1.2", 39 | "optimize-css-assets-webpack-plugin": "^3.2.0", 40 | "ora": "^1.2.0", 41 | "portfinder": "^1.0.13", 42 | "postcss-import": "^11.0.0", 43 | "postcss-loader": "^2.0.8", 44 | "postcss-url": "^7.2.1", 45 | "rimraf": "^2.6.0", 46 | "semver": "^5.3.0", 47 | "shelljs": "^0.8.5", 48 | "uglifyjs-webpack-plugin": "^1.1.1", 49 | "url-loader": "^0.5.8", 50 | "vue-loader": "^13.3.0", 51 | "vue-style-loader": "^3.0.1", 52 | "vue-template-compiler": "^2.5.2", 53 | "webpack": "^3.6.0", 54 | "webpack-bundle-analyzer": "^3.3.2", 55 | "webpack-dev-server": "^2.11.5", 56 | "webpack-merge": "^4.1.0" 57 | }, 58 | "engines": { 59 | "node": ">= 6.0.0", 60 | "npm": ">= 3.0.0" 61 | }, 62 | "browserslist": [ 63 | "> 1%", 64 | "last 2 versions", 65 | "not ie <= 8" 66 | ], 67 | "main": ".postcssrc.js", 68 | "license": "ISC" 69 | } 70 | -------------------------------------------------------------------------------- /src/components/ProductPage.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 68 | 69 | 70 | 78 | -------------------------------------------------------------------------------- /docs/static/js/manifest.2ae2e69a05c33dfc65f8.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap c0c715a2163b41ce3694"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.2ae2e69a05c33dfc65f8.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c0c715a2163b41ce3694"],"sourceRoot":""} -------------------------------------------------------------------------------- /src/components/Products.vue: -------------------------------------------------------------------------------- 1 | 107 | 108 | 205 | 206 | 207 | 220 | -------------------------------------------------------------------------------- /docs/static/js/app.2128752eb39cfdc2da47.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],{HCEK:function(t,a){},NHnr:function(t,a,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r=e("7+uW"),i={render:function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"header"},[a("nav",{staticClass:"navbar navbar-light bg-light navbar-expand-lg"},[a("div",{staticClass:"container"},[a("router-link",{staticClass:"navbar-brand",attrs:{to:"/"}},[this._v("Product Manager")]),this._v(" "),this._m(0),this._v(" "),this._m(1)],1)])])},staticRenderFns:[function(){var t=this.$createElement,a=this._self._c||t;return a("button",{staticClass:"navbar-toggler",attrs:{type:"button","data-toggle":"collapse","data-target":"#navbarNav","aria-controls":"navbarNav","aria-expanded":"false","aria-label":"Toggle navigation"}},[a("span",{staticClass:"navbar-toggler-icon"})])},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"collapse navbar-collapse",attrs:{id:"navbarNav"}},[a("ul",{staticClass:"navbar-nav"},[a("li",{staticClass:"nav-item active"},[a("a",{staticClass:"nav-link",attrs:{href:"#"}},[this._v("Home "),a("span",{staticClass:"sr-only"},[this._v("(current)")])])]),this._v(" "),a("li",{staticClass:"nav-item"},[a("a",{staticClass:"nav-link",attrs:{href:"#"}},[this._v("Features")])]),this._v(" "),a("li",{staticClass:"nav-item"},[a("a",{staticClass:"nav-link",attrs:{href:"#"}},[this._v("Pricing")])])])])}]};var c={name:"App",components:{Navbar:e("VU/8")({name:"Products",data:function(){return{}}},i,!1,function(t){e("tjNr")},"data-v-a274dc00",null).exports}},o={render:function(){var t=this.$createElement,a=this._self._c||t;return a("div",{attrs:{id:"app"}},[a("Navbar"),this._v(" "),a("div",{staticClass:"container"},[a("router-view")],1)],1)},staticRenderFns:[]};var s=e("VU/8")(c,o,!1,function(t){e("HCEK")},null,null).exports,d=e("/ocq"),n=e("Sazm"),u=e.n(n),p=(e("3VHS"),u.a.initializeApp({apiKey:"AIzaSyDQs5-qOdPcKR5XlqVHdMi0g3DWEvkoAtU",authDomain:"vuejs-product-app.firebaseapp.com",databaseURL:"https://vuejs-product-app.firebaseio.com",projectId:"vuejs-product-app",storageBucket:"vuejs-product-app.appspot.com",messagingSenderId:"496448907799"}).firestore()),l={name:"Products",data:function(){return{editId:"",productData:{id:"",product_id:"",product_name:"",product_price:""},editProductData:{id:"",product_id:"",product_name:"",product_price:""},products:[]}},created:function(){this.getProducts()},computed:{sortedProducts:function(){return this.products.slice().sort(function(t,a){return t.product_id-a.product_id})}},methods:{getProducts:function(){var t=this;p.collection("products").get().then(function(a){var e=[],r=[],i=0;a.forEach(function(t){r.push(t.data()),r[i].id=t.id,e.push(r[i]),i++}),t.products=e})},onSubmit:function(){p.collection("products").add(this.productData).then(this.getProducts),this.productData.product_id="",this.productData.product_name="",this.productData.product_price=""},onDelete:function(t){var a=this;p.collection("products").doc(t).delete().then(function(t){a.getProducts()})},onEdit:function(t){this.editId=t.id,this.editProductData.product_id=t.product_id,this.editProductData.product_name=t.product_name,this.editProductData.product_price=t.product_price},onCancel:function(){this.editId="",this.editProductData.product_id="",this.editProductData.product_name="",this.editProductData.product_price=""},onEditSubmit:function(t){p.collection("products").doc(t).set(this.editProductData).then(this.getProducts),this.editId="",this.editProductData.product_id="",this.editProductData.product_name="",this.editProductData.product_price=""}}},v={render:function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"products"},[e("h3",[t._v("Products")]),t._v(" "),e("div",{staticClass:"card"},[e("div",{staticClass:"card-header"},[t._v("\n Add a new product\n ")]),t._v(" "),e("div",{staticClass:"card-body"},[e("form",{staticClass:"form-inline",on:{submit:function(a){return a.preventDefault(),t.onSubmit(a)}}},[e("div",{staticClass:"form-group"},[e("label",[t._v("ID")]),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.productData.product_id,expression:"productData.product_id"}],staticClass:"form-control ml-sm-2 mr-sm-4 my-2",attrs:{type:"text",required:""},domProps:{value:t.productData.product_id},on:{input:function(a){a.target.composing||t.$set(t.productData,"product_id",a.target.value)}}})]),t._v(" "),e("div",{staticClass:"form-group"},[e("label",[t._v("Name")]),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.productData.product_name,expression:"productData.product_name"}],staticClass:"form-control ml-sm-2 mr-sm-4 my-2",attrs:{type:"text",required:""},domProps:{value:t.productData.product_name},on:{input:function(a){a.target.composing||t.$set(t.productData,"product_name",a.target.value)}}})]),t._v(" "),e("div",{staticClass:"form-group"},[e("label",[t._v("Price")]),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.productData.product_price,expression:"productData.product_price"}],staticClass:"form-control ml-sm-2 mr-sm-4 my-2",attrs:{type:"text",required:""},domProps:{value:t.productData.product_price},on:{input:function(a){a.target.composing||t.$set(t.productData,"product_price",a.target.value)}}})]),t._v(" "),t._m(0)])])]),t._v(" "),e("div",{staticClass:"card mt-5"},[e("div",{staticClass:"card-header"},[t._v("\n Product List\n ")]),t._v(" "),e("div",{staticClass:"card-body"},[e("div",{staticClass:"table-responsive"},[e("table",{staticClass:"table"},[t._m(1),t._v(" "),e("tbody",t._l(t.sortedProducts,function(a){return e("tr",{key:a.id},[t.editId==a.id?[e("td",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.editProductData.product_id,expression:"editProductData.product_id"}],attrs:{type:"text"},domProps:{value:t.editProductData.product_id},on:{input:function(a){a.target.composing||t.$set(t.editProductData,"product_id",a.target.value)}}})]),t._v(" "),e("td",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.editProductData.product_name,expression:"editProductData.product_name"}],attrs:{type:"text"},domProps:{value:t.editProductData.product_name},on:{input:function(a){a.target.composing||t.$set(t.editProductData,"product_name",a.target.value)}}})]),t._v(" "),e("td",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.editProductData.product_price,expression:"editProductData.product_price"}],attrs:{type:"text"},domProps:{value:t.editProductData.product_price},on:{input:function(a){a.target.composing||t.$set(t.editProductData,"product_price",a.target.value)}}})]),t._v(" "),e("td",[e("span",{staticClass:"icon"},[e("i",{staticClass:"fa fa-check",on:{click:function(e){t.onEditSubmit(a.id)}}})]),t._v(" "),e("span",{staticClass:"icon"},[e("i",{staticClass:"fa fa-ban",on:{click:t.onCancel}})])])]:[e("td",[t._v("\n "+t._s(a.product_id)+"\n ")]),t._v(" "),e("td",[t._v("\n "+t._s(a.product_name)+"\n ")]),t._v(" "),e("td",[t._v("\n "+t._s(a.product_price)+"\n ")]),t._v(" "),e("td",[e("a",{staticClass:"icon",attrs:{href:"#"}},[e("i",{staticClass:"fa fa-trash",on:{click:function(e){t.onDelete(a.id)}}})]),t._v(" "),e("a",{staticClass:"icon",attrs:{href:"#"}},[e("i",{staticClass:"fa fa-pencil",on:{click:function(e){t.onEdit(a)}}})]),t._v(" "),e("router-link",{staticClass:"icon",attrs:{to:{name:"ProductPage",params:{id:a.id}}}},[e("i",{staticClass:"fa fa-eye"})])],1)]],2)}))])])])])])},staticRenderFns:[function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"ml-auto text-right"},[a("button",{staticClass:"btn btn-primary my-2",attrs:{type:"submit"}},[this._v("Add")])])},function(){var t=this.$createElement,a=this._self._c||t;return a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[this._v("\n Product ID\n ")]),this._v(" "),a("th",[this._v("\n Product Name\n ")]),this._v(" "),a("th",[this._v("\n Product Price\n ")]),this._v(" "),a("th",[this._v("\n Action\n ")])])])}]};var _=e("VU/8")(l,v,!1,function(t){e("pEnN")},"data-v-bf5d2bb8",null).exports,m={name:"ProductPage",data:function(){return{productId:"",productName:"",productPrice:"",loaded:!1}},beforeCreate:function(){var t=this;p.collection("products").doc(this.$route.params.id).get().then(function(a){a.exists?(console.log("Document data:",a.data().product_id),t.productId=a.data().product_id,t.productName=a.data().product_name,t.productPrice=a.data().product_price,t.loaded=!0):console.log("No such document!")}).catch(function(t){console.log("Error getting document:",t)})}},h={render:function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"single-product"},[t.loaded?e("div",[e("h3",[t._v("Product details")]),t._v(" "),e("div",{staticClass:"card"},[e("div",{staticClass:"card-header"},[t._v("\n\t header\n\t ")]),t._v(" "),e("div",{staticClass:"card-body"},[e("p",[t._v("ID: "+t._s(t.productId))]),t._v(" "),e("p",[t._v("Product Name: "+t._s(t.productName))]),t._v(" "),e("p",[t._v("Product Price: $"+t._s(t.productPrice))]),t._v(" "),e("button",{staticClass:"btn btn-success"},[t._v(" Buy Now")]),t._v(" "),e("router-link",{staticClass:"btn btn-primary",attrs:{to:"/"}},[t._v(" Back ")])],1)])]):e("div",[e("h3",[t._v("Loading...")])])])},staticRenderFns:[]};var f=e("VU/8")(m,h,!1,function(t){e("lfde")},"data-v-4a457dc6",null).exports;r.a.use(d.a);var P=new d.a({routes:[{path:"/",name:"Products",component:_},{path:"/product/:id",name:"ProductPage",component:f}]});r.a.config.productionTip=!1,new r.a({el:"#app",router:P,components:{App:s},template:""})},lfde:function(t,a){},pEnN:function(t,a){},tjNr:function(t,a){}},["NHnr"]); 2 | //# sourceMappingURL=app.2128752eb39cfdc2da47.js.map -------------------------------------------------------------------------------- /docs/static/js/app.2128752eb39cfdc2da47.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/components/Navbar.vue?9311","webpack:///./src/components/Navbar.vue","webpack:///src/App.vue","webpack:///src/components/Navbar.vue","webpack:///./src/App.vue?0f4b","webpack:///./src/App.vue","webpack:///./src/db/index.js","webpack:///src/components/Products.vue","webpack:///./src/components/Products.vue?bc58","webpack:///./src/components/Products.vue","webpack:///src/components/ProductPage.vue","webpack:///./src/components/ProductPage.vue?c945","webpack:///./src/components/ProductPage.vue","webpack:///./src/router/index.js","webpack:///./src/main.js"],"names":["components_Navbar","render","_h","this","$createElement","_c","_self","staticClass","attrs","to","_v","_m","staticRenderFns","type","data-toggle","data-target","aria-controls","aria-expanded","aria-label","id","href","App","Navbar","__webpack_require__","normalizeComponent","ssrContext","selectortype_template_index_0_src_App","src_App","App_normalizeComponent","db","firebase_default","a","initializeApp","apiKey","authDomain","databaseURL","projectId","storageBucket","messagingSenderId","firestore","Products","getProducts","product_id","_this","data","i","products","_this2","product_name","product_price","then","components_Products","_vm","on","submit","$event","preventDefault","onSubmit","directives","name","rawName","value","productData","expression","required","domProps","input","target","composing","$set","_l","product","key","editId","editProductData","click","onEditSubmit","onCancel","_s","onDelete","onEdit","params","scope","src_components_Products","Products_normalizeComponent","ProductPage","error","components_ProductPage","productId","productName","productPrice","src_components_ProductPage","ProductPage_normalizeComponent","vue_esm","use","vue_router_esm","router","routes","path","component","config","productionTip","el","components","template"],"mappings":"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","file":"static/js/app.2128752eb39cfdc2da47.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"header\"},[_c('nav',{staticClass:\"navbar navbar-light bg-light navbar-expand-lg\"},[_c('div',{staticClass:\"container\"},[_c('router-link',{staticClass:\"navbar-brand\",attrs:{\"to\":\"/\"}},[_vm._v(\"Product Manager\")]),_vm._v(\" \"),_vm._m(0),_vm._v(\" \"),_vm._m(1)],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"navbar-toggler\",attrs:{\"type\":\"button\",\"data-toggle\":\"collapse\",\"data-target\":\"#navbarNav\",\"aria-controls\":\"navbarNav\",\"aria-expanded\":\"false\",\"aria-label\":\"Toggle navigation\"}},[_c('span',{staticClass:\"navbar-toggler-icon\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"collapse navbar-collapse\",attrs:{\"id\":\"navbarNav\"}},[_c('ul',{staticClass:\"navbar-nav\"},[_c('li',{staticClass:\"nav-item active\"},[_c('a',{staticClass:\"nav-link\",attrs:{\"href\":\"#\"}},[_vm._v(\"Home \"),_c('span',{staticClass:\"sr-only\"},[_vm._v(\"(current)\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"nav-item\"},[_c('a',{staticClass:\"nav-link\",attrs:{\"href\":\"#\"}},[_vm._v(\"Features\")])]),_vm._v(\" \"),_c('li',{staticClass:\"nav-item\"},[_c('a',{staticClass:\"nav-link\",attrs:{\"href\":\"#\"}},[_vm._v(\"Pricing\")])])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a274dc00\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Navbar.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-a274dc00\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Navbar.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Navbar.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Navbar.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a274dc00\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Navbar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-a274dc00\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Navbar.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/Navbar.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('Navbar'),_vm._v(\" \"),_c('div',{staticClass:\"container\"},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1e2831d8\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1e2831d8\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1e2831d8\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","import firebase from 'firebase'\r\nimport 'firebase/firestore'\r\nconst config = {\r\n\tapiKey: 'AIzaSyDQs5-qOdPcKR5XlqVHdMi0g3DWEvkoAtU',\r\n\tauthDomain: 'vuejs-product-app.firebaseapp.com',\r\n\tdatabaseURL: 'https://vuejs-product-app.firebaseio.com',\r\n\tprojectId: 'vuejs-product-app',\r\n\tstorageBucket: 'vuejs-product-app.appspot.com',\r\n\tmessagingSenderId: '496448907799'\r\n}\r\nconst firebaseapp = firebase.initializeApp(config)\r\nexport default firebaseapp.firestore()\n\n\n// WEBPACK FOOTER //\n// ./src/db/index.js","\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/Products.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"products\"},[_c('h3',[_vm._v(\"Products\")]),_vm._v(\" \"),_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_vm._v(\"\\n Add a new product\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"card-body\"},[_c('form',{staticClass:\"form-inline\",on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_c('div',{staticClass:\"form-group\"},[_c('label',[_vm._v(\"ID\")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.productData.product_id),expression:\"productData.product_id\"}],staticClass:\"form-control ml-sm-2 mr-sm-4 my-2\",attrs:{\"type\":\"text\",\"required\":\"\"},domProps:{\"value\":(_vm.productData.product_id)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.productData, \"product_id\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"form-group\"},[_c('label',[_vm._v(\"Name\")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.productData.product_name),expression:\"productData.product_name\"}],staticClass:\"form-control ml-sm-2 mr-sm-4 my-2\",attrs:{\"type\":\"text\",\"required\":\"\"},domProps:{\"value\":(_vm.productData.product_name)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.productData, \"product_name\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"form-group\"},[_c('label',[_vm._v(\"Price\")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.productData.product_price),expression:\"productData.product_price\"}],staticClass:\"form-control ml-sm-2 mr-sm-4 my-2\",attrs:{\"type\":\"text\",\"required\":\"\"},domProps:{\"value\":(_vm.productData.product_price)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.productData, \"product_price\", $event.target.value)}}})]),_vm._v(\" \"),_vm._m(0)])])]),_vm._v(\" \"),_c('div',{staticClass:\"card mt-5\"},[_c('div',{staticClass:\"card-header\"},[_vm._v(\"\\n Product List\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"card-body\"},[_c('div',{staticClass:\"table-responsive\"},[_c('table',{staticClass:\"table\"},[_vm._m(1),_vm._v(\" \"),_c('tbody',_vm._l((_vm.sortedProducts),function(product){return _c('tr',{key:product.id},[(_vm.editId == product.id)?[_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.editProductData.product_id),expression:\"editProductData.product_id\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.editProductData.product_id)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.editProductData, \"product_id\", $event.target.value)}}})]),_vm._v(\" \"),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.editProductData.product_name),expression:\"editProductData.product_name\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.editProductData.product_name)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.editProductData, \"product_name\", $event.target.value)}}})]),_vm._v(\" \"),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.editProductData.product_price),expression:\"editProductData.product_price\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.editProductData.product_price)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.editProductData, \"product_price\", $event.target.value)}}})]),_vm._v(\" \"),_c('td',[_c('span',{staticClass:\"icon\"},[_c('i',{staticClass:\"fa fa-check\",on:{\"click\":function($event){_vm.onEditSubmit(product.id)}}})]),_vm._v(\" \"),_c('span',{staticClass:\"icon\"},[_c('i',{staticClass:\"fa fa-ban\",on:{\"click\":_vm.onCancel}})])])]:[_c('td',[_vm._v(\"\\n \"+_vm._s(product.product_id)+\"\\n \")]),_vm._v(\" \"),_c('td',[_vm._v(\"\\n \"+_vm._s(product.product_name)+\"\\n \")]),_vm._v(\" \"),_c('td',[_vm._v(\"\\n \"+_vm._s(product.product_price)+\"\\n \")]),_vm._v(\" \"),_c('td',[_c('a',{staticClass:\"icon\",attrs:{\"href\":\"#\"}},[_c('i',{staticClass:\"fa fa-trash\",on:{\"click\":function($event){_vm.onDelete(product.id)}}})]),_vm._v(\" \"),_c('a',{staticClass:\"icon\",attrs:{\"href\":\"#\"}},[_c('i',{staticClass:\"fa fa-pencil\",on:{\"click\":function($event){_vm.onEdit(product)}}})]),_vm._v(\" \"),_c('router-link',{staticClass:\"icon\",attrs:{\"to\":{\n name:'ProductPage', \n params:{id: product.id}\n }}},[_c('i',{staticClass:\"fa fa-eye\"})])],1)]],2)}))])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"ml-auto text-right\"},[_c('button',{staticClass:\"btn btn-primary my-2\",attrs:{\"type\":\"submit\"}},[_vm._v(\"Add\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('thead',[_c('tr',[_c('th',{attrs:{\"scope\":\"col\"}},[_vm._v(\"\\n Product ID\\n \")]),_vm._v(\" \"),_c('th',[_vm._v(\"\\n Product Name\\n \")]),_vm._v(\" \"),_c('th',[_vm._v(\"\\n Product Price\\n \")]),_vm._v(\" \"),_c('th',[_vm._v(\"\\n Action\\n \")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-bf5d2bb8\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Products.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-bf5d2bb8\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Products.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Products.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Products.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-bf5d2bb8\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Products.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-bf5d2bb8\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Products.vue\n// module id = null\n// module chunks = ","\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/ProductPage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"single-product\"},[(_vm.loaded)?_c('div',[_c('h3',[_vm._v(\"Product details\")]),_vm._v(\" \"),_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_vm._v(\"\\n\\t header\\n\\t \")]),_vm._v(\" \"),_c('div',{staticClass:\"card-body\"},[_c('p',[_vm._v(\"ID: \"+_vm._s(_vm.productId))]),_vm._v(\" \"),_c('p',[_vm._v(\"Product Name: \"+_vm._s(_vm.productName))]),_vm._v(\" \"),_c('p',[_vm._v(\"Product Price: $\"+_vm._s(_vm.productPrice))]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-success\"},[_vm._v(\" Buy Now\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"btn btn-primary\",attrs:{\"to\":'/'}},[_vm._v(\" Back \")])],1)])]):_c('div',[_c('h3',[_vm._v(\"Loading...\")])])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4a457dc6\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/ProductPage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4a457dc6\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./ProductPage.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./ProductPage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./ProductPage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4a457dc6\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./ProductPage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-4a457dc6\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/ProductPage.vue\n// module id = null\n// module chunks = ","import Vue from 'vue'\nimport Router from 'vue-router'\nimport Products from '@/components/Products'\nimport ProductPage from '@/components/ProductPage'\n\nVue.use(Router)\n\nexport default new Router({\n routes: [\n {\n path: '/',\n name: 'Products',\n component: Products\n },\n {\n path: '/product/:id',\n name: 'ProductPage',\n component: ProductPage\n }\n ]\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport router from './router'\n\nVue.config.productionTip = false\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n components: { App },\n template: ''\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""} --------------------------------------------------------------------------------