diff --git a/app/base.html b/app/base.html deleted file mode 100644 index 850b819579f93f1ce549a5c5914ce3050ba3a703..0000000000000000000000000000000000000000 --- a/app/base.html +++ /dev/null @@ -1,30 +0,0 @@ -<!doctype html> -<html lang=""> - -<head> - <title>TITLE</title> - - META - - LINK - - <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> - <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"/> -</head> - -<div class="app">CONTENT</div> - -<!-- Google Analytics: change UA-XXXXX-X to be your site's ID --> -<script> - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - ga('create', 'UA-XXXXX-X', 'auto'); - ga('send', 'pageview'); -</script> - -<script type="text/javascript" charset="utf-8" src="/assets/app.js"></script> - -</body> -</html> diff --git a/app/components/App.jsx b/app/components/App.jsx index 56a7908681128b7c240f60a793ad849c96579d4a..0e79772575aeaaf2d54d97580050584f890c53bc 100644 --- a/app/components/App.jsx +++ b/app/components/App.jsx @@ -1,14 +1,12 @@ -// TODO: Hacks for Substance -require('expose?$!jquery') -// - import React from 'react' import AltContainer from 'alt/AltContainer' import ManageStore from '../stores/ManageStore' import CreateStore from '../stores/CreateStore' - +import CreateAPI from '../utils/CreateAPI' +import ManageAPI from '../utils/ManageAPI' import Navigation from '../components/Navigation' - +import alt from '../altInstance' +import _ from 'lodash' import '../scss/main' /* @@ -28,6 +26,22 @@ import '../scss/main' */ export default class App extends React.Component { + componentWillMount () { + let manages = ManageAPI.getManages() + let creates = CreateAPI.getCreates() + + Promise.all([manages, creates]).then(function (results) { + results[0] = _.indexBy(results[0], 'id') + results[1] = _.indexBy(results[1], function (object) { + return object.data.manageId + }) + alt.bootstrap(JSON.stringify({ + ManageStore: { manages: results[0] }, + CreateStore: { creates: results[1] } + })) + }) + } + render () { return ( <AltContainer stores={{ diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1bd3e9c1d6b823217b6ff9e2a0d1e2a1ac0f22b1 --- /dev/null +++ b/app/index.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"/> +</head> +<body> + <div id="app"></div> + <script type="text/javascript" charset="utf-8" src="/assets/app.js"></script> +</body> +</html> diff --git a/app/index.js b/app/index.js new file mode 100644 index 0000000000000000000000000000000000000000..fca36d914cd22491b0cc867a927737dd73b6513b --- /dev/null +++ b/app/index.js @@ -0,0 +1,12 @@ +import React from 'react' +import createHistory from 'history/lib/createBrowserHistory' +import { Router } from 'react-router' +import routes from './routes.jsx' +const history = createHistory() + +/* + * Client side bootstrap with iso and alt + */ + +React.render(<Router history={history} children={routes} />, document.getElementById('app')) + diff --git a/app/index.prerender.html b/app/index.prerender.html new file mode 100644 index 0000000000000000000000000000000000000000..f71fc89a6b2b65791517e311872c1c6588b2f430 --- /dev/null +++ b/app/index.prerender.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + +<head> + <title>TITLE</title> + + META + + LINK + + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"/> +</head> + +<div id="app">CONTENT</div> + +<script type="text/javascript" charset="utf-8" src="/assets/app.js"></script> + +</body> +</html> diff --git a/app/server.jsx b/app/server.jsx index 47d06467bb21d838cfb1977394cf3bda12d8b81c..8bf52d1f8c530f7ef281c4fef68e3d077e51f60b 100644 --- a/app/server.jsx +++ b/app/server.jsx @@ -6,7 +6,7 @@ import { renderToString } from 'react-dom/server' import alt from './altInstance'; import routes from './routes.jsx'; -import html from './base.html'; +import html from './index.prerender.html'; /* * @param {AltObject} an instance of the Alt object diff --git a/app/utils/CreateAPI.js b/app/utils/CreateAPI.js index eba7694b3cca59d5fe7933dd6e5f861edf3a7153..fc96be4a13f9e0147667106321eb0a40d870345e 100644 --- a/app/utils/CreateAPI.js +++ b/app/utils/CreateAPI.js @@ -1,6 +1,21 @@ var request = require('superagent') const utils = { + getCreates: (id) => { + return new Promise(function (resolve, reject) { + request + .get('/api/creates') + .end(function (err, res) { + if (err) { + console.error(err) + reject(err) + } else { + resolve(res.body) + } + }) + }) + }, + getCreate: (id) => { return new Promise(function (resolve, reject) { request diff --git a/app/utils/ManageAPI.js b/app/utils/ManageAPI.js index 5b9ce5a044125205979d4e2f963bd24add90c6bf..f2499d23bd57f0226de03a951fcbc4afbb60496c 100644 --- a/app/utils/ManageAPI.js +++ b/app/utils/ManageAPI.js @@ -1,6 +1,20 @@ var request = require('superagent') const utils = { + getManages: () => { + return new Promise(function (resolve, reject) { + request + .get('/api/manages') + .end(function (err, res) { + if (err) { + console.error(err) + reject(err) + } else { + resolve(res.body) + } + }) + }) + }, addManage: (manage) => { return new Promise(function (resolve, reject) { diff --git a/bin/webpack_server.js b/bin/webpack_server.js index d3a13eff9f555c5a7cfde550b11afd6422a0aae3..a3b16edbec4738e968e5d9447c56c8231055b754 100644 --- a/bin/webpack_server.js +++ b/bin/webpack_server.js @@ -7,7 +7,7 @@ var webpackDevServer = require('webpack-dev-server'); var path = require('path'); var fs = require('fs'); -var webpackConfig = require('../webpack/webpack-hot.config.js'); +var webpackConfig = require('../webpack/webpack.dev.config.js'); module.exports = function() { // Fire up webpack and pass in the configuration file we created diff --git a/package.json b/package.json index cd7a552a4c0d7362c697feff62960205278fb48f..212926640602badb607f085b9ccea95cf603ca20 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,9 @@ "private": true, "scripts": { "start": "NODE_ENV=production node bin/www", - "dev": "NODE_ENV=dev node bin/www", - "hot": "npm run buildHot && NODE_ENV=dev LOADER=hot node bin/www", - "build": "webpack --colors --config ./webpack/webpack.config.js", - "buildHot": "webpack --colors --config ./webpack/webpack-hot.config.js", - "watch": "webpack --watch --config ./webpack/webpack.config.js", + "build": "webpack --colors --config ./webpack/webpack.prod.config.js", + "dev": "npm run buildDev && NODE_ENV=dev LOADER=hot node bin/www", + "buildDev": "webpack --colors --config ./webpack/webpack.dev.config.js", "db-migrate": "db-migrate", "test": "make test", "eslint": "eslint" diff --git a/routes/admin.js b/routes/admin.js index 0f5ad2fb501b3f493f4f34bfeb1cc60962c7f277..6eccb4bbd80bcd95eed9f9317d633eea19a5fe58 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -1,72 +1,9 @@ const express = require('express') const router = express.Router() -const pg = require('pg') -const connectionString = process.env.DATABASE_URL -const _ = require('lodash') -const Header = require('../public/assets/header.server') -const App = require('../public/assets/app.server') +const path = require('path') -// Retrieves all manages on any endpoint for demonstration purposes -// If you were indeed doing this in production, you should instead only -// query the Manages on a page that has manages router.get('*', function(req, res, next) { - var manages_results = [] - var creates_results = [] - - pg.connect(connectionString, function(err, client, done) { - const query = client.query('SELECT * FROM manages ORDER BY id ASC') - - query.on('row', function(row) { - manages_results.push(row) - }) - - query.on('end', function() { - const subquery = client.query('SELECT * FROM creates ORDER BY id ASC') - - subquery.on('row', function(row) { - creates_results.push(row) - }) - - subquery.on('end', function() { - done() - - const manages = _.indexBy(manages_results, 'id') - const creates = _.indexBy(creates_results, function(object) { - return object.data.manageId - }) - - res.locals.data = { - ManageStore: { manages: manages }, - CreateStore: { creates: creates } - } - next() - }) - }) - - if (err) { - res.status(500).send(err) - } - }) -}) - -// This is where the magic happens. We take the locals data we have already -// fetched and seed our stores with data. -// App is a function that requires store data and url to initialize and return -// the React-rendered html string - -router.get('*', function (req, res, next) { - var html = App(JSON.stringify(res.locals.data || {}), req, res) - html = html.replace("TITLE", Header.title) - .replace("META", Header.meta) - - if(process.env.LOADER === 'hot') { - html = html.replace("LINK", '') - } else { - html = html.replace("LINK", Header.link) - } - - res.contentType = "text/html charset=utf8" - res.end(html) + return res.sendFile('index.html' , { root: path.join(__dirname, '../app') }) }) module.exports = router diff --git a/views/index.jade b/views/index.jade deleted file mode 100644 index 3d63b9a044a859b59259d5e23dd4e68ec8e1f2be..0000000000000000000000000000000000000000 --- a/views/index.jade +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p Welcome to #{title} diff --git a/views/layout.jade b/views/layout.jade deleted file mode 100644 index 15af079bf7c34e638ba14844efd979ac9111628b..0000000000000000000000000000000000000000 --- a/views/layout.jade +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - block content diff --git a/webpack/webpack-hot.config.js b/webpack/webpack.dev.config.js similarity index 99% rename from webpack/webpack-hot.config.js rename to webpack/webpack.dev.config.js index eca454f62bcec5b4568b2e7a3100253d04944066..e488222cff25ff8cb0a41a83661f3141bb629454 100644 --- a/webpack/webpack-hot.config.js +++ b/webpack/webpack.dev.config.js @@ -29,7 +29,7 @@ module.exports = [ entry: { app:[ 'webpack-dev-server/client?http://' + WEBPACK_HOST + ":" + WEBPACK_PORT, 'webpack/hot/dev-server', - "./client" ] + "./index" ] }, output: { // The output directory as absolute path diff --git a/webpack/webpack.config.js b/webpack/webpack.prod.config.js similarity index 100% rename from webpack/webpack.config.js rename to webpack/webpack.prod.config.js