1
0
mirror of https://github.com/stolksdorf/homebrewery.git synced 2025-12-20 23:11:29 +00:00

trying to improve the admin view

This commit is contained in:
Scott
2016-02-19 15:37:58 -05:00
parent 2231dc3684
commit a1b8d4e8ce
6 changed files with 126 additions and 92 deletions

View File

@@ -1,7 +1,9 @@
## changelog ## changelog
#### Tuesday, 16/02/2016 #### Tuesday, 16/02/2016, `v2.0.0`
* Paragraphs right after tables now indent (thanks LikeAJi6!) * Paragraphs right after tables now indent (thanks LikeAJi6!)
* Added a `@page` css rule to auto turn off margins when printing
* Added a `page-break` property on each `.phb` page to properly page the pages up when exporting (thanks Jokefury!)
#### Sunday, 17/01/2016 #### Sunday, 17/01/2016

View File

@@ -2,10 +2,12 @@ var React = require('react');
var _ = require('lodash'); var _ = require('lodash');
var cx = require('classnames'); var cx = require('classnames');
var Moment = require('moment') var Moment = require('moment');
var VIEW_LIMIT = 30;
var COLUMN_HEIGHT = 52;
var HomebrewAdmin = React.createClass({ var HomebrewAdmin = React.createClass({
getDefaultProps: function() { getDefaultProps: function() {
return { return {
homebrews : [], homebrews : [],
@@ -13,27 +15,29 @@ var HomebrewAdmin = React.createClass({
}; };
}, },
getInitialState: function() {
return {
viewStartIndex: 0
};
},
renderBrews : function(){ renderBrews : function(){
return _.map(this.props.homebrews, (brew)=>{ return _.times(VIEW_LIMIT, (i)=>{
var brew = this.props.homebrews[i + this.state.viewStartIndex];
if(!brew) return null;
return <tr className={cx('brewRow', {'isEmpty' : brew.text == ""})} key={brew.sharedId}> return <tr className={cx('brewRow', {'isEmpty' : brew.text == ""})} key={brew.sharedId}>
<td>{brew.editId}</td> <td><a href={'/homebrew/edit/' + brew.editId} target='_blank'>{brew.editId}</a></td>
<td>{brew.shareId}</td> <td><a href={'/homebrew/share/' + brew.shareId} target='_blank'>{brew.shareId}</a></td>
<td>{Moment(brew.createdAt).fromNow()}</td> <td>{Moment(brew.createdAt).fromNow()}</td>
<td>{Moment(brew.updatedAt).fromNow()}</td> <td>{Moment(brew.updatedAt).fromNow()}</td>
<td>{Moment(brew.lastViewed).fromNow()}</td> <td>{Moment(brew.lastViewed).fromNow()}</td>
<td>{brew.views}</td> <td>{brew.views}</td>
<td className='preview'>
<a target="_blank" href={'/homebrew/share/' + brew.shareId}>view</a>
<div className='content'>
{brew.text.slice(0, 500)}
</div>
</td>
<td><a href={'/homebrew/remove/' + brew.editId +'?admin_key=' + this.props.admin_key}><i className='fa fa-trash' /></a></td> <td><a href={'/homebrew/remove/' + brew.editId +'?admin_key=' + this.props.admin_key}><i className='fa fa-trash' /></a></td>
</tr> </tr>
});
})
}, },
render : function(){ render : function(){
@@ -41,22 +45,23 @@ var HomebrewAdmin = React.createClass({
return( return(
<div className='homebrewAdmin'> <div className='homebrewAdmin'>
<h2>Homebrews - {this.props.homebrews.length}</h2> <h2>Homebrews - {this.props.homebrews.length}</h2>
<table> <div className='brewTable'>
<thead> <table>
<tr> <thead>
<th>Edit Id</th> <tr>
<th>Share Id</th> <th>Edit Id</th>
<th>Created At</th> <th>Share Id</th>
<th>Last Updated</th> <th>Created At</th>
<th>Last Viewed</th> <th>Last Updated</th>
<th>Number of Views</th> <th>Last Viewed</th>
<th>Preview</th> <th>Number of Views</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{this.renderBrews()} {this.renderBrews()}
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
); );
} }

View File

@@ -1,42 +1,45 @@
.homebrewAdmin{ .homebrewAdmin{
table{ .brewTable{
overflow-y : scroll; overflow-y : scroll;
max-height : 800px; max-height : 500px;
th{ table{
padding : 10px;
font-weight : 800; th{
} padding : 10px;
tr:nth-child(even){ font-weight : 800;
background-color : fade(@green, 10%); }
} tr:nth-child(even){
tr.isEmpty{ background-color : fade(@green, 10%);
background-color : fade(@red, 30%); }
} tr.isEmpty{
td{ background-color : fade(@red, 30%);
min-width : 100px; }
padding : 10px; td{
text-align : center; min-width : 100px;
&.preview{ padding : 10px;
position : relative; text-align : center;
&:hover{ &.preview{
.content{ position : relative;
display : block; &:hover{
.content{
display : block;
}
}
.content{
position : absolute;
display : none;
top : 100%;
left : 0px;
z-index : 1000;
max-height : 500px;
width : 300px;
padding : 30px;
background-color : white;
font-family : monospace;
text-align : left;
pointer-events : none;
} }
}
.content{
position : absolute;
display : none;
top : 100%;
left : 0px;
z-index : 1000;
max-height : 500px;
width : 300px;
padding : 30px;
background-color : white;
font-family : monospace;
text-align : left;
pointer-events : none;
} }
} }
} }

View File

@@ -9,9 +9,7 @@
@horizontalRule : #9c2b1b; @horizontalRule : #9c2b1b;
@headerText : #58180D; @headerText : #58180D;
@monsterStatBackground : #FDF1DC; @monsterStatBackground : #FDF1DC;
@page { margin: 0; } @page { margin: 0; }
.useSansSerif(){ .useSansSerif(){
font-family : ScalySans; font-family : ScalySans;
em{ em{
@@ -19,9 +17,9 @@
font-style : italic; font-style : italic;
} }
strong{ strong{
font-family : ScalySans; font-family : ScalySans;
font-weight : 800; font-weight : 800;
letter-spacing: -0.02em; letter-spacing : -0.02em;
} }
} }
.useColumns(){ .useColumns(){
@@ -38,19 +36,21 @@
} }
.phb{ .phb{
.useColumns(); .useColumns();
position : relative; position : relative;
z-index : 15; z-index : 15;
box-sizing : border-box; box-sizing : border-box;
overflow : hidden; overflow : hidden;
height : 279.4mm; height : 279.4mm;
width : 215.9mm; width : 215.9mm;
padding : 1.0cm 1.7cm; padding : 1.0cm 1.7cm;
padding-bottom : 1.5cm; padding-bottom : 1.5cm;
background-color : @background; background-color : @background;
background-image : @backgroundImage; background-image : @backgroundImage;
font-family : BookSanity; font-family : BookSanity;
font-size : 9pt; font-size : 9pt;
text-rendering : optimizeLegibility; text-rendering : optimizeLegibility;
page-break-before : always;
page-break-after : always;
//***************************** //*****************************
// * BASE // * BASE
// *****************************/ // *****************************/
@@ -69,17 +69,17 @@
list-style-type : disc; list-style-type : disc;
} }
ol{ ol{
list-style-position: inside;
margin-bottom : 0.8em; margin-bottom : 0.8em;
line-height : 1.3em; line-height : 1.3em;
list-style-position : inside;
list-style-type : decimal; list-style-type : decimal;
} }
img{ img{
z-index : -1; z-index : -1;
} }
strong{ strong{
font-weight : bold; font-weight : bold;
letter-spacing: 0.03em; letter-spacing : 0.03em;
} }
em{ em{
font-style : italic; font-style : italic;
@@ -100,11 +100,11 @@
-webkit-column-span : 2; -webkit-column-span : 2;
-moz-column-span : 2; -moz-column-span : 2;
&+p::first-letter{ &+p::first-letter{
float : left; float : left;
font-family : Solberry; font-family : Solberry;
line-height: 0.8em; font-size : 10em;
font-size : 10em; color : #222;
color : #222; line-height : 0.8em;
} }
} }
h2{ h2{
@@ -361,6 +361,6 @@
} }
//Text indent right after table //Text indent right after table
table+p{ table+p{
text-indent: 1em; text-indent : 1em;
} }
} }

View File

@@ -199,6 +199,8 @@ table {
font-family: BookSanity; font-family: BookSanity;
font-size: 9pt; font-size: 9pt;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
page-break-before: always;
page-break-after: always;
} }
.phb p { .phb p {
padding-bottom: 0.8em; padding-bottom: 0.8em;

View File

@@ -57,6 +57,28 @@ module.exports = function(app){
} }
}); });
app.get('/homebrew/clear', function(req, res){
//if(req.query && req.query.admin_key == process.env.ADMIN_KEY){
HomebrewModel.find({text : ''}, function(err, objs){
return res.json(objs);
if(!objs.length || err) return res.status(404).send("Can not find homebrew with that id");
var resEntry = objs[0];
resEntry.remove(function(err){
if(err) return res.status(500).send("Error while removing");
return res.status(200).send();
})
});
//}else{
// return res.status(401).send('Access denied');
//}
});
//Edit Page //Edit Page
app.get('/homebrew/edit/:id', function(req, res){ app.get('/homebrew/edit/:id', function(req, res){