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