Browse Source

Fix Activity orm

Andrea Fazzi 5 năm trước cách đây
mục cha
commit
d07b099322

+ 1 - 0
main.go

@@ -36,6 +36,7 @@ var (
 		&orm.Department{},
 		&orm.Subject{},
 		&orm.Class{},
+		&orm.Student{},
 	}
 )
 

+ 110 - 134
orm/activity.go

@@ -31,29 +31,16 @@ type Activity struct {
 
 	Hours int
 
-	prevTeacherID uint
-}
-
-type ActivityForUpdate struct {
-	Activity Activity
-
-	AllClasses  []*Class
-	AllSubjects []*Subject
-	AllTeachers []*Teacher
-	AllStudents []*Student
-
-	SelectedStudent       map[uint]string
-	SelectedTeacher       map[uint]string
-	SelectedSupplyTeacher map[uint]string
-	SelectedSubject       map[uint]string
-	SelectedClass         map[uint]string
-}
-
-type ActivityForAdd struct {
-	AllClasses  []*Class
-	AllSubjects []*Subject
-	AllTeachers []*Teacher
-	AllStudents []*Student
+	AllClasses  []*Class   `gorm:"-"`
+	AllSubjects []*Subject `gorm:"-"`
+	AllTeachers []*Teacher `gorm:"-"`
+	AllStudents []*Student `gorm:"-"`
+
+	SelectedStudent       map[uint]string `gorm:"-"`
+	SelectedTeacher       map[uint]string `gorm:"-"`
+	SelectedSupplyTeacher map[uint]string `gorm:"-"`
+	SelectedSubject       map[uint]string `gorm:"-"`
+	SelectedClass         map[uint]string `gorm:"-"`
 }
 
 func (a *Activity) GetID() uint { return a.ID }
@@ -68,7 +55,7 @@ func (a *Activity) String() string {
 	}
 
 	if a.SupplyTeacher != nil {
-		result += fmt.Sprintf(" (S %s)", a.SupplyTeacher.String())
+		result += fmt.Sprintf(" (SUPPL %s)", a.SupplyTeacher.String())
 	}
 
 	result += " " + strconv.Itoa(a.Hours) + "h"
@@ -76,140 +63,140 @@ func (a *Activity) String() string {
 	return result
 }
 
-func GetActivity(args map[string]string) (interface{}, error) {
-	var activity Activity
-	if err := DB().First(&activity, args["id"]).Error; err != nil {
-		return nil, err
-	}
-	return &activity, nil
-}
+func (a *Activity) Create(args map[string]string, r *http.Request) (interface{}, error) {
+	if r.Method == "GET" {
+		activity := new(Activity)
 
-func GetActivityAll(args map[string]string) (interface{}, error) {
-	var activity Activity
+		if err := DB().Find(&activity.AllClasses).Error; err != nil {
+			return nil, err
+		}
 
-	id := args["id"]
+		if err := DB().Find(&activity.AllSubjects).Error; err != nil {
+			return nil, err
+		}
 
-	if err := DB().Preload("Student").Preload("Teacher").Preload("Subject").Preload("Class").First(&activity, id).Error; err != nil {
-		return nil, err
-	}
-	return &activity, nil
-}
+		if err := DB().Find(&activity.AllTeachers).Error; err != nil {
+			return nil, err
+		}
 
-func GetActivityForUpdate(args map[string]string) (interface{}, error) {
-	var data ActivityForUpdate
+		if err := DB().Find(&activity.AllStudents).Error; err != nil {
+			return nil, err
+		}
 
-	id := args["id"]
+		return activity, nil
+	} else {
+		activity := new(Activity)
+		err := renderer.Decode(activity, r)
+		if err != nil {
+			return nil, err
+		}
+		activity, err = CreateActivity(activity)
+		if err != nil {
+			return nil, err
+		}
 
-	if err := DB().Preload("SupplyTeacher").Preload("Teacher").Preload("Subject").Preload("Class").First(&data.Activity, id).Error; err != nil {
-		return nil, err
+		return activity, nil
 	}
-
-	if err := DB().Find(&data.AllClasses).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllSubjects).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllTeachers).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllStudents).Error; err != nil {
-		return nil, err
-	}
-
-	data.SelectedTeacher = make(map[uint]string)
-	data.SelectedTeacher[data.Activity.TeacherID] = "selected"
-
-	data.SelectedSupplyTeacher = make(map[uint]string)
-	data.SelectedSupplyTeacher[data.Activity.SupplyTeacherID] = "selected"
-
-	data.SelectedStudent = make(map[uint]string)
-	data.SelectedStudent[data.Activity.StudentID] = "selected"
-
-	data.SelectedClass = make(map[uint]string)
-	data.SelectedClass[data.Activity.ClassID] = "selected"
-
-	data.SelectedSubject = make(map[uint]string)
-	data.SelectedSubject[data.Activity.SubjectID] = "selected"
-	return data, nil
 }
 
