Kaynağa Gözat

improved error template

turos.robert 3 hafta önce
ebeveyn
işleme
ac8a0805cc

+ 6 - 0
cmds/webservice/bin/notes_folder/Scoala/notita-2026-03-08-144007.727634.json

@@ -0,0 +1,6 @@
+{
+  "titlu": "Scoala",
+  "continut": "Trebuie să adaugi faviconul **în interiorul tagului `\u003chead\u003e`**.\r\n\r\nÎn cazul tău, îl pui **după `\u003ctitle\u003e` și înainte de scripturi**.\r\n\r\n### Modificarea corectă a codului tău\r\n\r\n```html\r\n\u003chead\u003e\r\n  \u003cmeta charset=\"UTF-8\"\u003e\r\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\r\n  \u003ctitle\u003eMyNotes\u003c/title\u003e\r\n\r\n  \u003clink rel=\"icon\" type=\"image/png\" href=\"/favicon.png\"\u003e\r\n\r\n  \u003cscript src=\"https://cdn.tailwindcss.com\"\u003e\u003c/script\u003e\r\n\u003c/head\u003e\r\n```\r\n\r\n---\r\n\r\n### Unde trebuie să fie fișierul\r\n\r\nCel mai simplu este să pui:\r\n\r\n```\r\nfavicon.png\r\n```\r\n\r\nîn **același folder din care serverul tău servește fișiere statice**.\r\n\r\nDe exemplu dacă serverul tău servește:\r\n\r\n```\r\ntemplates/\r\n```\r\n\r\nsau\r\n\r\n```\r\nstatic/\r\n```\r\n\r\natunci structura ar putea fi:\r\n\r\n```\r\nmynotes/\r\n ├─ templates/\r\n │   ├─ index.html\r\n │   ├─ list_notes.tmpl\r\n │\r\n ├─ static/\r\n │   └─ favicon.png\r\n```\r\n\r\nși atunci linkul devine:\r\n\r\n```html\r\n\u003clink rel=\"icon\" type=\"image/png\" href=\"/static/favicon.png\"\u003e\r\n```\r\n\r\n---\r\n\r\n### Problema cea mai comună\r\n\r\nBrowserul **cache-uiește faviconul**.\r\nDacă nu apare:\r\n\r\n* apasă **Ctrl + Shift + R**\r\n* sau deschide pagina în **incognito**.\r\n\r\n---\r\n\r\n### Extra (recomandat pentru proiectul tău)\r\n\r\nAdaugă și:\r\n\r\n```html\r\n\u003clink rel=\"shortcut icon\" href=\"/favicon.png\"\u003e\r\n```\r\n\r\nUnele browsere îl caută așa.\r\n\r\n---\r\n\r\nDacă vrei, îți pot arăta și **cea mai curată metodă de a servi faviconul în Go în 3 linii**, fără să îți strice handlerul `Wildcard`.\r\n",
+  "director": "Scoala",
+  "Path": "notes_folder/Scoala/notita-2026-03-08-144007.727634.json"
+}

+ 53 - 7
cmds/webservice/bin/templates/error.tmpl

@@ -1,11 +1,57 @@
 <!DOCTYPE html>
+<html lang="ro">
 
-<html lang = "en">
-    <head>
-    <title>Site Fain </title>
-    </head>
-    <body>
-    <h1>S-a intamplat o eroare... Asta e tot ce stim</h1>
-    </body>
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Eroare</title>
+  <script src="https://cdn.tailwindcss.com"></script>
+</head>
 
