Alan Colon пре 7 година
родитељ
комит
eb93d930bf

+ 17 - 15
app/api-service.js

@@ -1,27 +1,29 @@
 const app = require('./app')
-
 app.service('api', function($http) {
-  let opts = {
+  this.opts = {
     headers: {},
     withCredentials: true
   }
-  const api = (req) => req.then(res => {
-    // Enter post-processing here
-    return res.data
-  })
-  this.login = data => api($http.post('/api/auth/login', data, opts))
+  this.postProcess = (res) => res.data
+  this.get = (path) => $http.get(path, this.opts).then(this.postProcess)
+  this.post = (path, data) => $http.post(path, data, this.opts).then(this.postProcess)
+  this.put = (path, data) => $http.put(path, data, this.opts).then(this.postProcess)
+  this.patch = (path, data) => $http.patch(path, data, this.opts).then(this.postProcess)
+  this.delete = (path) => $http.delete(path, this.opts).then(this.postProcess)
+
+  this.login = data => this.post('/api/auth/login', data)
   this.setToken = token => {
     this.token = token
-    opts.headers.authentication = `Bearer ${token}`
+    this.opts.headers.authentication = `Bearer ${token}`
   }
 
   this.crud = (apiPrefix) => ({
-    list: () => api($http.get(`${apiPrefix}`, opts)),
-    create: data => api($http.post(`${apiPrefix}`, data, opts)),
-    read: id => api($http.get(`${apiPrefix}/${id}`, opts)),
-    update: (id, data) => api($http.patch(`${apiPrefix}/${id}`, data, opts)),
-    delete: (id) => api($http.delete(`${apiPrefix}/${id}`, opts)),
-    trash: () => api($http.get(`${apiPrefix}/trash`, opts)),
-    undelete: (id) => api($http.delete(`${apiPrefix}/trash/${id}`, opts))
+    list: () => this.get(apiPrefix),
+    create: data => this.post(apiPrefix, data),
+    read: id => this.get(`${apiPrefix}/${id}`),
+    update: (id, data) => this.patch(`${apiPrefix}/${id}`, data),
+    delete: (id) => this.delete(`${apiPrefix}/${id}`),
+    trash: () => this.get(`${apiPrefix}/trash`),
+    undelete: (id) => this.delete(`${apiPrefix}/trash/${id}`)
   })
 })

+ 0 - 18
app/app-index.js

@@ -1,18 +0,0 @@
-const app = require('./app')
-// TODO: Register app specific services
-app.config(($routeProvider, $mdThemingProvider) => {
-  // TODO: App Title
-  window.title = 'My App'
-
-  // TODO: Select a theme
-  const palettes = ['red', 'pink', 'purple', 'deep-purple', 'indigo', 'blue', 'light-blue', 'cyan', 'teal', 'green', 'light-green', 'lime', 'yellow', 'amber', 'orange', 'deep-orange', 'brown', 'grey', 'blue-grey']
-  const randomPalette = () => palettes[Math.floor(Math.random() * palettes.length)]
-  $mdThemingProvider.theme('default')
-    .primaryPalette(randomPalette())
-    .accentPalette(randomPalette())
-    .warnPalette(randomPalette())
-
-  // TODO: App Routes
-  //  $routeProvider.when('/test', {template: '<app-test-page />'})
-
-})

+ 2 - 1
app/app.js

@@ -6,6 +6,7 @@ require('angular-route')
 require('angular-material')
 require('angular-material-data-table')
 require('./async')
+require('angular-chart.js')
 window.jQuery = require('jquery')
 
 const es6Html = require('es6-string-html-template')
@@ -13,7 +14,7 @@ window.html = es6Html.html
 window.raw = es6Html.raw
 window.encode = es6Html.encode
 
-const app = angular.module('app', ['ngRoute', 'ngMaterial', 'async', 'md.data.table'])
+const app = angular.module('material-framework', ['ngRoute', 'ngMaterial', 'async', 'md.data.table', 'chart.js'])
 
 app.config(($routeProvider, $locationProvider, $mdThemingProvider) => {
   routes($routeProvider)

+ 0 - 1
app/assets/app-index.js

@@ -1 +0,0 @@
-// TODO: App specific assets

+ 2 - 5
app/assets/index.js

@@ -1,8 +1,5 @@
-const appIndex = require('./app-index')
-
-module.exports = Object.assign({
+module.exports = {
   style: require('./style.scss'),
-  appStyle: require('./app-style.scss'),
   logo: require('./generic-logo.svg'),
   menuIcon: require('@alancnet/material-design-icons/navigation_ic_menu_48px.svg'),
   userIcon: require('@alancnet/material-design-icons/social_ic_person_48px.svg'),
@@ -13,4 +10,4 @@ module.exports = Object.assign({
   deleteIcon: require('@alancnet/material-design-icons/action_ic_delete_48px.svg'),
   saveIcon: require('@alancnet/material-design-icons/content_ic_save_48px.svg'),
   undoIcon: require('@alancnet/material-design-icons/content_ic_undo_48px.svg')
-}, appIndex)
+}

+ 0 - 1
app/components/app-index.js

@@ -1 +0,0 @@
-// TODO: App specific components

+ 0 - 13
app/components/dashboard-page.js

@@ -1,13 +0,0 @@
-const app = require('../app')
-
-app.component('appDashboardPage', {
-  template: html`
-    <app-user-area>
-      Dashboard goes here
-    </app-user-area>
-  `,
-  controllerAs: 'dashboard',
-  controller: function() {
-
-  }
-})

+ 0 - 2
app/components/index.js

@@ -3,6 +3,4 @@ require('./login-page')
 require('./test-page')
 require('./user-area')
 require('./home-page')
-require('./dashboard-page')
 require('./user-pages')
-require('./app-index')

+ 0 - 1
app/index.js

@@ -1,4 +1,3 @@
 require('./app')
 require('./components')
 require('./api-service')
-require('./app-index')

+ 22 - 19
config.js

@@ -1,22 +1,25 @@
 module.exports = {
-  auth: {
-    jwtSecret: '8af06d11-2c53-4f0b-86d7-dd24594da463',
-    jwtExpires: 7 * 24 * 60 * 60,
-    saltRounds: 10
-  },
-  server: {
-    port: process.env.NODE_PORT || 3002
-  },
-  sequelize: {
-    // See http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor
-    dialect: 'sqlite',
-    database: 'project',
-    username: null,
-    password: null,
-    host: null,
-    port: null,
-    storage: 'project.db',
-    operatorsAliases: false,
-    logging: false
+  inject(config) {
+    Object.assign(this, config)
   }
+  // auth: {
+  //   jwtSecret: '8af06d11-2c53-4f0b-86d7-dd24594da463',
+  //   jwtExpires: 7 * 24 * 60 * 60,
+  //   saltRounds: 10
+  // },
+  // server: {
+  //   port: process.env.NODE_PORT || 3002
+  // },
+  // sequelize: {
+  //   // See http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor
+  //   dialect: 'sqlite',
+  //   database: 'project',
+  //   username: null,
+  //   password: null,
+  //   host: null,
+  //   port: null,
+  //   storage: 'project.db',
+  //   operatorsAliases: false,
+  //   logging: false
+  // }
 }

+ 2 - 0
framework.js

@@ -0,0 +1,2 @@
+const app = require('./app/app')
+const assets = require('./app/assets')

+ 0 - 0
app/assets/app-style.scss → index.js


+ 1 - 0
lib/controllers/app-index.js

@@ -0,0 +1 @@
+// Remove file

+ 1 - 1
lib/controllers/auth/login.js

@@ -19,7 +19,7 @@ module.exports = {
           endAt : exp
         })
         const token = JWT.sign({sid, exp}, config.auth.jwtSecret);
-        res.status(200).send({
+        return res.status(200).send({
           user: user.sanitize(),
           token
         })

+ 1 - 1
lib/database/app-index.js

@@ -1 +1 @@
-// TODO: App Specific Models
+// Remove file

+ 15 - 1
lib/server.js

@@ -28,4 +28,18 @@ app.start = () => new Promise((resolve, reject) => {
     reject(e)
   }
 })
-module.exports = app
+
+
+const asyncWrap = (method) => function() {
+  const args = Array.from(arguments)
+  if (args[0]) args[0] = asyncHandler(args[0])
+  return method.apply(app, args)
+}
+const asyncApp = Object.create(app, {
+  get: asyncWrap(app.get),
+  post: asyncWrap(app.post),
+  put: asyncWrap(app.put),
+  patch: asyncWrap(app.patch),
+  delete: asyncWrap(app.delete)
+})
+module.exports = asyncApp

+ 137 - 1
package-lock.json

@@ -1,5 +1,5 @@
 {
-  "name": "project-app",
+  "name": "material-framework",
   "version": "1.0.0",
   "lockfileVersion": 1,
   "requires": true,
@@ -69,6 +69,15 @@
         "acorn": "^5.0.0"
       }
     },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
+      "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
     "aguid": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/aguid/-/aguid-2.0.0.tgz",
@@ -121,6 +130,15 @@
       "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.0.tgz",
       "integrity": "sha512-Va2FxLqXRfNGHd7BO49PrAPVUKo3k8bIpfNDp+TF+e2W14hfiyb0CxLdg+jgUatzIsg/+dCWnuEhCd062XOQvg=="
     },
+    "angular-chart.js": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/angular-chart.js/-/angular-chart.js-1.1.1.tgz",
+      "integrity": "sha1-SfDhjQgXYrbUyXkeSHr/L7sw9a4=",
+      "requires": {
+        "angular": "1.x",
+        "chart.js": "2.3.x"
+      }
+    },
     "angular-material": {
       "version": "1.1.9",
       "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.9.tgz",
@@ -2241,6 +2259,22 @@
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
       "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
     },
+    "cfb": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.0.7.tgz",
+      "integrity": "sha512-KjjZFR+a/e8RDdDTr4PwR0P/HIFRI3sxArFQttml0pFkhIO4TnvS/1+dqtGXPqe5/0MHp2IzjFx1JTzmohHT+w==",
+      "requires": {
+        "commander": "^2.14.1",
+        "printj": "~1.1.2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.15.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+          "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+        }
+      }
+    },
     "chai": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
@@ -2296,6 +2330,39 @@
       "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
       "dev": true
     },
