initial
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | .idea | ||||||
|  | assets/node_modules | ||||||
							
								
								
									
										15
									
								
								assets/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								assets/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | { | ||||||
|  |   "name": "assets", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "echo \"Error: no test specified\" && exit 1" | ||||||
|  |   }, | ||||||
|  |   "keywords": [], | ||||||
|  |   "author": "", | ||||||
|  |   "license": "ISC", | ||||||
|  |   "dependencies": { | ||||||
|  |     "htmx.org": "^1.9.6" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								assets/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								assets/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | lockfileVersion: '6.0' | ||||||
|  |  | ||||||
|  | settings: | ||||||
|  |   autoInstallPeers: true | ||||||
|  |   excludeLinksFromLockfile: false | ||||||
|  |  | ||||||
|  | dependencies: | ||||||
|  |   htmx.org: | ||||||
|  |     specifier: ^1.9.6 | ||||||
|  |     version: 1.9.6 | ||||||
|  |  | ||||||
|  | packages: | ||||||
|  |  | ||||||
|  |   /htmx.org@1.9.6: | ||||||
|  |     resolution: {integrity: sha512-4Zebo9nzg8u2ZHuIJmvB/nQS6kIMLIoEfhTg/oRwyCIJhL5MLA/jPU1EPEBtGOmG4ZG0k05Vpd3sab2+zfvteQ==} | ||||||
|  |     dev: false | ||||||
							
								
								
									
										51
									
								
								cmd/root.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								cmd/root.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | /* | ||||||
|  | Copyright © 2023 NAME HERE <EMAIL ADDRESS> | ||||||
|  |  | ||||||
|  | */ | ||||||
|  | package cmd | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"os" | ||||||
|  |  | ||||||
|  | 	"github.com/spf13/cobra" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // rootCmd represents the base command when called without any subcommands | ||||||
|  | var rootCmd = &cobra.Command{ | ||||||
|  | 	Use:   "htmxginpongo", | ||||||
|  | 	Short: "A brief description of your application", | ||||||
|  | 	Long: `A longer description that spans multiple lines and likely contains | ||||||
|  | examples and usage of using your application. For example: | ||||||
|  |  | ||||||
|  | Cobra is a CLI library for Go that empowers applications. | ||||||
|  | This application is a tool to generate the needed files | ||||||
|  | to quickly create a Cobra application.`, | ||||||
|  | 	// Uncomment the following line if your bare application | ||||||
|  | 	// has an action associated with it: | ||||||
|  | 	// Run: func(cmd *cobra.Command, args []string) { }, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Execute adds all child commands to the root command and sets flags appropriately. | ||||||
|  | // This is called by main.main(). It only needs to happen once to the rootCmd. | ||||||
|  | func Execute() { | ||||||
|  | 	err := rootCmd.Execute() | ||||||
|  | 	if err != nil { | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	// Here you will define your flags and configuration settings. | ||||||
|  | 	// Cobra supports persistent flags, which, if defined here, | ||||||
|  | 	// will be global for your application. | ||||||
|  |  | ||||||
|  | 	// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.htmxginpongo.yaml)") | ||||||
|  |  | ||||||
|  | 	// Cobra also supports local flags, which will only run | ||||||
|  | 	// when this action is called directly. | ||||||
|  | 	rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										109
									
								
								cmd/serve.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								cmd/serve.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | |||||||
|  | package cmd | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"code.icod.de/dalu/ginpongo2/v6" | ||||||
|  | 	"code.icod.de/dalu/htmxginpongo/server" | ||||||
|  | 	"code.icod.de/dalu/htmxginpongo/ui" | ||||||
|  | 	_ "code.icod.de/dalu/pongo2-addons/v6" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/flosch/pongo2/v6" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/spf13/cobra" | ||||||
|  | 	"io/fs" | ||||||
|  | 	"os" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	prefixTCP  = "tcp:" | ||||||
|  | 	prefixUNIX = "unix:" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	uiDebug bool | ||||||
|  | 	uiAddr  string | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // serveCmd represents the serve command | ||||||
|  | var serveCmd = &cobra.Command{ | ||||||
|  | 	Use:   "serve", | ||||||
|  | 	Short: "A brief description of your command", | ||||||
|  | 	RunE: func(cmd *cobra.Command, args []string) error { | ||||||
|  | 		if !uiDebug { | ||||||
|  | 			gin.SetMode(gin.ReleaseMode) | ||||||
|  | 		} | ||||||
|  | 		r := gin.Default() | ||||||
|  | 		r.SecureJsonPrefix(")]}',\n") | ||||||
|  | 		r.MaxMultipartMemory = 8 << 20 | ||||||
|  | 		if uiDebug { | ||||||
|  | 			fmt.Println("debug mode") | ||||||
|  | 			fl, e := pongo2.NewLocalFileSystemLoader("ui/templates/") | ||||||
|  | 			if e != nil { | ||||||
|  | 				return e | ||||||
|  | 			} | ||||||
|  | 			hr := ginpongo2.New(true, fl) | ||||||
|  | 			r.HTMLRender = hr | ||||||
|  | 		} else { | ||||||
|  | 			fmt.Println("release mode") | ||||||
|  | 			subFS, e := fs.Sub(ui.Templates, "templates") | ||||||
|  | 			if e != nil { | ||||||
|  | 				return e | ||||||
|  | 			} | ||||||
|  | 			fl := pongo2.NewFSLoader(subFS) | ||||||
|  | 			hr := ginpongo2.New(false, fl) | ||||||
|  | 			r.HTMLRender = hr | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Static | ||||||
|  | 		r.Static("/assets", "assets") | ||||||
|  |  | ||||||
|  | 		s := server.Server{} | ||||||
|  |  | ||||||
|  | 		r.GET("/", s.GETIndex) | ||||||
|  | 		r.POST("/", s.POSTIndex) | ||||||
|  |  | ||||||
|  | 		// serve | ||||||
|  | 		if strings.HasPrefix(uiAddr, prefixTCP) { | ||||||
|  | 			addr := strings.TrimPrefix(uiAddr, prefixTCP) | ||||||
|  | 			fmt.Printf("listening on http://%s\n", addr) | ||||||
|  | 			return r.Run(addr) | ||||||
|  | 		} else if strings.HasPrefix(uiAddr, prefixUNIX) { | ||||||
|  | 			addr := strings.TrimPrefix(uiAddr, prefixUNIX) | ||||||
|  | 			if _, e := os.Stat(addr); errors.Is(e, os.ErrNotExist) { | ||||||
|  | 				fmt.Println("listening on", addr) | ||||||
|  | 				return r.RunUnix(addr) | ||||||
|  | 			} else { | ||||||
|  | 				if e := os.Remove(addr); e != nil { | ||||||
|  | 					return e | ||||||
|  | 				} else { | ||||||
|  | 					fmt.Println("listening on", addr) | ||||||
|  | 					return r.RunUnix(addr) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	rootCmd.AddCommand(serveCmd) | ||||||
|  |  | ||||||
|  | 	serveCmd.Flags().BoolVar(&uiDebug, "debug", false, "enable dev mode") | ||||||
|  | 	serveCmd.Flags().StringVar( | ||||||
|  | 		&uiAddr, | ||||||
|  | 		"addr", | ||||||
|  | 		"tcp:localhost:8080", | ||||||
|  | 		"either tcp: or unix: e.g. tcp:localhost:3030 unix:/tmp/listen.sock", | ||||||
|  | 	) | ||||||
|  | 	// Here you will define your flags and configuration settings. | ||||||
|  |  | ||||||
|  | 	// Cobra supports Persistent Flags which will work for this command | ||||||
|  | 	// and all subcommands, e.g.: | ||||||
|  | 	// serveCmd.PersistentFlags().String("foo", "", "A help for foo") | ||||||
|  |  | ||||||
|  | 	// Cobra supports local flags which will only run when this command | ||||||
|  | 	// is called directly, e.g.: | ||||||
|  | 	// serveCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | module code.icod.de/dalu/htmxginpongo | ||||||
|  |  | ||||||
|  | go 1.21 | ||||||
|  |  | ||||||
|  | require ( | ||||||
|  | 	code.icod.de/dalu/ginpongo2 v0.0.0-20221121130103-8abf6c96b7be | ||||||
|  | 	code.icod.de/dalu/pongo2-addons v0.0.0-20221121133057-654710af413b | ||||||
|  | 	github.com/flosch/pongo2/v6 v6.0.0 | ||||||
|  | 	github.com/gin-gonic/gin v1.9.1 | ||||||
|  | 	github.com/godruoyi/go-snowflake v0.0.2 | ||||||
|  | 	github.com/spf13/cobra v1.7.0 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | require ( | ||||||
|  | 	github.com/bytedance/sonic v1.9.1 // indirect | ||||||
|  | 	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect | ||||||
|  | 	github.com/flosch/go-humanize v0.0.0-20140728123800-3ba51eabe506 // indirect | ||||||
|  | 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect | ||||||
|  | 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||||
|  | 	github.com/go-playground/locales v0.14.1 // indirect | ||||||
|  | 	github.com/go-playground/universal-translator v0.18.1 // indirect | ||||||
|  | 	github.com/go-playground/validator/v10 v10.14.0 // indirect | ||||||
|  | 	github.com/goccy/go-json v0.10.2 // indirect | ||||||
|  | 	github.com/gosimple/slug v1.13.1 // indirect | ||||||
|  | 	github.com/gosimple/unidecode v1.0.1 // indirect | ||||||
|  | 	github.com/inconshreveable/mousetrap v1.1.0 // indirect | ||||||
|  | 	github.com/json-iterator/go v1.1.12 // indirect | ||||||
|  | 	github.com/klauspost/cpuid/v2 v2.2.4 // indirect | ||||||
|  | 	github.com/leodido/go-urn v1.2.4 // indirect | ||||||
|  | 	github.com/mattn/go-isatty v0.0.19 // indirect | ||||||
|  | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
|  | 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||||
|  | 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect | ||||||
|  | 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||||
|  | 	github.com/spf13/pflag v1.0.5 // indirect | ||||||
|  | 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | ||||||
|  | 	github.com/ugorji/go/codec v1.2.11 // indirect | ||||||
|  | 	golang.org/x/arch v0.3.0 // indirect | ||||||
|  | 	golang.org/x/crypto v0.9.0 // indirect | ||||||
|  | 	golang.org/x/net v0.10.0 // indirect | ||||||
|  | 	golang.org/x/sys v0.8.0 // indirect | ||||||
|  | 	golang.org/x/text v0.9.0 // indirect | ||||||
|  | 	google.golang.org/protobuf v1.30.0 // indirect | ||||||
|  | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
|  | ) | ||||||
							
								
								
									
										160
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | code.icod.de/dalu/ginpongo2 v0.0.0-20221121130103-8abf6c96b7be h1:btANi0CF37YeYJGcJSTVjMROEYArDV+7BKG9/T6Gldw= | ||||||
|  | code.icod.de/dalu/ginpongo2 v0.0.0-20221121130103-8abf6c96b7be/go.mod h1:bz+E7DmDoanujS0/ve7MRSmVRb7sEaZQL3dgDT6JZKY= | ||||||
|  | code.icod.de/dalu/pongo2-addons v0.0.0-20221121133057-654710af413b h1:bGjdcFQRYro24Z5k5wAeCzNlSqJd1T72SMLDNsVgz+c= | ||||||
|  | code.icod.de/dalu/pongo2-addons v0.0.0-20221121133057-654710af413b/go.mod h1:4LQr1YboE1qKmV6EhAky5H3tSPCO4rb2x7YGXeYUT1U= | ||||||
|  | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= | ||||||
|  | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= | ||||||
|  | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= | ||||||
|  | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= | ||||||
|  | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= | ||||||
|  | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= | ||||||
|  | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | ||||||
|  | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||||
|  | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
|  | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/flosch/go-humanize v0.0.0-20140728123800-3ba51eabe506 h1:tN043XK9BV76qc31Z2GACIO5Dsh99q21JtYmR2ltXBg= | ||||||
|  | github.com/flosch/go-humanize v0.0.0-20140728123800-3ba51eabe506/go.mod h1:pSiPkAThBLWmIzJ2fukUGkcxxWR4HoLT7Bp8/krrl5g= | ||||||
|  | github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3/go.mod h1:bJWSKrZyQvfTnb2OudyUjurSG4/edverV7n82+K3JiM= | ||||||
|  | github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= | ||||||
|  | github.com/flosch/pongo2/v5 v5.0.0/go.mod h1:6ysKu++8ANFXmc3x6uA6iVaS+PKUoDfdX3yPcv8TIzY= | ||||||
|  | github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= | ||||||
|  | github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= | ||||||
|  | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= | ||||||
|  | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= | ||||||
|  | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | ||||||
|  | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= | ||||||
|  | github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= | ||||||
|  | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= | ||||||
|  | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= | ||||||
|  | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||||
|  | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= | ||||||
|  | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||||
|  | github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= | ||||||
|  | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= | ||||||
|  | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= | ||||||
|  | github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= | ||||||
|  | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= | ||||||
|  | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= | ||||||
|  | github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= | ||||||
|  | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= | ||||||
|  | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= | ||||||
|  | github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||||
|  | github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||||
|  | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= | ||||||
|  | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||||
|  | github.com/godruoyi/go-snowflake v0.0.2 h1:rN9imTkrUJ5ZjuwTOi7kTGQFEZSUI3pwPMzAb7uitk4= | ||||||
|  | github.com/godruoyi/go-snowflake v0.0.2/go.mod h1:6JXMZzmleLpSK9pYpg4LXTcAz54mdYXTeXUvVks17+4= | ||||||
|  | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||||
|  | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= | ||||||
|  | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
|  | github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= | ||||||
|  | github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= | ||||||
|  | github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= | ||||||
|  | github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= | ||||||
|  | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= | ||||||
|  | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= | ||||||
|  | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||||
|  | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= | ||||||
|  | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||||
|  | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= | ||||||
|  | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= | ||||||
|  | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||||
|  | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||||
|  | github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= | ||||||
|  | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||||
|  | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||||
|  | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||||
|  | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||||
|  | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||||
|  | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||||
|  | github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= | ||||||
|  | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= | ||||||
|  | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= | ||||||
|  | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||||
|  | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= | ||||||
|  | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||||
|  | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||||
|  | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= | ||||||
|  | github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | ||||||
|  | github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= | ||||||
|  | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= | ||||||
|  | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||||
|  | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | ||||||
|  | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||||
|  | github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= | ||||||
|  | github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= | ||||||
|  | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||||
|  | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||||
|  | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
|  | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||||
|  | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||||
|  | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||||
|  | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
|  | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
|  | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
|  | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= | ||||||
|  | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= | ||||||
|  | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= | ||||||
|  | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= | ||||||
|  | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||||
|  | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= | ||||||
|  | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | ||||||
|  | github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= | ||||||
|  | github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= | ||||||
|  | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= | ||||||
|  | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= | ||||||
|  | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | ||||||
|  | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= | ||||||
|  | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | ||||||
|  | golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
|  | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= | ||||||
|  | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= | ||||||
|  | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||||
|  | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= | ||||||
|  | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | ||||||
|  | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= | ||||||
|  | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
|  | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
|  | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
|  | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= | ||||||
|  | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | ||||||
|  | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
|  | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||||
|  | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||||
|  | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||||
|  | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||||
|  | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= | ||||||
|  | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||||
|  | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||||
|  | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | ||||||
|  | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|  | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|  | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
|  | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|  | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= | ||||||
							
								
								
									
										11
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | /* | ||||||
|  | Copyright © 2023 NAME HERE <EMAIL ADDRESS> | ||||||
|  |  | ||||||
|  | */ | ||||||
|  | package main | ||||||
|  |  | ||||||
|  | import "code.icod.de/dalu/htmxginpongo/cmd" | ||||||
|  |  | ||||||
|  | func main() { | ||||||
|  | 	cmd.Execute() | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								model/message.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								model/message.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | package model | ||||||
|  |  | ||||||
|  | import "time" | ||||||
|  |  | ||||||
|  | type Message struct { | ||||||
|  | 	ID   uint64 | ||||||
|  | 	Name string | ||||||
|  | 	Text string | ||||||
|  | 	Time time.Time | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								server/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								server/index.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | package server | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"code.icod.de/dalu/htmxginpongo/model" | ||||||
|  | 	"code.icod.de/dalu/htmxginpongo/storage" | ||||||
|  | 	"github.com/flosch/pongo2/v6" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/godruoyi/go-snowflake" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func (s *Server) GETIndex(cx *gin.Context) { | ||||||
|  | 	ctx := make(pongo2.Context) | ||||||
|  |  | ||||||
|  | 	ctx["messages"] = storage.Messages | ||||||
|  | 	cx.HTML(200, "index", ctx) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *Server) POSTIndex(cx *gin.Context) { | ||||||
|  | 	m := new(model.Message) | ||||||
|  | 	m.Name = cx.PostForm("name") | ||||||
|  | 	m.Text = cx.PostForm("text") | ||||||
|  | 	m.Time = time.Now() | ||||||
|  | 	m.ID = snowflake.ID() | ||||||
|  | 	storage.AddMessage(m) | ||||||
|  | 	ctx := make(pongo2.Context) | ||||||
|  | 	ctx["message"] = m | ||||||
|  | 	cx.HTML(200, "message/fragment", ctx) | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								server/server.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								server/server.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | package server | ||||||
|  |  | ||||||
|  | type Server struct { | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewServer() *Server { | ||||||
|  | 	s := new(Server) | ||||||
|  | 	return s | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								storage/message.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								storage/message.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | package storage | ||||||
|  |  | ||||||
|  | import "code.icod.de/dalu/htmxginpongo/model" | ||||||
|  |  | ||||||
|  | var Messages []*model.Message | ||||||
|  |  | ||||||
|  | func AddMessage(message *model.Message) { | ||||||
|  | 	Messages = append(Messages, message) | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								ui/templates.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ui/templates.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | package ui | ||||||
|  |  | ||||||
|  | import "embed" | ||||||
|  |  | ||||||
|  | //go:embed all:templates | ||||||
|  | var Templates embed.FS | ||||||
							
								
								
									
										18
									
								
								ui/templates/base.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								ui/templates/base.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | <!doctype html> | ||||||
|  | <html lang="en"> | ||||||
|  | <head> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <meta name="viewport" | ||||||
|  |           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||||||
|  |     {%- block meta %}{% endblock -%} | ||||||
|  |     <title>{{ title }}</title> | ||||||
|  |     <script src="/assets/node_modules/htmx.org/dist/htmx.min.js"></script> | ||||||
|  |     {%- block js %}{% endblock -%} | ||||||
|  |     {%- block css %}{% endblock -%} | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | {%- block body %}{% endblock -%} | ||||||
|  | {%- block jsbottom %}{% endblock -%} | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										21
									
								
								ui/templates/index.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								ui/templates/index.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | {% extends "layout.html.twig" %} | ||||||
|  | {%- block middle %} | ||||||
|  |     <div class="px-4 py-5 my-5 text-center"> | ||||||
|  |         <h1 class="display-5 fw-bold">Hello</h1> | ||||||
|  |     </div> | ||||||
|  |     {% include "message/form.new.html.twig" %} | ||||||
|  |     <div id="messages"> | ||||||
|  |         {% if messages|length > 0 %} | ||||||
|  |             <table> | ||||||
|  |                 <tr> | ||||||
|  |                     <th>Name</th> | ||||||
|  |                     <th>Text</th> | ||||||
|  |                     <th>Time</th> | ||||||
|  |                 </tr> | ||||||
|  |     {% for message in messages %} | ||||||
|  |         {% include "message/fragment.html.twig" %} | ||||||
|  |     {% endfor %} | ||||||
|  |             </table> | ||||||
|  |         {% endif %} | ||||||
|  |     </div> | ||||||
|  | {% endblock -%} | ||||||
							
								
								
									
										20
									
								
								ui/templates/layout.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								ui/templates/layout.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | {% extends "base.html.twig" %} | ||||||
|  | {%- block css %} | ||||||
|  |     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">{% endblock -%} | ||||||
|  | {%- block js %} | ||||||
|  |     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>{% endblock -%} | ||||||
|  | {%- block body %} | ||||||
|  |     <div class="container"> | ||||||
|  |         <div class="row"> | ||||||
|  |             <div class="col-2"> | ||||||
|  |                 {%- block left -%}{% endblock -%} | ||||||
|  |             </div> | ||||||
|  |             <div class="col-8"> | ||||||
|  |                 {%- block middle -%}{% endblock -%} | ||||||
|  |             </div> | ||||||
|  |             <div class="col-2"> | ||||||
|  |                 {%- block right -%}{% endblock -%} | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | {% endblock -%} | ||||||
							
								
								
									
										11
									
								
								ui/templates/message/form.new.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								ui/templates/message/form.new.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <form hx-post="/" hx-target="#messages" hx-swap="beforeend"> | ||||||
|  |     <div class="mb-3"> | ||||||
|  |         <label for="name" class="form-label">Name</label> | ||||||
|  |         <input type="text" name="name" class="form-control" id="name"> | ||||||
|  |     </div> | ||||||
|  |     <div class="mb-3"> | ||||||
|  |         <label for="text" class="form-label">Message</label> | ||||||
|  |         <textarea class="form-control" name="text" id="text"></textarea> | ||||||
|  |     </div> | ||||||
|  |     <button type="submit" class="btn btn-primary">Submit</button> | ||||||
|  | </form> | ||||||
							
								
								
									
										11
									
								
								ui/templates/message/fragment.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								ui/templates/message/fragment.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <tr id="message-{{ message.ID }}"> | ||||||
|  |     <td> | ||||||
|  |         {{ message.Name }} | ||||||
|  |     </td> | ||||||
|  |     <td> | ||||||
|  |         {{ message.Text }} | ||||||
|  |     </td> | ||||||
|  |     <td> | ||||||
|  |         {{ message.Time|naturaltime }} | ||||||
|  |     </td> | ||||||
|  | </tr> | ||||||
		Reference in New Issue
	
	Block a user