Compare commits
	
		
			8 Commits
		
	
	
		
			324a1c54d6
			...
			dateien_ho
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ea8bf5e38e | |||
| 08fb23d0f5 | |||
| 6972948ee3 | |||
| fc7aae83d2 | |||
| 2b119f6752 | |||
| c04932383e | |||
| 8ea0c2964a | |||
| 519dc82023 | 
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @@ -4,6 +4,7 @@ go 1.21.1 | ||||
|  | ||||
| require ( | ||||
| 	github.com/go-sql-driver/mysql v1.7.1 | ||||
| 	github.com/google/uuid v1.3.1 | ||||
| 	golang.org/x/term v0.13.0 | ||||
| ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @@ -1,5 +1,7 @@ | ||||
| github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= | ||||
| github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= | ||||
| github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= | ||||
| github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= | ||||
| golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= | ||||
|   | ||||
							
								
								
									
										2
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.go
									
									
									
									
									
								
							| @@ -20,10 +20,10 @@ func main() { | ||||
|  | ||||
| 	mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static/")))) | ||||
| 	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(db, &i, &j)) | ||||
|  | ||||
| 	log.Fatalln(http.ListenAndServe(":8080", mux)) | ||||
| } | ||||
|   | ||||
| @@ -37,6 +37,12 @@ func getCredentials() (string, string, error) { | ||||
| 	return strings.TrimSpace(user), strings.TrimSpace(pass), nil | ||||
| } | ||||
|  | ||||
| func reverseOrder(bs *[]types.Briefing) { | ||||
| 	for i, j := 0, len(*bs)-1; i < j; i, j = i+1, j-1 { | ||||
| 		(*bs)[i], (*bs)[j] = (*bs)[j], (*bs)[i] | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func Open(dbName string) (*DB, error) { | ||||
| 	var err error | ||||
| 	db := new(DB) | ||||
| @@ -63,18 +69,18 @@ func Open(dbName string) (*DB, error) { | ||||
| func (db *DB) WriteBriefing(b *types.Briefing) error { | ||||
| 	for i := 0; i < len(b.Participants); i++ { | ||||
| 		result, err := db.Exec("INSERT INTO "+db.Name+" (instructor_first,"+ | ||||
| 			"instructor_last, date, time, state, location, participant_first,"+ | ||||
| 			"participant_last, company) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", | ||||
| 			" instructor_last, date, time, state, location, participant_first,"+ | ||||
| 			" participant_last, company) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", | ||||
| 			b.FirstName, b.LastName, b.Date, b.Time, b.State, b.Location, | ||||
| 			b.Participants[i].FirstName, b.Participants[i].LastName, | ||||
| 			b.Participants[i].Company) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("*DB.WriteBriefing: db.Exec(\"INSERT INTO"+ | ||||
| 				"\"+db.Name+\" (instructor_first, instructor_last, date, time, state,"+ | ||||
| 				"location, participant_first, participant_last, company) VALUES (?, ?,"+ | ||||
| 				"?, ?, ?, ?, ?, ?, ?)\", b.FirstName, b.LastName, b.Date, b.Time,"+ | ||||
| 				"b.State, b.Location, b.Participants[i].FirstName,"+ | ||||
| 				"b.Participants[i].LastName, b.Participants[i].Company): %v\n", err) | ||||
| 				" \"+db.Name+\" (instructor_first, instructor_last, date, time, state,"+ | ||||
| 				" location, participant_first, participant_last, company) VALUES (?, ?,"+ | ||||
| 				" ?, ?, ?, ?, ?, ?, ?)\", b.FirstName, b.LastName, b.Date, b.Time,"+ | ||||
| 				" b.State, b.Location, b.Participants[i].FirstName,"+ | ||||
| 				" b.Participants[i].LastName, b.Participants[i].Company): %v\n", err) | ||||
| 		} | ||||
|  | ||||
| 		_, err = result.LastInsertId() | ||||
| @@ -108,6 +114,7 @@ func (db *DB) ReadAll() (*[]types.Briefing, error) { | ||||
| 		bs = append(bs, *b) | ||||
| 	} | ||||
|  | ||||
| 	reverseOrder(&bs) | ||||
| 	return &bs, nil | ||||
| } | ||||
|  | ||||
| @@ -145,5 +152,6 @@ func (db *DB) ReadByName(name string) (*[]types.Briefing, error) { | ||||
| 		bs = append(bs, *b) | ||||
| 	} | ||||
|  | ||||
| 	reverseOrder(&bs) | ||||
| 	return &bs, nil | ||||
| } | ||||
|   | ||||
| @@ -2,10 +2,12 @@ package server | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/google/uuid" | ||||
| 	"html/template" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"os" | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/db" | ||||
| 	"streifling.com/jason/sicherheitsunterweisung/packages/types" | ||||
| ) | ||||
| @@ -15,6 +17,7 @@ func DisplayTable(db *db.DB) http.HandlerFunc { | ||||
| 		bs, err := db.ReadAll() | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("DisplayTable: %v\n", err) | ||||
| 			return | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/index.html", "templates/table.html")).Execute(w, bs) | ||||
| 	} | ||||
| @@ -25,6 +28,7 @@ func DisplayResults(db *db.DB) http.HandlerFunc { | ||||
| 		bs, err := db.ReadByName(r.PostFormValue("search")) | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("DisplayResults: db.ReadByName(r.PostFormValue()): %v\n", err) | ||||
| 			return | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/table.html")).ExecuteTemplate(w, "rows", bs) | ||||
| 	} | ||||
| @@ -70,7 +74,33 @@ func SubmitForm(db *db.DB, i, j *int64) http.HandlerFunc { | ||||
| 		bs, err := db.ReadAll() | ||||
| 		if err != nil { | ||||
| 			_ = fmt.Errorf("SubmitForm: db.ReadAll(): %v\n", err) | ||||
| 			return | ||||
| 		} | ||||
| 		template.Must(template.ParseFiles("templates/index.html", "templates/table.html")).Execute(w, bs) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func Upload(fn, ln, d, t string) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		r.ParseMultipartForm(10 << 20) // 10 MiB | ||||
|  | ||||
| 		tmpFile, _, err := r.FormFile("questionaire") | ||||
| 		if err != nil { | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| 			return | ||||
| 		} | ||||
| 		defer tmpFile.Close() | ||||
|  | ||||
| 		file, err := os.Create(ln + fn + d + t + uuid.New().String() + ".png") | ||||
| 		if err != nil { | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| 			return | ||||
| 		} | ||||
| 		defer file.Close() | ||||
|  | ||||
| 		if _, err := io.Copy(file, tmpFile); err != nil { | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| package types | ||||
|  | ||||
| import "os" | ||||
|  | ||||
| type Person struct { | ||||
| 	FirstName string | ||||
| 	LastName  string | ||||
| @@ -10,7 +12,8 @@ type Instructor Person | ||||
| type Participant struct { | ||||
| 	ID int64 | ||||
| 	Person | ||||
| 	Company string | ||||
| 	Company      string | ||||
| 	Questionaire string | ||||
| } | ||||
|  | ||||
| type Briefing struct { | ||||
|   | ||||
| @@ -8,6 +8,8 @@ | ||||
|  | ||||
|   <label for="participant-company-input-{{ . }}">Firma</label> | ||||
|   <input type="text" name="participant-company-{{ . }}" id="participant-company-input-{{ . }}" /> | ||||
|  | ||||
|   <button type="button" hx-post="/upload/">Fragebogen hochladen</button> | ||||
| </div> | ||||
| {{ end }} | ||||
|  | ||||
|   | ||||
| @@ -19,10 +19,8 @@ | ||||
| {{ 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> | ||||
|   <input type="text" name="search" id="search-input" hx-post="/search/" hx-target="#results" hx-swap="innerHTML" | ||||
|     hx-trigger="keyup changed delay:200ms" /> | ||||
| </form> | ||||
|  | ||||
| <form> | ||||
| @@ -34,12 +32,12 @@ | ||||
| <table> | ||||
|   <thead> | ||||
|     <tr> | ||||
|       <th colspan="2">Name Unterweiser</th> | ||||
|       <th colspan="2">Unterweiser</th> | ||||
|       <th>Datum</th> | ||||
|       <th>Uhrzeit</th> | ||||
|       <th>Stand</th> | ||||
|       <th>Ort</th> | ||||
|       <th colspan="2">Name Teilnehmer</th> | ||||
|       <th colspan="2">Teilnehmer</th> | ||||
|       <th>Firma</th> | ||||
|     </tr> | ||||
|   </thead> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user