Jelajahi Sumber

Working on documents: setting up boilerplate

Andrea Fazzi 5 tahun lalu
induk
melakukan
82f37e5fee

+ 6 - 3
generator/templates/add_update.tpl

@@ -2,11 +2,14 @@
 
 <div class="container">
 
+  <nav aria-label="breadcrumb">
   {{"{{if .Options.Get \"update\"}}"}}
   <ol class="breadcrumb">
-    <li><a href="/{{.Models}}?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" "}}"{{.Models}}"}}">{{.Model}}</a></li>
-    <li class="active"><a href="#">Aggiorna {{.Model}}</a></li>
-  </ol>  
+    <li class="breadcrumb-item"><a href="/{{.Models}}?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" "}}"{{.Models}}"}}">{{.Model}}</a></li>
+    <li class="breadcrumb-item active"><a href="#">Aggiorna {{.Model}}</a></li>
+  </ol>
+  </nav>
+  
   {{"{{else}}"}}
   <ol class="breadcrumb">
     <li><a href="/{{.Models}}?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" "}}"{{.Models}}"}}">{{.Model}}</a></li>

+ 1 - 1
generator/templates/all.tpl

@@ -9,7 +9,7 @@
       </div>
       <div class="col-md-4">
 	<a href="/{{.Models}}/add/?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" \""}}{{.Models}}{{"_add_update\"}}\""}} class="btn btn-primary float-right">
-	  <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+          <span class="fa fa-plus-circle" aria-hidden="true"></span>
 	  Crea nuovo {{.Model}}
 	</a>
       </div>

+ 6 - 4
generator/templates/show.tpl

@@ -2,10 +2,12 @@
 
 <div class="container">
 
-  <ol class="breadcrumb">
-    <li><a href="/{{.Models}}?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" "}}"{{.Models}}"}}">{{.Models}}</a></li>
-    <li class="active"><a href="#">{{"{{.Data.Name}}"}}</a></li>
-  </ol>
+  <nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+      <li class="breadcrumb-item"><a href="/{{.Models}}?{{"{{query \"tpl_layout\" \"base\" \"tpl_content\" "}}"{{.Models}}"}}">{{.Models}}</a></li>
+      <li class="breadcrumb-item active"><a href="#">{{"{{.Data.Name}}"}}</a></li>
+    </ol>
+  </nav>
 
   <div class="karmen-info-header">
     <div class="row">

+ 1 - 0
handlers/handlers.go

@@ -60,6 +60,7 @@ var (
 		"students",
 		"offices",
 		"administratives",
+		"documents",
 	}
 )
 

+ 154 - 0
orm/document.go