+    "chart.js": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.3.0.tgz",
+      "integrity": "sha1-QEYOSOLEF8BfwzJc2E97AA3H19Y=",
+      "requires": {
+        "chartjs-color": "^2.0.0",
+        "moment": "^2.10.6"
+      }
+    },
+    "chartjs-color": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz",
+      "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=",
+      "requires": {
+        "chartjs-color-string": "^0.5.0",
+        "color-convert": "^0.5.3"
+      },
+      "dependencies": {
+        "color-convert": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
+          "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0="
+        }
+      }
+    },
+    "chartjs-color-string": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz",
+      "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==",
+      "requires": {
+        "color-name": "^1.0.0"
+      }
+    },
     "check-error": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
@@ -2550,6 +2617,22 @@
       "version": "git+ssh://git@git.alanc.net:10222/alancnet/codebase.git#bd151e08797a2f14a1670d36f4e50b3b0b05ca0a",
       "from": "git+ssh://git@git.alanc.net:10222/alancnet/codebase.git"
     },
+    "codepage": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.13.1.tgz",
+      "integrity": "sha512-KnY6cQlgkfBjplnQkLk3M5KEfAKa7i9SMqXp+bMuy2/bgYovvU4LDAQvkMaoScwhvozA9VUtgnbS4Z8f7zVA8w==",
+      "requires": {
+        "commander": "~2.14.1",
+        "exit-on-epipe": "~1.0.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.14.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
+          "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
+        }
+      }
+    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -2768,6 +2851,15 @@
         "vary": "^1"
       }
     },