+<body class="bg-[#0b0d12] text-white font-sans min-h-screen flex items-center justify-center">
+
+  <div class="max-w-xl w-full px-6">
+
+    <div class="rounded-2xl border border-[#2a2f3a] bg-[#11151b] shadow-2xl overflow-hidden">
+
+      <div class="border-b border-[#2a2f3a] bg-[#161a22] px-6 py-5">
+        <h1 class="text-2xl font-bold text-red-400">
+          A apărut o eroare
+        </h1>
+        <p class="text-sm text-gray-400 mt-1">
+          Ceva nu a mers conform planului.
+        </p>
+      </div>
+
+      <div class="p-6">
+
+        <div class="bg-[#1a1f29] border border-[#323847] rounded-xl p-4 text-red-300 font-mono text-sm break-words">
+          {{.}}
+        </div>
+
+        <div class="mt-6 flex gap-3">
+
+          <a href="/"
+            class="flex-1 rounded-xl border border-[#3a3f4b] bg-[#171a21] px-5 py-3 text-center text-sm font-semibold text-gray-200 transition hover:bg-[#20242d] hover:text-white">
+            Înapoi acasă
+          </a>
+
+          <a href="/list_notes"
+            class="flex-1 rounded-xl bg-[#7b58ad] px-5 py-3 text-center text-sm font-bold text-white transition hover:bg-[#9974d0] shadow-lg shadow-purple-900/20">
+            Vezi notițele
+          </a>
+
+        </div>
+
+      </div>
+
+      <div class="border-t border-[#2a2f3a] bg-[#12151b] px-6 py-4 text-[11px] uppercase tracking-widest text-gray-500">
+        MyNotes • Error Handler
+      </div>
+
+    </div>
+
+  </div>
+
+</body>
 </html>

+ 12 - 12
lib/server/handlers.go

@@ -110,7 +110,7 @@ func API(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 	w.WriteHeader(http.StatusMethodNotAllowed)
-	w.Write([]byte("methoda nepermisa"))
+	template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, "metoda nepermisa")
 }
 
 func Notes(w http.ResponseWriter, r *http.Request, fisier string) {
@@ -120,13 +120,13 @@ func Notes(w http.ResponseWriter, r *http.Request, fisier string) {
 	if err != nil {
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte(WEB_ERR))
-		fmt.Printf("%+v\n", err)
+		template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 		return
 	}
 	if err := goldmark.Convert([]byte(notita.Continut), &buf); err != nil {
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte(WEB_ERR))
-		fmt.Printf("%+v\n", err)
+		template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 		return
 	}
 	notita.HTML = buf.String()
@@ -135,14 +135,14 @@ func Notes(w http.ResponseWriter, r *http.Request, fisier string) {
 	if err != nil {
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte(WEB_ERR))
-		fmt.Printf("%+v\n", err)
+		template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 		return
 	}
 	err = tmpl.ExecuteTemplate(w, "notita.tmpl", notita)
 	if err != nil {
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte(WEB_ERR))
-		fmt.Printf("%+v\n", err)
+		template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 		return
 	}
 }
@@ -163,7 +163,7 @@ func ListNotes(w http.ResponseWriter, r *http.Request) {
 		if err != nil {
 			fmt.Println("EROARE la buildFolderStructure:", err)
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		tmpl := template.New("list_notes_test")
@@ -171,14 +171,14 @@ func ListNotes(w http.ResponseWriter, r *http.Request) {
 		if err != nil {
 			fmt.Println("EROARE la buildFolderStructure:", err)
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		err = tmpl.ExecuteTemplate(w, "list_notes.tmpl", f)
 		if err != nil {
 			fmt.Println("EROARE la buildFolderStructure:", err)
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		return
@@ -224,7 +224,7 @@ func EditNotes(w http.ResponseWriter, r *http.Request, filename string) {
 		err := inout.FileToObj(filename, &f)
 		if err != nil {
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		tmpl := template.New("editare")
@@ -233,18 +233,18 @@ func EditNotes(w http.ResponseWriter, r *http.Request, filename string) {
 		if err != nil {
 			fmt.Println("EROARE la buildFolderStructure:", err)
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		err = tmpl.ExecuteTemplate(w, "edit_notes.tmpl", f)
 		if err != nil {
 			fmt.Println("EROARE la buildFolderStructure:", err)
 			w.WriteHeader(http.StatusBadRequest)
-			fmt.Fprintf(w, "%+v", err)
+			template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
 			return
 		}
 		return
 	}
 	w.WriteHeader(http.StatusMethodNotAllowed)
-	w.Write([]byte("methoda nepermisa"))
+	template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, "metoda nepermisa")
 }