@@ -0,0 +1,154 @@
+package orm
+
+import (
+	"net/http"
+
+	"github.com/jinzhu/gorm"
+
+	"gogs.carducci-dante.gov.it/karmen/core/renderer"
+)
+
+type FilePath struct {
+	gorm.Model
+
+	Path       string
+	DocumentID uint
+}
+
+type Document struct {
+	gorm.Model
+
+	Name          string
+	SurveyUrl     string
+	ReferencePath string
+	TemplatePath  string
+
+	Files []*FilePath
+}
+
+type DocumentForUpdate struct {
+	Document Document
+}
+
+type DocumentForAdd struct{}
+
+func (s *Document) GetID() uint { return s.ID }
+
+func GetDocument(args map[string]string) (interface{}, error) {
+	var document Document
+	if err := DB().First(&document, args["id"]).Error; err != nil {
+		return nil, err
+	}
+	return &document, nil
+}
+
+func GetDocumentAll(args map[string]string) (interface{}, error) {
+	var document Document
+
+	id := args["id"]
+
+	if err := DB().Where("id = ?", id).Find(&document).Error; err != nil {
+		return nil, err
+	}
+
+	return &document, nil
+}
+
+func GetDocuments(args map[string]string) (interface{}, error) {
+	var documents []*Document
+	if err := DB().Order("name").Find(&documents).Error; err != nil {
+		return nil, err
+	}
+	return documents, nil
+}
+
+func GetDocumentsAll(args map[string]string) (interface{}, error) {
+	var documents []*Document
+	if err := DB().Order("name").Find(&documents).Error; err != nil {
+		return nil, err
+	}
+	return documents, nil
+}
+
+func SaveDocument(document interface{}) (interface{}, error) {
+	if err := DB().Save(document).Error; err != nil {
+		return nil, err
+	}
+	return document, nil
+}
+
+func UpdateDocument(args map[string]string, r *http.Request) (IDer, error) {
+	document, err := GetDocument(args)
+	if err != nil {
+		return nil, err
+	}
+
+	err = renderer.Decode(document, r)
+	if err != nil {
+		return nil, err
+	}
+
+	_, err = SaveDocument(document)
+	if err != nil {
+		return nil, err
+	}
+	document, err = GetDocument(args)
+	if err != nil {
+		return nil, err
+	}
+	return document.(*Document), nil
+}
+
+func AddDocument(args map[string]string, r *http.Request) (IDer, error) {
+	document := new(Document)
+	err := renderer.Decode(document, r)
+	if err != nil {
+		return nil, err
+	}
+	document, err = CreateDocument(document)
+	if err != nil {
+		return nil, err
+	}
+
+	return document, nil
+}
+
+func CreateDocument(document *Document) (*Document, error) {
+	if err := DB().Create(document).Error; err != nil {
+		return nil, err
+	}
+	return document, nil
+}
+
+func DeleteDocument(args map[string]string, r *http.Request) (IDer, error) {
+	document, err := GetDocument(args)
+	if err != nil {
+		return nil, err
+	}
+	if err := DB().Unscoped().Delete(document.(*Document)).Error; err != nil {
+		return nil, err
+	}
+	return document.(*Document), nil
+}
+
+func GetDocumentForUpdate(args map[string]string) (interface{}, error) {
+	var data DocumentForUpdate
+
+	id := args["id"]
+
+	if err := DB().First(&data.Document, id).Error; err != nil {
+		return nil, err
+	}
+
+	return data, nil
+}
+
+func GetDocumentForAdd(args map[string]string) (interface{}, error) {
+	var data DocumentForAdd
+
+	return data, nil
+}
+
+func (t *Document) RestAPIPath() string {
+	return "documents"
+}

+ 20 - 0
orm/mappings.go

@@ -89,6 +89,17 @@ var (
 		"/api/administratives/{id}":        GetAdministrativeAll,
 		"/api/administratives/{id}/update": GetAdministrative,
 		"/api/administratives/add/":        GetNothing,
+
+		// Documents
+		"/documents":             GetDocumentsAll,
+		"/documents/{id}":        GetDocumentAll,
+		"/documents/{id}/update": GetDocumentForUpdate,
+		"/documents/add/":        GetDocumentForAdd,
+
+		"/api/documents":             GetDocumentsAll,
+		"/api/documents/{id}":        GetDocumentAll,
+		"/api/documents/{id}/update": GetDocument,
+		"/api/documents/add/":        GetNothing,
 	}
 
 	Post map[string]PostFn = map[string]PostFn{
@@ -165,5 +176,14 @@ var (
 		"/api/administratives/{id}/update": UpdateAdministrative,
 		"/api/administratives/{id}/delete": DeleteAdministrative,
 		"/api/administratives/add/":        AddAdministrative,
+
+		// Documents
+		"/documents/{id}/update": UpdateDocument,
+		"/documents/{id}/delete": DeleteDocument,
+		"/documents/add/":        AddDocument,
+
+		"/api/documents/{id}/update": UpdateDocument,
+		"/api/documents/{id}/delete": DeleteDocument,
+		"/api/documents/add/":        AddDocument,
 	}
 )

+ 1 - 0
orm/orm.go

