import base html core + bootstrap from warren
| After Width: | Height: | Size: 457 B | 
| After Width: | Height: | Size: 351 B | 
| After Width: | Height: | Size: 244 B | 
| After Width: | Height: | Size: 301 B | 
| After Width: | Height: | Size: 387 B | 
| After Width: | Height: | Size: 246 B | 
| After Width: | Height: | Size: 5.7 KiB | 
| After Width: | Height: | Size: 317 B | 
| After Width: | Height: | Size: 367 B | 
| After Width: | Height: | Size: 6.8 KiB | 
| After Width: | Height: | Size: 4.5 KiB | 
| After Width: | Height: | Size: 4.5 KiB | 
| After Width: | Height: | Size: 4.5 KiB | 
| After Width: | Height: | Size: 6.3 KiB | 
|  | @ -0,0 +1,40 @@ | |||
| body { | ||||
|   padding-top: 40px; | ||||
|   padding-bottom: 40px; | ||||
|   background-color: #eee; | ||||
| } | ||||
| 
 | ||||
| .form-signin { | ||||
|   max-width: 330px; | ||||
|   padding: 15px; | ||||
|   margin: 0 auto; | ||||
| } | ||||
| .form-signin .form-signin-heading, | ||||
| .form-signin .checkbox { | ||||
|   margin-bottom: 10px; | ||||
| } | ||||
| .form-signin .checkbox { | ||||
|   font-weight: normal; | ||||
| } | ||||
| .form-signin .form-control { | ||||
|   position: relative; | ||||
|   height: auto; | ||||
|   -webkit-box-sizing: border-box; | ||||
|      -moz-box-sizing: border-box; | ||||
|           box-sizing: border-box; | ||||
|   padding: 10px; | ||||
|   font-size: 16px; | ||||
| } | ||||
| .form-signin .form-control:focus { | ||||
|   z-index: 2; | ||||
| } | ||||
| .form-signin input[type="email"] { | ||||
|   margin-bottom: -1px; | ||||
|   border-bottom-right-radius: 0; | ||||
|   border-bottom-left-radius: 0; | ||||
| } | ||||
| .form-signin input[type="password"] { | ||||
|   margin-bottom: 10px; | ||||
|   border-top-left-radius: 0; | ||||
|   border-top-right-radius: 0; | ||||
| } | ||||
|  | @ -0,0 +1,11 @@ | |||
| body { | ||||
|   padding-top: 50px; | ||||
| } | ||||
| .starter-template { | ||||
|   padding: 40px 15px; | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .col-form .row .col-xs-2 { | ||||
|   text-align: right; | ||||
| } | ||||
|  | @ -0,0 +1,3 @@ | |||
| $(document).ready( function () { | ||||
|   $( "#datepicker" ).datepicker(); | ||||
| }); | ||||
|  | @ -0,0 +1,14 @@ | |||
| /*! | ||||
|  * jquery.confirm | ||||
|  * | ||||
|  * @version 2.3.1 | ||||
|  * | ||||
|  * @author My C-Labs | ||||
|  * @author Matthieu Napoli <matthieu@mnapoli.fr> | ||||
|  * @author Russel Vela | ||||
|  * @author Marcus Schwarz <msspamfang@gmx.de> | ||||
|  * | ||||
|  * @license MIT | ||||
|  * @url http://myclabs.github.io/jquery.confirm/
 | ||||
|  */ | ||||
| (function($){$.fn.confirm=function(options){if(typeof options==="undefined"){options={}}this.click(function(e){e.preventDefault();var newOptions=$.extend({button:$(this)},options);$.confirm(newOptions,e)});return this};$.confirm=function(options,e){if($(".confirmation-modal").length>0)return;var dataOptions={};if(options.button){var dataOptionsMapping={title:"title",text:"text","confirm-button":"confirmButton","cancel-button":"cancelButton","confirm-button-class":"confirmButtonClass"};$.each(dataOptionsMapping,function(attributeName,optionName){var value=options.button.data(attributeName);if(value){dataOptions[optionName]=value}})}var settings=$.extend({},$.confirm.options,{confirm:function(){var url=e&&("string"===typeof e&&e||e.currentTarget&&e.currentTarget.attributes["href"].value);if(url){if(options.post){var form=$('<form method="post" class="hide" action="'+url+'"></form>');$("body").append(form);form.submit()}else{window.location=url}}},cancel:function(o){},button:null},dataOptions,options);var modalHeader="";if(settings.title!==""){modalHeader="<div class=modal-header>"+'<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>'+'<h4 class="modal-title">'+settings.title+"</h4>"+"</div>"}var modalHTML='<div class="confirmation-modal modal fade" tabindex="-1" role="dialog">'+'<div class="modal-dialog">'+'<div class="modal-content">'+modalHeader+'<div class="modal-body">'+settings.text+"</div>"+'<div class="modal-footer">'+'<button class="confirm btn '+settings.confirmButtonClass+'" type="button" data-dismiss="modal">'+settings.confirmButton+"</button>"+'<button class="cancel btn btn-default" type="button" data-dismiss="modal">'+settings.cancelButton+"</div>"+"</div>"+"</div>"+"</div>"+"</div>";var modal=$(modalHTML);modal.on("shown.bs.modal",function(){modal.find(".btn-primary:first").focus()});modal.on("hidden.bs.modal",function(){modal.remove()});modal.find(".confirm").click(function(){settings.confirm(settings.button)});modal.find(".cancel").click(function(){settings.cancel(settings.button)});$("body").append(modal);modal.modal("show")};$.confirm.options={text:"Are you sure?",title:"",confirmButton:"Yes",cancelButton:"Cancel",post:false,confirmButtonClass:"btn-primary"}})(jQuery); | ||||
							
								
								
									
										36
									
								
								main.go
								
								
								
								
							
							
						
						|  | @ -4,6 +4,8 @@ import ( | |||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"database/sql" | ||||
| 	_ "github.com/lib/pq" | ||||
| ) | ||||
| 
 | ||||
| const VERSION = "0.1" | ||||
|  | @ -19,6 +21,7 @@ type Config struct { | |||
| 
 | ||||
| var ( | ||||
| 	config Config | ||||
| 	db *sql.DB | ||||
| ) | ||||
| 
 | ||||
| func loadConfig() { | ||||
|  | @ -31,10 +34,41 @@ func loadConfig() { | |||
| 	decoder.Decode(&config) | ||||
| } | ||||
| 
 | ||||
| func dbConnect() { | ||||
|     var err error | ||||
| 	db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=require", config.Sql.Username, config.Sql.Password, config.Sql.Host, config.Sql.Dbname)) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		fmt.Println("DB ERROR: ", err) | ||||
| 	} | ||||
| 	err = db.Ping() | ||||
| 	if err != nil { | ||||
| 		fmt.Println("DB Error on Ping(): ", err) | ||||
| 		os.Exit(-1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func initTemplates() { | ||||
| 	files, _ := filepath.Glob("templates/pages/*.html") | ||||
| 	re := regexp.MustCompile("templates/pages/(.*).html") | ||||
| 	fmt.Println("Loading Templates:") | ||||
| 	for _, t := range files { | ||||
| 		name := re.FindStringSubmatch(t) | ||||
| 		fmt.Println("  ", name[1]) | ||||
| 		var err error | ||||
| 		templates[name[1]], err = template.ParseFiles("templates/layout.html", t) | ||||
| 		if err != nil { | ||||
| 			fmt.Println("Template load error: ", err) | ||||
| 			os.Exit(-1) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	fmt.Println("transmet ", VERSION) | ||||
| 	fmt.Println("Loading...") | ||||
| 	loadConfig() | ||||
| 	  | ||||
| 	 | ||||
| 	 | ||||
| 	db.Close() | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,73 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="utf-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|    | ||||
|     <title>transmet</title> | ||||
| 
 | ||||
|     <!-- Bootstrap --> | ||||
|     <link href="/css/bootstrap.min.css" rel="stylesheet"> | ||||
|     <link href="/css/jquery-ui.min.css" rel="stylesheet"> | ||||
|     <link href="/css/template.css" rel="stylesheet"> | ||||
|     <link href="/css/signin.css" rel="stylesheet"> | ||||
| 
 | ||||
|   </head> | ||||
|   <body> | ||||
|      | ||||
|     <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> | ||||
|       <div class="container"> | ||||
|         <div class="navbar-header"> | ||||
| 
 | ||||
|           <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> | ||||
|             <span class="sr-only">Toggle navigation</span> | ||||
|             <span class="icon-bar"></span> | ||||
|             <span class="icon-bar"></span> | ||||
|             <span class="icon-bar"></span> | ||||
|           </button> | ||||
|           <a class="navbar-brand" href="/">MasterTracker</a> | ||||
|         </div> | ||||
|         <div class="collapse navbar-collapse"> | ||||
|           <ul class="nav navbar-nav"> | ||||
|             <!--<li class="active"><a href="#">Home</a></li> | ||||
|             <li><a href="#about">About</a></li> | ||||
|             <li><a href="#contact">Contact</a></li> --> | ||||
|           </ul> | ||||
|           <ul class="nav navbar-nav navbar-right"> | ||||
|           {{if .user}} | ||||
|             <li><a href="/user/edit">{{.user.Displayname}}</a></li> | ||||
|             <li><a href="/logout">Logout</a></li> | ||||
|           {{else}} | ||||
|             <li><a href="/signup">Sign up</a></li> | ||||
|             <li><a href="/login">Log in</a></li> | ||||
|           {{end}} | ||||
|           </ul> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|      | ||||
|     <div class="container"> | ||||
|     {{template "body" .}} | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> | ||||
|     <script src="/js/jquery.min.js"></script> | ||||
|     <!-- Include all compiled plugins (below), or include individual files as needed --> | ||||
|     <script src="/js/bootstrap.min.js"></script> | ||||
|     <script src="/js/jquery.confirm.min.js"></script> | ||||
|     <script src="/js/jquery-ui.min.js"></script> | ||||
|     <script src="/js/funcs.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| 
 | ||||
| {{define "flashes"}} | ||||
| <div class="messages"> | ||||
|    {{range .flashes.info}} | ||||
|      <div class="alert alert-success" role="alert">Info: {{.}}</div> | ||||
|    {{end}} | ||||
|    {{range .flashes.error}} | ||||
|      <div class="alert alert-danger" role="alert">Error: {{.}}</div> | ||||
|    {{end}} | ||||
| </div> | ||||
| {{end}} | ||||