mirror of
https://github.com/stolksdorf/homebrewery.git
synced 2025-12-12 23:45:57 +00:00
Added a brew lookup for admin page
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
### Thursday, 19/01/2017 - v2.7.0
|
||||
- Fixed saving multiple authors and multiple systems on brew metadata (thanks u/PalaNolho re:282)
|
||||
- Adding in line highlight for new pages
|
||||
- Added in a simple brew lookup for admin
|
||||
|
||||
|
||||
### Saturday, 14/01/2017 - v2.7.0
|
||||
|
||||
@@ -27,8 +27,6 @@ var Admin = React.createClass({
|
||||
|
||||
<div className='container'>
|
||||
|
||||
<a target="_blank" href='https://www.google.com/analytics/web/?hl=en#report/defaultid/a72212009w109843310p114529111/'>Link to Google Analytics</a>
|
||||
|
||||
<HomebrewAdmin homebrews={this.props.homebrews} admin_key={this.props.admin_key} />
|
||||
</div>
|
||||
|
||||
|
||||
67
client/admin/homebrewAdmin/brewLookup/brewLookup.jsx
Normal file
67
client/admin/homebrewAdmin/brewLookup/brewLookup.jsx
Normal file
@@ -0,0 +1,67 @@
|
||||
const React = require('react');
|
||||
const _ = require('lodash');
|
||||
const cx = require('classnames');
|
||||
|
||||
const request = require('superagent');
|
||||
const Moment = require('moment');
|
||||
|
||||
|
||||
const BrewLookup = React.createClass({
|
||||
getDefaultProps: function() {
|
||||
return {
|
||||
adminKey : '',
|
||||
};
|
||||
},
|
||||
getInitialState: function() {
|
||||
return {
|
||||
query:'',
|
||||
resultBrew : null,
|
||||
searching : false
|
||||
};
|
||||
},
|
||||
|
||||
handleChange : function(e){
|
||||
this.setState({
|
||||
query : e.target.value
|
||||
})
|
||||
},
|
||||
lookup : function(){
|
||||
this.setState({ searching : true });
|
||||
|
||||
request.get(`/admin/lookup/${this.state.query}`)
|
||||
.query({ admin_key : this.props.adminKey })
|
||||
.end((err, res) => {
|
||||
this.setState({
|
||||
searching : false,
|
||||
resultBrew : (err ? null : res.body)
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
renderFoundBrew : function(){
|
||||
if(this.state.searching) return <div className='searching'><i className='fa fa-spin fa-spinner' /></div>;
|
||||
if(!this.state.resultBrew) return <div className='noBrew'>No brew found.</div>;
|
||||
|
||||
const brew = this.state.resultBrew;
|
||||
return <div className='brewRow'>
|
||||
<div>{brew.title}</div>
|
||||
<div>{brew.authors.join(', ')}</div>
|
||||
<div><a href={'/edit/' + brew.editId} target='_blank'>/edit/{brew.editId}</a></div>
|
||||
<div><a href={'/share/' + brew.shareId} target='_blank'>/share/{brew.shareId}</a></div>
|
||||
<div>{Moment(brew.updatedAt).fromNow()}</div>
|
||||
<div>{brew.views}</div>
|
||||
</div>
|
||||
},
|
||||
|
||||
render: function(){
|
||||
return <div className='brewLookup'>
|
||||
<h1>Brew Lookup</h1>
|
||||
<input type='text' value={this.state.query} onChange={this.handleChange} placeholder='edit or share id...' />
|
||||
<button onClick={this.lookup}><i className='fa fa-search'/></button>
|
||||
|
||||
{this.renderFoundBrew()}
|
||||
</div>
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = BrewLookup;
|
||||
8
client/admin/homebrewAdmin/brewLookup/brewLookup.less
Normal file
8
client/admin/homebrewAdmin/brewLookup/brewLookup.less
Normal file
@@ -0,0 +1,8 @@
|
||||
.brewLookup{
|
||||
height : 200px;
|
||||
input{
|
||||
height : 33px;
|
||||
padding : 0px 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,8 @@ var Moment = require('moment');
|
||||
|
||||
var BrewSearch = require('./brewSearch.jsx');
|
||||
|
||||
var BrewLookup = require('./brewLookup/brewLookup.jsx');
|
||||
|
||||
|
||||
var HomebrewAdmin = React.createClass({
|
||||
getDefaultProps: function() {
|
||||
@@ -35,6 +37,7 @@ var HomebrewAdmin = React.createClass({
|
||||
page : page
|
||||
})
|
||||
.end((err, res)=>{
|
||||
if(err || !res.body || !res.body.brews) return;
|
||||
this.state.brewCache[page] = res.body.brews;
|
||||
this.setState({
|
||||
brewCache : this.state.brewCache,
|
||||
@@ -141,9 +144,18 @@ var HomebrewAdmin = React.createClass({
|
||||
render : function(){
|
||||
var self = this;
|
||||
return <div className='homebrewAdmin'>
|
||||
|
||||
<BrewLookup adminKey={this.props.admin_key} />
|
||||
|
||||
{/*
|
||||
<h2>
|
||||
Homebrews - {this.state.total}
|
||||
</h2>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{this.renderPagnination()}
|
||||
{this.renderBrewTable()}
|
||||
|
||||
@@ -152,6 +164,7 @@ var HomebrewAdmin = React.createClass({
|
||||
</button>
|
||||
|
||||
<BrewSearch admin_key={this.props.admin_key} />
|
||||
*/}
|
||||
</div>
|
||||
}
|
||||
});
|
||||
|
||||
@@ -10,8 +10,12 @@ const livereload = require('vitreum/steps/livereload.js').partial;
|
||||
const Proj = require('./project.json');
|
||||
|
||||
Promise.resolve()
|
||||
.then(jsx('homebrew', './client/homebrew/homebrew.jsx', Proj.libs, 'shared'))
|
||||
.then(jsx('homebrew', './client/homebrew/homebrew.jsx', Proj.libs, './shared'))
|
||||
.then(less('homebrew', './shared'))
|
||||
|
||||
.then(jsx('admin', './client/admin/admin.jsx', Proj.libs, './shared'))
|
||||
.then(less('admin', './shared'))
|
||||
|
||||
.then(assets(Proj.assets, ['./shared', './client']))
|
||||
.then(livereload())
|
||||
.then(server('./server.js', ['server']))
|
||||
|
||||
@@ -3,7 +3,7 @@ const jwt = require('jwt-simple');
|
||||
const express = require("express");
|
||||
const app = express();
|
||||
|
||||
app.use(express.static(__dirname + '/build'));
|
||||
app.use(express.static(__dirname + '/build'));''
|
||||
app.use(require('body-parser').json({limit: '25mb'}));
|
||||
app.use(require('cookie-parser')());
|
||||
|
||||
@@ -34,7 +34,7 @@ app.use((req, res, next) => {
|
||||
|
||||
|
||||
app.use(require('./server/homebrew.api.js'));
|
||||
//app.use(require('./server/admin.api.js'));
|
||||
app.use(require('./server/admin.api.js'));
|
||||
|
||||
|
||||
const HomebrewModel = require('./server/homebrew.model.js').model;
|
||||
|
||||
@@ -2,7 +2,6 @@ const _ = require('lodash');
|
||||
const auth = require('basic-auth');
|
||||
const HomebrewModel = require('./homebrew.model.js').model;
|
||||
const router = require('express').Router();
|
||||
const vitreumRender = require('vitreum/render');
|
||||
|
||||
|
||||
const mw = {
|
||||
@@ -42,28 +41,42 @@ router.get('/api/invalid', mw.adminOnly, (req, res)=>{
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/admin/lookup/:id', mw.adminOnly, (req, res, next) => {
|
||||
//search for mathcing edit id
|
||||
//search for matching share id
|
||||
// search for partial match
|
||||
|
||||
HomebrewModel.findOne({ $or:[
|
||||
{editId : { "$regex": req.params.id, "$options": "i" }},
|
||||
{shareId : { "$regex": req.params.id, "$options": "i" }},
|
||||
]}).exec((err, brew) => {
|
||||
return res.json(brew);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
//Admin route
|
||||
|
||||
|
||||
const render = require('vitreum/steps/render');
|
||||
const templateFn = require('../client/template.js');
|
||||
router.get('/admin', function(req, res){
|
||||
const credentials = auth(req)
|
||||
if (!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) {
|
||||
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
|
||||
return res.status(401).send('Access denied')
|
||||
}
|
||||
vitreumRender({
|
||||
page: './build/admin/bundle.dot',
|
||||
prerenderWith : './client/admin/admin.jsx',
|
||||
clearRequireCache : !process.env.PRODUCTION,
|
||||
initialProps: {
|
||||
render('admin', templateFn, {
|
||||
url: req.originalUrl,
|
||||
admin_key : process.env.ADMIN_KEY,
|
||||
},
|
||||
}, function (err, page) {
|
||||
return res.send(page)
|
||||
});
|
||||
})
|
||||
.then((page) => {
|
||||
return res.send(page)
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
return res.sendStatus(500);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user