@@ -77,6 +77,7 @@ func AutoMigrate() {
 		&Student{},
 		&Office{},
 		&Administrative{},
+		&Document{},
 	).Error; err != nil {
 		panic(err)
 	}

+ 15 - 33
templates/documents.html.tpl

@@ -5,34 +5,13 @@
   <div class="karmen-info-header">
     <div class="row">
       <div class="col-md-8">
-	<h1>Documenti</h1>
+	<h1>Documenti ({{len .Data}})</h1>
       </div>
       <div class="col-md-4">
-	
-	<div class="btn-group float-right">
-	  
-	  <a href="/teachers/add" class="btn btn-primary">
-	    <span class="fa fa-plus-circle" aria-hidden="true"></span>
-	    Crea nuovo docente
-	  </a>
-	  
-	  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
-	    <span class="glyphicon glyphicon-floppy-open" aria-hidden="true"></span>
-	    Importa<span class="caret"></span>
-	  </button>
-	  
-	  <div class="dropdown-menu">
-	    <div class="container">  
-	      <form role="form" id="form_teachers_upload" action="/teachers/import" method="post" enctype="multipart/form-data">
-		<div class="form-group">
-		  <label class="control-label">Seleziona il file</label>
-		  <input id="input-1" type="file" class="file" data-show-preview="false" name="teachers_import">
-		</div>
-	      </form>
-	    </div>  
-	  </div>
-	</div>
-	
+	<a href="/documents/add/?{{query "tpl_layout" "base" "tpl_content" "documents_add_update"}}" class="btn btn-primary float-right">
+          <span class="fa fa-plus-circle" aria-hidden="true"></span>
+	  Crea nuovo documento
+	</a>
       </div>
     </div>
   </div>
@@ -42,18 +21,21 @@
     <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
   </div>
   
-  {{if not .Documents}}
+  {{if not .Data}}
   <p>Non c'è alcun elemento da visualizzare</p>
   {{else}}
   <div class="list-group" id="myUL">
-    {{range $document := .Documents}}
-    <a class="list-group-item list-group-item-action" href="/documents/{{$document.Config.Name}}">
-      <span class="fa fa-user"></span>
-      {{$document.Config.Name}}
+    {{range $document := .Data}}
+    <a class="list-group-item list-group-item-action" href="/documents/{{$document.ID}}?{{query "tpl_layout" "base" "tpl_content" "documents_show"}}">
+      <span class="fa fa-file"></span>
+      {{$document.Name}}
+      <div class="text-right">
+	<small>optional tag goes here</small>
+      </div>
     </a>
     {{end}}
-    {{end}}
   </div>
-
+  {{end}}
 </div>
+  
 {{ end }}

+ 59 - 0
templates/documents_add_update.html.tpl

@@ -0,0 +1,59 @@
+{{ define "content" }}
+
+<div class="container">
+
+  <nav aria-label="breadcrumb">
+  {{if .Options.Get "update"}}
+  <ol class="breadcrumb">
+    <li class="breadcrumb-item"><a href="/documents?{{query "tpl_layout" "base" "tpl_content" "documents"}}">Documento</a></li>
+    <li class="breadcrumb-item active"><a href="#">Aggiorna document</a></li>
+  </ol>
+  </nav>
+  
+  {{else}}
+  <nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+      <li class="breadcrumb-item"><a href="/documents?{{query "tpl_layout" "base" "tpl_content" "documents"}}">Documento</a></li>
+      <li class="breadcrumb-item active"><a href="#">Aggiungi</a></li>
+    </ol>
+  </nav>
+  {{end}}
+
+ {{if .Options.Get "update"}}
+  <div class="karmen-info-header">
+    <div class="row">
+      <div class="col-md-8">
+	<h1>Aggiorna document</h1>
+      </div>
+    </div>
+  </div>
+  
+  {{else}}
+  <h1 class="karmen-info-header">Crea nuovo documento</h1>
+  {{end}}
+
+  {{if .Options.Get "update"}}
+  <form id="form_documents_add_update" action="/documents/{{.Data.ID}}/update" method="POST" role="form" data-toggle="validator">
+  {{else}}
+  <form id="form_documents_add_update" action="/documents/add/" method="POST" role="form" data-toggle="validator">
+  {{end}}
+
+    <div class="form-group has-feedback">
+      <label class="control-label" for="document_name">Nome</label>
+      <input type="text" name="Name" class="form-control" id="document_name" placeholder="Nome" {{if .Options.Get "update"}} value="{{.Data.Name}}" {{end}} required>
+    </div>
+        
+    <div class="form-group">
+      <button type="submit" class="btn btn-primary">Salva</button>
+      {{if .Options.Get "update"}}
+      <a href="/documents/{{.Data.ID}}?{{query "tpl_layout" "base" "tpl_content" "documents_show"}}" class="btn btn-default">Annulla</a>
+      {{else}}
+      <a href="/documents?{{query "tpl_layout" "base" "tpl_content" "documents"}}" class="btn btn-default">Annulla</a>
+      {{end}}
+    </div>
+    
+  </form>
+
+</div>
+
+{{ end }}

