Compare commits
	
		
			4 Commits
		
	
	
		
			da77201a93
			...
			324a1c54d6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 324a1c54d6 | |||
| 15675d5e6c | |||
| 8ae3019b9c | |||
| b13eba8008 | 
							
								
								
									
										17
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.go
									
									
									
									
									
								
							| @@ -6,21 +6,12 @@ import ( | ||||
|  | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/db" | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/server" | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/types" | ||||
| ) | ||||
|  | ||||
| func writeBriefing(ch chan *types.Briefing, db *db.DB) { | ||||
| 	for b := range ch { | ||||
| 		db.WriteBriefing(b) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	var i, j int64 | ||||
|  | ||||
| 	i, j = 1, 1 | ||||
| 	mux := http.NewServeMux() | ||||
| 	cb := make(chan *types.Briefing) | ||||
|  | ||||
| 	db, err := db.Open("sicherheitsunterweisung") | ||||
| 	if err != nil { | ||||
| @@ -28,11 +19,11 @@ func main() { | ||||
| 	} | ||||
|  | ||||
| 	mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static/")))) | ||||
| 	mux.HandleFunc("/", server.DisplayForm(&i)) | ||||
| 	mux.HandleFunc("/", server.DisplayTable(db)) | ||||
| 	mux.HandleFunc("/submit/", server.SubmitForm(db, &i, &j)) | ||||
| 	mux.HandleFunc("/search/", server.DisplayResults(db)) | ||||
| 	mux.HandleFunc("/new-briefing/", server.DisplayForm(&i)) | ||||
| 	mux.HandleFunc("/add-participant/", server.AddParticipant(&i)) | ||||
| 	mux.HandleFunc("/submit/", server.SubmitForm(cb, &i, &j)) | ||||
|  | ||||
| 	go writeBriefing(cb, db) | ||||
|  | ||||
| 	log.Fatalln(http.ListenAndServe(":8080", mux)) | ||||
| } | ||||
|   | ||||
| @@ -86,6 +86,31 @@ func (db *DB) WriteBriefing(b *types.Briefing) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (db *DB) ReadAll() (*[]types.Briefing, error) { | ||||
| 	bs := make([]types.Briefing, 0) | ||||
|  | ||||
| 	rows, err := db.Query("SELECT *" + " FROM " + db.Name) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("*DB.ReadAll: db.Query(\"SELECT * FROM \"+db.Name): %v\n", err) | ||||
| 	} | ||||
| 	defer rows.Close() | ||||
|  | ||||
| 	for rows.Next() { | ||||
| 		b := new(types.Briefing) | ||||
| 		p := new(types.Participant) | ||||
|  | ||||
| 		if err := rows.Scan(&p.ID, &b.FirstName, &b.LastName, &b.Date, &b.Time, | ||||
| 			&b.State, &b.Location, &p.FirstName, &p.LastName, &p.Company); err != nil { | ||||
| 			return nil, fmt.Errorf("*DB.ReadAll: db.Query(): %v\n", err) | ||||
| 		} | ||||
|  | ||||
| 		b.Participants = append(b.Participants, *p) | ||||
| 		bs = append(bs, *b) | ||||
| 	} | ||||
|  | ||||
| 	return &bs, nil | ||||
| } | ||||
|  | ||||
| func (db *DB) ReadByName(name string) (*[]types.Briefing, error) { | ||||
| 	bs := make([]types.Briefing, 0) | ||||
|  | ||||
|   | ||||
| @@ -5,23 +5,45 @@ import ( | ||||
| 	"html/template" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/db" | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/types" | ||||
| ) | ||||
|  | ||||
| func DisplayTable(db *db.DB) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		bs, err := db.ReadAll() | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("DisplayTable: %v\n", err) | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/index.html", "templates/table.html")).Execute(w, bs) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func DisplayResults(db *db.DB) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		bs, err := db.ReadByName(r.PostFormValue("search")) | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("DisplayResults: db.ReadByName(r.PostFormValue()): %v\n", err) | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/table.html")).ExecuteTemplate(w, "rows", bs) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func DisplayForm(i *int64) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		template.Must(template.ParseFiles("templates/index.html")).Execute(w, i) | ||||
| 		template.Must(template.ParseFiles("templates/form.html")).ExecuteTemplate(w, "content", i) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func AddParticipant(i *int64) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		*i++ | ||||
| 		template.Must(template.ParseFiles("templates/index.html", "templates/participant.html")).ExecuteTemplate(w, "participant", i) | ||||
| 		template.Must(template.ParseFiles("templates/form.html")).ExecuteTemplate(w, "participant", i) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func SubmitForm(ch chan<- *types.Briefing, i, j *int64) http.HandlerFunc { | ||||
| func SubmitForm(db *db.DB, i, j *int64) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		b := new(types.Briefing) | ||||
|  | ||||
| @@ -44,6 +66,11 @@ func SubmitForm(ch chan<- *types.Briefing, i, j *int64) http.HandlerFunc { | ||||
| 		} | ||||
|  | ||||
| 		log.Println(b) | ||||
| 		ch <- b | ||||
| 		db.WriteBriefing(b) | ||||
| 		bs, err := db.ReadAll() | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("SubmitForm: db.ReadAll(): %v\n", err) | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/index.html", "templates/table.html")).Execute(w, bs) | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										56
									
								
								templates/form.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								templates/form.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| {{ define "participant" }} | ||||
| <div id="participant-{{ . }}"> | ||||
|   <label for="participant-first-input-{{ . }}">Vorname</label> | ||||
|   <input type="text" name="participant-first-{{ . }}" id="participant-first-input-{{ . }}" /> | ||||
|  | ||||
|   <label for="participant-last-input-{{ . }}">Nachname</label> | ||||
|   <input type="text" name="participant-last-{{ . }}" id="participant-last-input-{{ . }}" /> | ||||
|  | ||||
|   <label for="participant-company-input-{{ . }}">Firma</label> | ||||
|   <input type="text" name="participant-company-{{ . }}" id="participant-company-input-{{ . }}" /> | ||||
| </div> | ||||
| {{ end }} | ||||
|  | ||||
| {{ define "content" }} | ||||
| <form> | ||||
|   <div id="instructor"> | ||||
|     <label for="instructor-first-input">Unterweiser Vorname</label> | ||||
|     <input type="text" name="instructor-first" id="instructor-first-input" /> | ||||
|  | ||||
|     <label for="instructor-last-input">Unterweiser Nachname</label> | ||||
|     <input type="text" name="instructor-last" id="instructor-last-input" /> | ||||
|   </div> | ||||
|  | ||||
|   <div id="date"> | ||||
|     <label for="date-input">Datum</label> | ||||
|     <input type="date" name="date" id="date-input" /> | ||||
|   </div> | ||||
|  | ||||
|   <div id="time"> | ||||
|     <label for="time-input">Uhrzeit</label> | ||||
|     <input type="time" name="time" id="time-input" /> | ||||
|   </div> | ||||
|  | ||||
|   <div id="state"> | ||||
|     <label for="state-input">Stand vom</label> | ||||
|     <input type="date" name="state" id="state-input" /> | ||||
|   </div> | ||||
|  | ||||
|   <div id="location"> | ||||
|     <label for="location-input">Ort</label> | ||||
|     <input type="text" name="location" id="location-input" /> | ||||
|   </div> | ||||
|  | ||||
|   <div id="participants"> | ||||
|     <button type="button" hx-post="/add-participant/" hx-target="#participants" hx-swap="beforeend" hx-trigger="click"> | ||||
|       + | ||||
|     </button> | ||||
|  | ||||
|     {{ template "participant" . }} | ||||
|   </div> | ||||
|  | ||||
|   <button type="submit" hx-post="/submit/" hx-target="#content" hx-swap="innerHTML"> | ||||
|     Senden | ||||
|   </button> | ||||
| </form> | ||||
| {{ end }} | ||||
| @@ -11,57 +11,9 @@ | ||||
| <body> | ||||
|   <h1>Sicherheitsunterweisung</h1> | ||||
|  | ||||
|   <form> | ||||
|     <div id="instructor"> | ||||
|       <label for="instructor-first-input">Unterweiser Vorname</label> | ||||
|       <input type="text" name="instructor-first" id="instructor-first-input" /> | ||||
|  | ||||
|       <label for="instructor-last-input">Unterweiser Nachname</label> | ||||
|       <input type="text" name="instructor-last" id="instructor-last-input" /> | ||||
|     </div> | ||||
|  | ||||
|     <div id="date"> | ||||
|       <label for="date-input">Datum</label> | ||||
|       <input type="date" name="date" id="date-input" /> | ||||
|     </div> | ||||
|  | ||||
|     <div id="time"> | ||||
|       <label for="time-input">Uhrzeit</label> | ||||
|       <input type="time" name="time" id="time-input" /> | ||||
|     </div> | ||||
|  | ||||
|     <div id="state"> | ||||
|       <label for="state-input">Stand vom</label> | ||||
|       <input type="date" name="state" id="state-input" /> | ||||
|     </div> | ||||
|  | ||||
|     <div id="location"> | ||||
|       <label for="location-input">Ort</label> | ||||
|       <input type="text" name="location" id="location-input" /> | ||||
|     </div> | ||||
|  | ||||
|     <div id="participants"> | ||||
|       <button type="button" hx-post="/add-participant/" hx-target="#participants" hx-swap="beforeend" | ||||
|         hx-trigger="click"> | ||||
|         + | ||||
|       </button> | ||||
|  | ||||
|       <div id="participant-{{ . }}"> | ||||
|         <label for="participant-first-input-{{ . }}">Vorname</label> | ||||
|         <input type="text" name="participant-first-{{ . }}" id="participant-first-input-{{ . }}" /> | ||||
|  | ||||
|         <label for="participant-last-input-{{ . }}">Nachname</label> | ||||
|         <input type="text" name="participant-last-{{ . }}" id="participant-last-input-{{ . }}" /> | ||||
|  | ||||
|         <label for="participant-company-input-{{ . }}">Firma</label> | ||||
|         <input type="text" name="participant-company-{{ . }}" id="participant-company-input-{{ . }}" /> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <button type="submit" hx-post="/submit/"> | ||||
|       Senden | ||||
|     </button> | ||||
|   </form> | ||||
|   <div id="content"> | ||||
|     {{ template "content" . }} | ||||
|   </div> | ||||
|  | ||||
|   <script src="/static/js/htmx.min.js" type="text/javascript"></script> | ||||
| </body> | ||||
|   | ||||
| @@ -1,12 +0,0 @@ | ||||
| {{ define "participant" }} | ||||
| <div id="participant-{{ . }}"> | ||||
|   <label for="participant-first-input-{{ . }}">Vorname</label> | ||||
|   <input type="text" name="participant-first-{{ . }}" id="participant-first-input-{{ . }}" /> | ||||
|  | ||||
|   <label for="participant-last-input-{{ . }}">Nachname</label> | ||||
|   <input type="text" name="participant-last-{{ . }}" id="participant-last-input-{{ . }}" /> | ||||
|  | ||||
|   <label for="participant-company-input-{{ . }}">Firma</label> | ||||
|   <input type="text" name="participant-company-{{ . }}" id="participant-company-input-{{ . }}" /> | ||||
| </div> | ||||
| {{ end }} | ||||
							
								
								
									
										51
									
								
								templates/table.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								templates/table.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| {{ define "rows" }} | ||||
| {{ range . }} | ||||
| <tr> | ||||
|   <td>{{ .FirstName }}</td> | ||||
|   <td>{{ .LastName }}</td> | ||||
|   <td>{{ .Date }}</td> | ||||
|   <td>{{ .Time }}</td> | ||||
|   <td>{{ .State }}</td> | ||||
|   <td>{{ .Location }}</td> | ||||
|   {{ range .Participants }} | ||||
|   <td>{{ .FirstName }}</td> | ||||
|   <td>{{ .LastName }}</td> | ||||
|   <td>{{ .Company }}</td> | ||||
|   {{ end }} | ||||
| </tr> | ||||
| {{ end }} | ||||
| {{ end }} | ||||
|  | ||||
| {{ define "content" }} | ||||
| <form> | ||||
|   <label for="search-input">Suche</label> | ||||
|   <input type="text" name="search" id="search-input" /> | ||||
|   <button type="submit" hx-post="/search/" hx-target="#results" hx-swap="innerHTML"> | ||||
|     Suchen | ||||
|   </button> | ||||
| </form> | ||||
|  | ||||
| <form> | ||||
|   <button type="submit" hx-post="/new-briefing/" hx-target="#content" hx-swap="innerHTML"> | ||||
|     Neue Unterweisung | ||||
|   </button> | ||||
| </form> | ||||
|  | ||||
| <table> | ||||
|   <thead> | ||||
|     <tr> | ||||
|       <th colspan="2">Name Unterweiser</th> | ||||
|       <th>Datum</th> | ||||
|       <th>Uhrzeit</th> | ||||
|       <th>Stand</th> | ||||
|       <th>Ort</th> | ||||
|       <th colspan="2">Name Teilnehmer</th> | ||||
|       <th>Firma</th> | ||||
|     </tr> | ||||
|   </thead> | ||||
|  | ||||
|   <tbody id="results"> | ||||
|     {{ template "rows" . }} | ||||
|   </tbody> | ||||
| </table> | ||||
| {{ end }} | ||||
		Reference in New Issue
	
	Block a user