-func GetActivityForAdd(args map[string]string) (interface{}, error) {
-	var data ActivityForAdd
-
-	if err := DB().Find(&data.AllClasses).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllSubjects).Error; err != nil {
-		return nil, err
-	}
+func (a *Activity) Read(args map[string]string, r *http.Request) (interface{}, error) {
+	var activity Activity
 
-	if err := DB().Find(&data.AllTeachers).Error; err != nil {
-		return nil, err
-	}
+	id := args["id"]
 
-	if err := DB().Find(&data.AllStudents).Error; err != nil {
+	if err := DB().Preload("Student").Preload("Teacher").Preload("Subject").Preload("Class").First(&activity, id).Error; err != nil {
 		return nil, err
 	}
 
-	return data, nil
+	return &activity, nil
 }
 
-func GetActivitiesAll(args map[string]string) (interface{}, error) {
+func (a *Activity) ReadAll(args map[string]string, r *http.Request) (interface{}, error) {
 	var activities []*Activity
+
 	if err := DB().Preload("Teacher").Preload("Subject").Preload("Class").Order("name").Find(&activities).Error; err != nil {
 		return nil, err
 	}
-	return activities, nil
-}
 
-func GetActivities(args map[string]string) (interface{}, error) {
-	var activities []*Activity
-	if err := DB().Order("surname,name").Find(&activities).Error; err != nil {
-		return nil, err
-	}
 	return activities, nil
 }
 
-func SaveActivity(activity interface{}) (interface{}, error) {
-	if err := DB().Save(activity).Error; err != nil {
-		return nil, err
+func (a *Activity) Update(args map[string]string, r *http.Request) (interface{}, error) {
+	if r.Method == "GET" {
+		result, err := a.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
+
+		activity := result.(*Activity)
+
+		if err := DB().Find(&activity.AllClasses).Error; err != nil {
+			return nil, err
+		}
+
+		if err := DB().Find(&activity.AllSubjects).Error; err != nil {
+			return nil, err
+		}
+
+		if err := DB().Find(&activity.AllTeachers).Error; err != nil {
+			return nil, err
+		}
+
+		if err := DB().Find(&activity.AllStudents).Error; err != nil {
+			return nil, err
+		}
+
+		activity.SelectedTeacher = make(map[uint]string)
+		activity.SelectedTeacher[activity.TeacherID] = "selected"
+
+		activity.SelectedSupplyTeacher = make(map[uint]string)
+		activity.SelectedSupplyTeacher[activity.SupplyTeacherID] = "selected"
+
+		activity.SelectedStudent = make(map[uint]string)
+		activity.SelectedStudent[activity.StudentID] = "selected"
+
+		activity.SelectedClass = make(map[uint]string)
+		activity.SelectedClass[activity.ClassID] = "selected"
+
+		activity.SelectedSubject = make(map[uint]string)
+		activity.SelectedSubject[activity.SubjectID] = "selected"
+
+		return activity, nil
+	} else {
+		activity, err := a.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
+		err = renderer.Decode(activity, r)
+		if err != nil {
+			return nil, err
+		}
+		_, err = SaveActivity(activity)
+		if err != nil {
+			return nil, err
+		}
+		activity, err = a.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
+
+		return activity.(*Activity), nil
 	}
-	return activity, nil
 }
 
-func UpdateActivity(args map[string]string, r *http.Request) (IDer, error) {
-	activity, err := GetActivity(args)
-	if err != nil {
-		return nil, err
-	}
-	err = renderer.Decode(activity, r)
+func (a *Activity) Delete(args map[string]string, r *http.Request) (interface{}, error) {
+	activity, err := a.Read(args, r)
 	if err != nil {
 		return nil, err
 	}
-	_, err = SaveActivity(activity)
-	if err != nil {
-		return nil, err
-	}
-	activity, err = GetActivity(args)
-	if err != nil {
+	if err := DB().Unscoped().Delete(activity.(*Activity)).Error; err != nil {
 		return nil, err
 	}
 	return activity.(*Activity), nil
 }
 
-func AddActivity(args map[string]string, r *http.Request) (IDer, error) {
-	activity := new(Activity)
-	err := renderer.Decode(activity, r)
-	if err != nil {
-		return nil, err
-	}
-	activity, err = CreateActivity(activity)
-	if err != nil {
+func SaveActivity(activity interface{}) (interface{}, error) {
+	if err := DB().Save(activity).Error; err != nil {
 		return nil, err
 	}
 	return activity, nil
@@ -221,14 +208,3 @@ func CreateActivity(activity *Activity) (*Activity, error) {
 	}
 	return activity, nil
 }
-
-func DeleteActivity(args map[string]string, r *http.Request) (IDer, error) {
-	activity, err := GetActivity(args)
-	if err != nil {
-		return nil, err
-	}
-	if err := DB().Unscoped().Delete(activity.(*Activity)).Error; err != nil {
-		return nil, err
-	}
-	return activity.(*Activity), nil
-}

+ 90 - 119
orm/student.go

@@ -10,9 +10,13 @@ import (
 type Student struct {
 	Credential
 
-	Handicap bool `schema:"Handicap" sql:"default: false"`
-	DSA      bool `schema:"DSA" sql:"default: false"`
-	BES      bool `schema:"BES" sql:"default: false"`
+	// Handicap bool `schema:"Handicap" sql:"default: false"`
+	// DSA      bool `schema:"DSA" sql:"default: false"`
+	// BES      bool `schema:"BES" sql:"default: false"`
+
+	Handicap bool
+	DSA      bool
+	BES      bool
 
 	TutorID uint `schema:"tutor_id"`
 	ClassID uint `schema:"class_id"`
@@ -21,20 +25,12 @@ type Student struct {
 	Tutor      *Teacher
 	Teachers   []*Teacher
 	Activities []*Activity
-}
 
-type StudentForUpdate struct {
-	Student     Student
-	AllClasses  []*Class
-	AllTeachers []*Teacher
+	AllClasses  []*Class   `gorm:"-"`
+	AllTeachers []*Teacher `gorm:"-"`
 
-	SelectedClass   map[uint]string
-	SelectedTeacher map[uint]string
-}
-
-type StudentForAdd struct {
-	AllClasses  []*Class
-	AllTeachers []*Teacher
+	SelectedClass   map[uint]string `gorm:"-"`
+	SelectedTeacher map[uint]string `gorm:"-"`
 }
 
 var (
@@ -48,15 +44,33 @@ WHERE student_id=?
 func (s *Student) GetID() uint    { return s.ID }
 func (s *Student) String() string { return s.CompleteName() }
 
-func GetStudent(args map[string]string) (interface{}, error) {
-	var student Student
-	if err := DB().First(&student, args["id"]).Error; err != nil {
-		return nil, err
-	}
-	return &student, nil
-}
-
-func GetStudentAll(args map[string]string) (interface{}, error) {
+func (s *Student) Create(args map[string]string, r *http.Request) (interface{}, error) {
+	if r.Method == "GET" {
+		student := new(Student)
+		if err := DB().Find(&student.AllTeachers).Error; err != nil {
+			return nil, err
+		}
+		if err := DB().Find(&student.AllClasses).Error; err != nil {
+			return nil, err
+		}
+
+		return student, nil
+	} else {
+		student := new(Student)
+		err := renderer.Decode(student, r)
+		if err != nil {
+			return nil, err
+		}
+		student, err = CreateStudent(student)
+		if err != nil {
+			return nil, err
+		}
+
+		return student, nil
+	}
+}
+
+func (s *Student) Read(args map[string]string, r *http.Request) (interface{}, error) {
 	var student Student
 
 	id := args["id"]
@@ -72,24 +86,9 @@ func GetStudentAll(args map[string]string) (interface{}, error) {
 	return &student, nil
 }
 
-func GetStudents(args map[string]string) (interface{}, error) {
+func (s *Student) ReadAll(args map[string]string, r *http.Request) (interface{}, error) {
 	var students []*Student
-	if err := DB().Order("surname,name").Find(&students).Error; err != nil {
-		return nil, err
-	}
-	return students, nil
-}
-
-func GetStudentsFast(args map[string]string) (interface{}, error) {
-	var students []*Student
-	if err := DB().Preload("Class").Order("surname,name").Find(&students).Error; err != nil {
-		return nil, err
-	}
-	return students, nil
-}
 
-func GetStudentsAll(args map[string]string) (interface{}, error) {
-	var students []*Student
 	if err := DB().Preload("Class").Preload("Class.Coordinator").Preload("Tutor").Order("surname,name").Find(&students).Error; err != nil {
 		return nil, err
 	}
@@ -99,66 +98,64 @@ func GetStudentsAll(args map[string]string) (interface{}, error) {
 	for _, student := range students {
 		student.GetActivities()
 	}
+
 	return students, nil
 }
 
-func SaveStudent(student interface{}) (interface{}, error) {
-	if err := DB().Omit("Class", "Tutor", "Teachers", "Activities").Save(student).Error; err != nil {
-		return nil, err
-	}
-	return student, nil
-}
+func (s *Student) Update(args map[string]string, r *http.Request) (interface{}, error) {
+	if r.Method == "GET" {
+		result, err := s.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
 
-func UpdateStudent(args map[string]string, r *http.Request) (IDer, error) {
-	student, err := GetStudent(args)
-	if err != nil {
-		return nil, err
-	}
+		student := result.(*Student)
 
-	// FIXME: Should not be hard set.
-	student.(*Student).Handicap = false
-	student.(*Student).DSA = false
-	student.(*Student).BES = false
+		if err := DB().Find(&student.AllTeachers).Error; err != nil {
+			return nil, err
+		}
 
-	err = renderer.Decode(student, r)
-	if err != nil {
-		return nil, err
-	}
+		if err := DB().Find(&student.AllClasses).Error; err != nil {
+			return nil, err
+		}
 
-	_, err = SaveStudent(student)
-	if err != nil {
-		return nil, err
-	}
-	student, err = GetStudent(args)
-	if err != nil {
-		return nil, err
-	}
-	return student.(*Student), nil
-}
+		student.SelectedTeacher = make(map[uint]string)
+		student.SelectedTeacher[student.TutorID] = "selected"
 
-func AddStudent(args map[string]string, r *http.Request) (IDer, error) {
-	student := new(Student)
-	err := renderer.Decode(student, r)
-	if err != nil {
-		return nil, err
-	}
-	student, err = CreateStudent(student)
-	if err != nil {
-		return nil, err
-	}
+		student.SelectedClass = make(map[uint]string)
+		student.SelectedClass[student.ClassID] = "selected"
 
-	return student, nil
-}
+		return student, nil
+	} else {
+		student, err := s.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
 
-func CreateStudent(student *Student) (*Student, error) {
-	if err := DB().Create(student).Error; err != nil {
-		return nil, err
+		// FIXME: Should not be hard set.
+		student.(*Student).Handicap = false
+		student.(*Student).DSA = false
+		student.(*Student).BES = false
+
+		err = renderer.Decode(student, r)
+		if err != nil {
+			return nil, err
+		}
+		_, err = SaveStudent(student)
+		if err != nil {
+			return nil, err
+		}
+		student, err = s.Read(args, r)
+		if err != nil {
+			return nil, err
+		}
+
+		return student.(*Student), nil
 	}
-	return student, nil
 }
 
-func DeleteStudent(args map[string]string, r *http.Request) (IDer, error) {
-	student, err := GetStudent(args)
+func (s *Student) Delete(args map[string]string, r *http.Request) (interface{}, error) {
+	student, err := s.Read(args, r)
 	if err != nil {
 		return nil, err
 	}
@@ -168,44 +165,18 @@ func DeleteStudent(args map[string]string, r *http.Request) (IDer, error) {
 	return student.(*Student), nil
 }
 
-func GetStudentForUpdate(args map[string]string) (interface{}, error) {
-	var data StudentForUpdate
-
-	id := args["id"]
-
-	if err := DB().Preload("Class").First(&data.Student, id).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllClasses).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllTeachers).Error; err != nil {
+func SaveStudent(student interface{}) (interface{}, error) {
+	if err := DB().Omit("Class", "Tutor", "Teachers", "Activities").Save(student).Error; err != nil {
 		return nil, err
 	}
-
-	data.SelectedClass = make(map[uint]string)
-	data.SelectedClass[data.Student.ClassID] = "selected"
-
-	data.SelectedTeacher = make(map[uint]string)
-	data.SelectedTeacher[data.Student.TutorID] = "selected"
-
-	return data, nil
+	return student, nil
 }
 
-func GetStudentForAdd(args map[string]string) (interface{}, error) {
-	var data StudentForAdd
-
-	if err := DB().Find(&data.AllClasses).Error; err != nil {
-		return nil, err
-	}
-
-	if err := DB().Find(&data.AllTeachers).Error; err != nil {
+func CreateStudent(student *Student) (*Student, error) {
+	if err := DB().Create(student).Error; err != nil {
 		return nil, err
 	}
-
-	return data, nil
+	return student, nil
 }
 
 func (s *Student) GetTeachers() ([]*Teacher, error) {

+ 4 - 4
orm/subject.go

@@ -26,8 +26,8 @@ type Subject struct {
 	Teachers   []*Teacher
 	Activities []*Activity
 
-	AllDepartments     []*Department   `gorm:"-"`
-	SelectedDepartment map[uint]string `gorm:"-"`
+	AllDepartments []*Department   `gorm:"-"`
+	Selected       map[uint]string `gorm:"-"`
 }
 
 func (s *Subject) GetID() uint    { return s.ID }
@@ -95,8 +95,8 @@ func (s *Subject) Update(args map[string]string, r *http.Request) (interface{},
 			return nil, err
 		}
 
-		subject.SelectedDepartment = make(map[uint]string)
-		subject.SelectedDepartment[subject.DepartmentID] = "selected"
+		subject.Selected = make(map[uint]string)
+		subject.Selected[subject.DepartmentID] = "selected"
 
 		return subject, nil
 	} else {

+ 1 - 1
templates/classes_show.html.tpl

@@ -27,7 +27,7 @@
       {{$options := `
       title: "Attività associate alla classe"
       model: "Activity"
-      icon: "fa fa-business"
+      icon: "fa fa-business-time"
       `}}
       
       {{$noElements := "Nessuna attività associata alla classe."}}

+ 1 - 1
templates/layout/checkbox.html.tpl

@@ -4,7 +4,7 @@
          name="{{.options.name}}"
          class="form-check-input"
          id="{{.options.id}}"
-         {{if .update}} value="{{.value}}" {{end}} {{.options.required}}>
+         {{if .update}}{{if eq true .value}}checked{{end}}{{end}} {{.options.required}}>
   <label class="form-check-label" for="{{.options.id}}">{{.options.label}}</label>
 </div>
 {{end}}

+ 19 - 33
templates/students.html.tpl

@@ -1,48 +1,34 @@
 {{ define "content" }}
 
-<div class="container">
-  
-  <div class="karmen-info-header">
-    <div class="row">
-      <div class="col-md-8">
-	<h1>Studenti ({{len .Data}})</h1>
-      </div>
-      <div class="col-md-4">
-	<a href="/students/add/?{{query "tpl_layout" "base" "tpl_content" "students_add_update"}}" class="btn btn-primary float-right">
-	  <span class="fa fa-plus-circle" aria-hidden="true"></span>
-	  Crea nuovo studente
-	</a>
-      </div>
-    </div>
-  </div>
+<div class="container">  
 
-  <div class="input-group" style="margin-bottom: 20px">
-    <span class="input-group-addon" id="search-query"><span class="glyphicon glyphicon-search"></span></span>
-    <input type="text" id="myInput" class="form-control" aria-describedby="search-query">
-  </div>
+  {{$options := `
+  title: "Studenti"
+  buttonTitle: "Crea nuovo studente"
+  `}}
   
-  {{if not .Data}}
-  <p>Non c'è alcun elemento da visualizzare</p>
+  {{template "read_all_header" dict  "options" ($options | yaml) "lengthData" (len .Data) "modelPath" (create "Student")}}
+  {{template "search_input"}}
+    
+  {{if not .}}
+  {{template "display_no_elements"}}
   {{else}}
   <div class="list-group" id="myUL">
     {{range $student := .Data}}
-    <a class="list-group-item list-group-item-action" href="/students/{{$student.ID}}?{{query "tpl_layout" "base" "tpl_content" "students_show"}}">
+    <a class="list-group-item list-group-item-action" href={{$student.ID|show "Student"}}>
       <span class="fa fa-user"></span>
-      {{$student.Surname}} {{$student.Name}}
-      {{if $student.Class}}
-      <div class="text-right">
-	<small>{{$student.Class.Name}}</small>
-      </div>
-      {{else}}
+      {{$student|string}}
       <div class="text-right">
-	<small>no classe</small>
+        {{$options := `noElements: "no classe"`}}
+        {{template "small" dict "options" ($options | yaml) "data" $student.Class}}
       </div>
-
-      {{end}}
     </a>
     {{end}}
+    {{end}}
   </div>
-  {{end}}
+
 </div>
-  
+
 {{ end }}
+
+

+ 30 - 89
templates/students_add_update.html.tpl

@@ -2,108 +2,49 @@
 
 <div class="container">
 
-  {{if .Options.Get "update"}}
-  <ol class="breadcrumb">
-    <li><a href="/students?{{query "tpl_layout" "base" "tpl_content" "students"}}">Studente</a></li>
-    <li class="active"><a href="#">Aggiorna studente</a></li>
-  </ol>  
-  {{else}}
-  <ol class="breadcrumb">
-    <li><a href="/students?{{query "tpl_layout" "base" "tpl_content" "students"}}">Studente</a></li>
-    <li class="active"><a href="#">Aggiungi</a></li>
-  </ol>
-  {{end}}
+  {{$update := .Options.Get "update"}}
 
- {{if .Options.Get "update"}}
-  <div class="karmen-info-header">
-    <div class="row">
-      <div class="col-md-8">
-	<h1>Aggiorna studente</h1>
-      </div>
-    </div>
-  </div>
-  
+  {{if $update}}
+  {{template "breadcrumb" toSlice "Studenti" (all "Student") (.Data|string) (.Data.ID|show "Student") "Aggiorna" "current"}}
   {{else}}
-  <h1 class="karmen-info-header">Crea nuovo studente</h1>
+  {{template "breadcrumb" toSlice "Studenti" (all "Student") "Aggiungi" "current"}}
   {{end}}
+  
+  {{template "add_update_header" dict "update" $update "addTitle" "Crea nuovo studente" "updateTitle" (printf "Aggiorna studente %s" (.Data|string))}}
 
-  {{if .Options.Get "update"}}
-  <form id="form_students_add_update" action="/students/{{.Data.Student.ID}}/update" method="POST" role="form" class="needs-validation">
-  {{else}}
-  <form id="form_students_add_update" action="/students/add/" method="POST" role="form" class="needs-validation">
-  {{end}}
+  {{$form := "form_students_add_update"}}
+  <form
+    class="needs-validation"
+    action="{{if $update}}{{.Data.ID|update "Student"}}{{else}}{{create "Student"}}{{end}}"
+    method="POST"
+    role="form"
+    id={{$form}}>
 
-    <div class="form-group">
-      <label class="control-label" for="student_name">Nome</label>
-      <input type="text" name="Name" class="form-control" id="student_name" placeholder="Nome" {{if .Options.Get "update"}} value="{{.Data.Student.Name}}" {{end}} required>
-    </div>
+    {{$options := ` { name: "Name",id: "student_name",label: "Nome",placeholder: "Nome",type: "text",required: "true"} `}}
+    {{template "input" dict "options" ($options|yaml) "value" (.Data|field "Name") "update" $update}}
 
-    <div class="form-group">
-      <label class="control-label" for="student_surname">Cognome</label>
-      <input type="text" name="Surname" class="form-control" id="student_surname" placeholder="Cognome" {{if .Options.Get "update"}} value="{{.Data.Student.Surname}}" {{end}} required>
-    </div>
+    {{$options := ` { name: "Surname",id: "student_surname",label: "Cognome",placeholder: "Cognome",type: "text",required: "true"} `}}
+    {{template "input" dict "options" ($options|yaml) "value" (.Data|field "Surname") "update" $update}}
 
-    <div class="form-group">
-      <label class="control-label" for="class_id">Classe</label>
-      <select name="class_id" class="form-control selectpicker" id="class_id" placeholder="Classe" data-live-search="true" form="form_students_add_update" title="Seleziona la classe" data-dropup-auto="false" required>
-    	<option value="0"></option>
-    	{{range $class := .Data.AllClasses}}
-    	{{if $.Options.Get "update"}}
-    	<option
-    	   value="{{$class.ID}}"
-    	   {{index $.Data.SelectedClass $class.ID}}>{{$class.Name}}
-    	</option>
-    	{{else}}
-    	<option value="{{$class.ID}}">{{$class.Name}}</option>
-    	{{end}}
-    	{{end}}
-      </select>
-    </div>
+    {{$options := ` { name: "class_id", id: "class_id", label: "Classe", title: "Seleziona la classe"}`}}
+    {{template "select" dict "options" ($options|yaml) "data" (.Data|field "AllClasses") "selected" (.Data|field "SelectedClass") "update" $update "form" $form}}
 
-    <div class="form-group form-check">
-      <input type="checkbox" name="Handicap" class="form-check-input" id="student_handicap" {{if .Options.Get "update"}}{{if .Data.Student.Handicap}}checked{{end}}{{end}}>
-      <label class="form-check-label has-feedback" for="student_handicap">Handicap (L. 104/92)</label>
-    </div>
+    {{$options := ` { name: "tutor_id", id: "tutor_id", label: "Docente tutor", title: "Seleziona il docente tutor"}`}}
+    {{template "select" dict "options" ($options|yaml) "data" (.Data|field "AllTeachers") "selected" (.Data|field "SelectedTeacher") "update" $update "form" $form}}
 
-    <div class="form-group form-check">
-      <input type="checkbox" name="DSA" class="form-check-input" id="student_dsa" {{if .Options.Get "update"}}{{if .Data.Student.DSA}}checked{{end}}{{end}}>
-      <label class="form-check-label has-feedback" for="student_dsa">DSA (L. 170/10)</label>
-    </div>
+    {{$options := ` { name: "Handicap",id: "student_handicap",label: "Handicap (L. 104/92)",formClass: "form-group form-check" } `}}
+    {{template "checkbox" dict "options" ($options|yaml) "value" (.Data|field "Handicap") "update" $update}}
 
-    <div class="form-group form-check">
-      <input type="checkbox" name="BES" class="form-check-input" id="student_bes" {{if .Options.Get "update"}}{{if .Data.Student.BES}}checked{{end}}{{end}}>
-      <label class="form-check-label has-feedback" for="student_bes">BES (L. 170/10)</label>
-    </div>
+    {{$options := ` { name: "DSA",id: "student_dsa",label: "DSA (L. 170/10)",formClass: "form-group form-check" } `}}
+    {{template "checkbox" dict "options" ($options|yaml) "value" (.Data|field "DSA") "update" $update}}
 
-    <div class="form-group">
-      <label class="control-label" for="class_id">Docente tutor</label>
-      <select name="tutor_id" class="form-control selectpicker" id="tutor_id" placeholder="Docente tutor" data-live-search="true" form="form_students_add_update" title="Seleziona il docente tutor" data-dropup-auto="false">
-    	<option value="0"></option>
-    	{{range $teacher := .Data.AllTeachers}}
-    	{{if $.Options.Get "update"}}
-    	<option
-    	   value="{{$teacher.ID}}"
-    	   {{index $.Data.SelectedTeacher $teacher.ID}}>{{$teacher.Surname}} {{$teacher.Name}}
-    	</option>
-    	{{else}}
-    	<option value="{{$teacher.ID}}">{{$teacher.Surname}} {{$teacher.Name}}</option>
-    	{{end}}
-    	{{end}}
-      </select>
-    </div>
+    {{$options := ` { name: "BES",id: "student_bes",label: "BES (L. 170/10)",formClass: "form-group form-check" } `}}
+    {{template "checkbox" dict "options" ($options|yaml) "value" (.Data|field "BES") "update" $update}}
 
-    
-    <div class="form-group">
-      <button type="submit" class="btn btn-primary">Salva</button>
-      {{if .Options.Get "update"}}
-      <a href="/students/{{.Data.Student.ID}}?{{query "tpl_layout" "base" "tpl_content" "students_show"}}" class="btn btn-default">Annulla</a>
-      {{else}}
-      <a href="/students?{{query "tpl_layout" "base" "tpl_content" "students"}}" class="btn btn-default">Annulla</a>
-      {{end}}
-    </div>
-    
+    {{ $options := ` { cancelTitle: "Annulla", saveTitle: "Salva", model: "Student"} ` }}
+    {{template "submit_cancel_buttons" dict "options" ($options|yaml) "id" (.Data|field "ID") "update" $update}}  
   </form>
-
+  
 </div>
 
 {{ end }}

+ 20 - 56
templates/students_show.html.tpl

@@ -2,67 +2,31 @@
 
 <div class="container">
 
-  <nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-      <li class="active"><a href="/students?{{query "tpl_layout" "base" "tpl_content" "students"}}">Studenti</a></li>
-      <li class="breadcrumb-item active"><a href="#">{{.Data.Surname}} {{.Data.Name}}</a></li>
-    </ol>
-  </nav>
-
-  <div class="karmen-info-header">
-    <div class="row">
-      <div class="col-md-8">
-	<h1>{{.Data.Surname}} {{.Data.Name}}</h1>
-      </div>
-      <div class="col-md-4">
-
-	<div class="btn-group float-right" role="group">
-	  <a href="/students/add/?{{query "tpl_layout" "base" "tpl_content" "students_add_update"}}" class="btn btn-success">
-	    <span class="fa fa-edit" aria-hidden="true"></span>
-	    Crea
-	  </a>
-
-	  <a href="/students/{{.Data.ID}}/update?{{query "tpl_layout" "base" "tpl_content" "students_add_update" "update" "true"}}"  class="btn btn-primary">
-	    <span class="fa fa-edit" aria-hidden="true"></span>
-	    Modifica
-	  </a>
-	  <button href="/students/{{.Data.ID}}/delete"
-		  data-url="/students/{{.Data.ID}}/delete"
-		  class="btn btn-danger karmen-ajax-delete">
-	    <span class="fa fa-trash" aria-hidden="true"></span>
-	    Elimina
-	  </button>
-	</div>
-
-      </div>
-    </div>
-  </div>
-
+  {{template "breadcrumb" toSlice "Studenti" (all "Student") (.Data|string) "current"}}
+  {{template "show_header" dict "title" (.Data|string) "updatePath" (.Data.ID|update "Student") "deletePath" (.Data.ID|delete "Student")}}
+
+  <h2 class="karmen-relation-header">Informazioni generali</h2>
+  {{if .Data.Class}}
+  <p>Lo studente appartiene alla classe {{(.Data.Class.ID|show "Class")|anchor (.Data.Class|string)}}.</p>
+  {{else}}
+  <p>Questo studente non appartiene a nessuna classe. Clicca {{(.Data.ID|update "Student")|anchor "qui"}} per associare una classe allo studente.</p>
+  {{end}}
+  
   <div class="row">
     <div class="col-md-12">
 
-
-      <h2 class="karmen-relation-header">Attività associate all'allievo</h2>
-      <div class="list-group" id="classes_list_group">
-	{{if not .Data.Activities}}
-	<p>All'allievo non è associata alcuna attività
-	  didattica. Clicca <a href="/activities/add?{{query "tpl_content" "activities_add_show" "tpl_layout" "base"}}">qui</a> per creare
-	  una nuova attività didattica da associare all'allievo.</p>
-	{{else}}
-	{{range $activity := .Data.Activities}}
-	<a href="/activities/{{$activity.ID}}?{{query "tpl_layout" "base" "tpl_content" "activities_show"}}" class="list-group-item list-group-item-action">
-	  <span class="fa fa-user"></span>
-	  {{if $activity.Teacher}}{{$activity.Teacher.Surname}} {{$activity.Teacher.Name}}{{else}}no docente{{end}}
-	  <div class="text-right">
-	    <small>{{if $activity.Class}}{{$activity.Class.Name}}{{else}}no classe{{end}}  {{if $activity.Subject}}{{$activity.Subject.Name}}{{else}}no materia{{end}} {{$activity.Hours}}h</small>
-	  </div>
-	</a>
-	{{end}}
-	{{end}}
-      </div>
+      {{$options := `
+      title: "Attività associate allo studente"
+      model: "Activity"
+      icon: "fa fa-business-time"
+      `}}
+      
+      {{$noElements := "Nessuna attività associata allo studente."}}
+      {{template "relation_list" dict "options" ($options|yaml) "data" .Data.Activities "noElements" $noElements "small" (toSlice "Teacher")}}
     
+    </div>
   </div>
-
+  
 </div>    
 
 {{ end }}