+ 63 - 0
templates/documents_show.html.tpl

@@ -0,0 +1,63 @@
+{{ define "content" }}
+
+<div class="container">
+
+  <nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+      <li class="breadcrumb-item"><a href="/documents?{{query "tpl_layout" "base" "tpl_content" "documents"}}">Documenti</a></li>
+      <li class="breadcrumb-item active"><a href="#">{{.Data.Name}}</a></li>
+    </ol>
+  </nav>
+
+  <div class="karmen-info-header">
+    <div class="row">
+      <div class="col-md-8">
+	<h1>{{.Data.Name}}</h1>
+      </div>
+      <div class="col-md-4">
+
+	<div class="btn-group pull-right" role="group">
+	  <a href="/documents/add/?{{query "tpl_layout" "base" "tpl_content" "documents_add_update"}}" class="btn btn-success">
+	    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
+	    Crea
+	  </a>
+
+	  <a href="/documents/{{.Data.ID}}/update?{{query "tpl_layout" "base" "tpl_content" "documents_add_update" "update" "true"}}"  class="btn btn-primary">
+	    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
+	    Modifica
+	  </a>
+	  <button href="/documents/{{.Data.ID}}/delete"
+		  data-url="/documents/{{.Data.ID}}/delete"
+		  class="btn btn-danger karmen-ajax-delete">
+	    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
+	    Elimina
+	  </button>
+	</div>
+
+      </div>
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="col-md-12">
+      
+      <h2 class="karmen-relation-header">sub items</h2>
+      {{if .Data.Items}}
+      <div class="list-group" id="materie_list_group">
+    	<a href="/subjects/{{.Data.Subject.ID}}?{{query "tpl_layout" "base" "tpl_content" "subjects_show"}}" class="list-group-item clearfix">
+    	  <span class="glyphicon glyphicon-book"></span>
+    	  {{.Data.Subject.Name}}
+    	</a>
+      </div>
+      {{else}}
+      <p>All'attività non è associata alcuna materia
+    	didattica. Clicca <a href="/activities/update?{{query "tpl_layout" "base" "tpl_content" "activities_add_update"}}">qui</a> per
+    	modificare questa attività didattica.</p>
+      {{end}}
+    </div>
+    
+  </div>
+
+</div>    
+
+{{ end }}

+ 3 - 2
templates/layout/base.html.tpl

@@ -42,8 +42,9 @@
            <li class="nav-item">
 	     <a class="nav-item nav-link" href="/administratives?{{query "tpl_layout" "base" "tpl_content" "administratives"}}">Amministrativi</a>
 	   </li>
-
-
+           <li class="nav-item">
+	     <a class="nav-item nav-link" href="/documents?{{query "tpl_layout" "base" "tpl_content" "documents"}}">Documenti</a>
+	   </li>
 	  </ul>
 
 	  <ul class="nav navbar-nav navbar-right">