+    "crc-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
+      "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
     "create-ecdh": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz",
@@ -3428,6 +3520,11 @@
       "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
       "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
     },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+    },
     "expand-brackets": {
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -4000,6 +4097,11 @@
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -10992,6 +11094,11 @@
       "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.39.tgz",
       "integrity": "sha1-wRcMt22FjxmGqmB8r+9FhXQDoNs="
     },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+    },
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -12630,6 +12737,14 @@
         }
       }
     },
+    "ssf": {
+      "version": "0.10.2",
+      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz",
+      "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
     "sshpk": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
@@ -14102,6 +14217,27 @@
         "slide": "^1.1.5"
       }
     },
+    "xlsx": {
+      "version": "0.13.0",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.13.0.tgz",
+      "integrity": "sha512-TD2NM86NaxshpggGaN5RwU+lyVbg70a/P67L9P7xScvZPVO/MNPwdqOY5hMWAPZUnWZ9NZwFGi1yn35nLCedPw==",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "cfb": "~1.0.7",
+        "codepage": "~1.13.0",
+        "commander": "~2.15.1",
+        "crc-32": "~1.2.0",
+        "exit-on-epipe": "~1.0.1",
+        "ssf": "~0.10.2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.15.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+          "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+        }
+      }
+    },
     "xtend": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",

+ 4 - 2
package.json

@@ -1,5 +1,5 @@
 {
-  "name": "project-app",
+  "name": "material-framework",
   "version": "1.0.0",
   "description": "",
   "main": "index.js",
@@ -18,6 +18,7 @@
     "angular": "^1.6.10",
     "angular-animate": "^1.7.0",
     "angular-aria": "^1.7.0",
+    "angular-chart.js": "^1.1.1",
     "angular-material": "^1.1.9",
     "angular-material-data-table": "^0.10.10",
     "angular-messages": "^1.7.0",
@@ -42,7 +43,8 @@
     "password-prompt": "^1.0.4",
     "plural": "^1.1.0",
     "sequelize": "^4.37.6",
-    "vorpal": "^1.12.0"
+    "vorpal": "^1.12.0",
+    "xlsx": "^0.13.0"
   },
   "devDependencies": {
     "babel-loader": "^7.1.4",

+ 9 - 0
server.js

@@ -0,0 +1,9 @@
+const app = require('./lib/server')
+const crudRoute = require('./lib/crud-route')
+const controllers = require('./lib/controllers')
+
+module.exports = {
+  app,
+  crudRoute,
+  controllers
+}

+ 2 - 2
webpack.config.js

@@ -38,13 +38,13 @@ module.exports = {
         use:['style-loader','css-loader', 'sass-loader']
       },
       {
-        test:/\.(?:svg|eot|woff2|woff|ttf)$/,
+        test:/\.(?:svg|png|eot|woff2|woff|ttf)$/,
         use:['file-loader']
       },
       {
         test:/\.html$/,
         use:['html-loader']
-      },
+      }
     ]
   }
 };