more restructuring; email
This commit is contained in:
parent
cae11a2e19
commit
77ba4bded8
|
@ -2,3 +2,4 @@ bin
|
||||||
*.db
|
*.db
|
||||||
tmp
|
tmp
|
||||||
tmp/*
|
tmp/*
|
||||||
|
config.toml
|
|
@ -1,16 +1,29 @@
|
||||||
package main
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
func initConfig() error {
|
type smtp struct {
|
||||||
|
Enabled bool
|
||||||
|
Host string
|
||||||
|
Port uint16
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
From string
|
||||||
|
}
|
||||||
|
|
||||||
|
var SMTP smtp = smtp{}
|
||||||
|
var BaseURL string = "localhost"
|
||||||
|
|
||||||
|
func InitConfig() error {
|
||||||
viper.SetDefault("host", "[::]")
|
viper.SetDefault("host", "[::]")
|
||||||
viper.SetDefault("port", 8080)
|
viper.SetDefault("port", 8080)
|
||||||
viper.SetDefault("db_path", "bin.db")
|
viper.SetDefault("db_path", "bin.db")
|
||||||
viper.SetDefault("smtp.enabled", false)
|
viper.SetDefault("smtp.enabled", false)
|
||||||
viper.SetDefault("user.registration_enabled", false)
|
viper.SetDefault("user.registration_enabled", false)
|
||||||
|
viper.SetDefault("base_url", "localhost")
|
||||||
|
|
||||||
viper.SetConfigName("config")
|
viper.SetConfigName("config")
|
||||||
viper.SetConfigType("toml")
|
viper.SetConfigType("toml")
|
||||||
|
@ -27,5 +40,16 @@ func initConfig() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SMTP = smtp{
|
||||||
|
Enabled: viper.GetBool("smtp.enabled"),
|
||||||
|
Host: viper.GetString("smtp.host"),
|
||||||
|
Port: viper.GetUint16("smtp.port"),
|
||||||
|
Username: viper.GetString("smtp.username"),
|
||||||
|
Password: viper.GetString("smtp.password"),
|
||||||
|
From: viper.GetString("smtp.from"),
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseURL = viper.GetString("base_url")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.myrkvi.com/myrkvi/bin/config"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/global"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/utils"
|
||||||
|
"github.com/go-mail/mail"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func PostEmailHandler(c echo.Context) error {
|
||||||
|
code := c.Param("id")
|
||||||
|
adminCode := c.FormValue("adminKey")
|
||||||
|
email := c.FormValue("email")
|
||||||
|
|
||||||
|
if !viper.GetBool("smtp.enabled") {
|
||||||
|
return utils.RenderErrorToast(c, "function not available")
|
||||||
|
}
|
||||||
|
|
||||||
|
file := models.File{}
|
||||||
|
|
||||||
|
result := global.DB.Where("page_key = ?", code).First(&file)
|
||||||
|
if result.Error == gorm.ErrRecordNotFound {
|
||||||
|
return utils.RenderErrorToast(c, "the file does not exist")
|
||||||
|
} else if result.Error != nil {
|
||||||
|
return utils.RenderErrorToast(c, "server error occurred")
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminCode != file.AdminKey {
|
||||||
|
return utils.RenderErrorToast(c, "incorrect deletion key")
|
||||||
|
}
|
||||||
|
|
||||||
|
if file.Email != "" {
|
||||||
|
return utils.RenderErrorToast(c, "this file is already associated with an email")
|
||||||
|
}
|
||||||
|
|
||||||
|
file.Email = email
|
||||||
|
|
||||||
|
result = global.DB.Save(&file)
|
||||||
|
if result.Error != nil {
|
||||||
|
logrus.WithError(result.Error).
|
||||||
|
WithFields(logrus.Fields{
|
||||||
|
"file code": file.PageKey,
|
||||||
|
"email": email,
|
||||||
|
}).Errorln("failed to save email for file")
|
||||||
|
|
||||||
|
return utils.RenderErrorToast(c, "server error occurred")
|
||||||
|
}
|
||||||
|
|
||||||
|
smtp := config.SMTP
|
||||||
|
|
||||||
|
dial := mail.NewDialer(smtp.Host, int(smtp.Port), smtp.Username, smtp.Password)
|
||||||
|
|
||||||
|
message := mail.NewMessage()
|
||||||
|
message.SetHeader("From", smtp.From)
|
||||||
|
message.SetHeader("To", email)
|
||||||
|
message.SetHeader("Subject", fmt.Sprintf("[bin] Deletion key for file '%s'", file.Filename))
|
||||||
|
message.SetBody(
|
||||||
|
"text/plain",
|
||||||
|
fmt.Sprintf(
|
||||||
|
"Deletion key for the file located at %s is %s.\r\nYou can also use this link: %s",
|
||||||
|
fmt.Sprintf("%s/b/%s", config.BaseURL, file.PageKey),
|
||||||
|
file.AdminKey,
|
||||||
|
fmt.Sprintf("%s/b/%s?delcode=%s", config.BaseURL, file.PageKey, file.AdminKey),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
err := dial.DialAndSend(message)
|
||||||
|
if err != nil {
|
||||||
|
return utils.RenderErrorToast(c, "could not send email")
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.HTML(200, "<p>email sent!</p>")
|
||||||
|
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ func PostNewHandler(c echo.Context) error {
|
||||||
name := c.FormValue("name")
|
name := c.FormValue("name")
|
||||||
description := c.FormValue("description")
|
description := c.FormValue("description")
|
||||||
lang := c.FormValue("lang")
|
lang := c.FormValue("lang")
|
||||||
|
ip := c.RealIP()
|
||||||
|
|
||||||
if (file == nil || err != nil) && text == "" {
|
if (file == nil || err != nil) && text == "" {
|
||||||
return utils.RenderErrorToast(c, "file or text must be provided")
|
return utils.RenderErrorToast(c, "file or text must be provided")
|
||||||
|
@ -55,7 +56,7 @@ func PostNewHandler(c echo.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createdFile, err := models.CreateNewBin(global.DB, text, name, description, lang, code, adminCode)
|
createdFile, err := models.CreateNewBin(global.DB, text, name, description, lang, code, adminCode, ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.RenderErrorToast(c, "server-side error occurred")
|
return utils.RenderErrorToast(c, "server-side error occurred")
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,3 +17,7 @@ func GetPartialTextHandler(c echo.Context) error {
|
||||||
c.Response().Header().Add("HX-Push", "/new?text")
|
c.Response().Header().Add("HX-Push", "/new?text")
|
||||||
return utils.RenderComponents(c, http.StatusOK, partials.NewTextSubmit())
|
return utils.RenderComponents(c, http.StatusOK, partials.NewTextSubmit())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetPartialEmailForm(c echo.Context) error {
|
||||||
|
return utils.RenderComponents(c, http.StatusOK, partials.EmailForm())
|
||||||
|
}
|
2
go.mod
2
go.mod
|
@ -23,6 +23,7 @@ require (
|
||||||
github.com/gin-gonic/gin v1.9.1 // indirect
|
github.com/gin-gonic/gin v1.9.1 // indirect
|
||||||
github.com/glebarez/go-sqlite v1.21.2 // indirect
|
github.com/glebarez/go-sqlite v1.21.2 // indirect
|
||||||
github.com/glebarez/sqlite v1.9.0 // indirect
|
github.com/glebarez/sqlite v1.9.0 // indirect
|
||||||
|
github.com/go-mail/mail v2.3.1+incompatible // indirect
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.14.0 // indirect
|
github.com/go-playground/validator/v10 v10.14.0 // indirect
|
||||||
|
@ -74,6 +75,7 @@ require (
|
||||||
golang.org/x/text v0.13.0 // indirect
|
golang.org/x/text v0.13.0 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
google.golang.org/protobuf v1.31.0 // indirect
|
google.golang.org/protobuf v1.31.0 // indirect
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gorm.io/gorm v1.25.4 // indirect
|
gorm.io/gorm v1.25.4 // indirect
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -104,6 +104,8 @@ github.com/glebarez/sqlite v1.9.0/go.mod h1:YBYCoyupOao60lzp1MVBLEjZfgkq0tdB1voA
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-mail/mail v2.3.1+incompatible h1:UzNOn0k5lpfVtO31cK3hn6I4VEVGhe3lX8AJBAxXExM=
|
||||||
|
github.com/go-mail/mail v2.3.1+incompatible/go.mod h1:VPWjmmNyRsWXQZHVHT3g0YbIINUkSmuKOiLIDkWbL6M=
|
||||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
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/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||||
|
@ -625,6 +627,8 @@ google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cn
|
||||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
|
14
main.go
14
main.go
|
@ -1,8 +1,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.myrkvi.com/myrkvi/bin/config"
|
||||||
"git.myrkvi.com/myrkvi/bin/controllers"
|
"git.myrkvi.com/myrkvi/bin/controllers"
|
||||||
"git.myrkvi.com/myrkvi/bin/global"
|
"git.myrkvi.com/myrkvi/bin/global"
|
||||||
"git.myrkvi.com/myrkvi/bin/models"
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
@ -15,13 +17,16 @@ import (
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:embed static
|
||||||
|
var static embed.FS
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
logrus.SetLevel(logrus.DebugLevel)
|
logrus.SetLevel(logrus.DebugLevel)
|
||||||
logrus.SetFormatter(&prefixed.TextFormatter{
|
logrus.SetFormatter(&prefixed.TextFormatter{
|
||||||
FullTimestamp: true,
|
FullTimestamp: true,
|
||||||
})
|
})
|
||||||
logrus.Infoln("Application started.")
|
logrus.Infoln("Application started.")
|
||||||
initConfig()
|
config.InitConfig()
|
||||||
|
|
||||||
db_string := "bin.db"
|
db_string := "bin.db"
|
||||||
var err error
|
var err error
|
||||||
|
@ -53,15 +58,20 @@ func main() {
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
e.Static("/static", "static")
|
//e.Static("/static", "static")
|
||||||
|
fs := echo.MustSubFS(static, "./static/")
|
||||||
|
e.StaticFS("/static", fs)
|
||||||
|
|
||||||
e.GET("/", controllers.IndexHandler)
|
e.GET("/", controllers.IndexHandler)
|
||||||
e.GET("/new", controllers.GetNewHandler)
|
e.GET("/new", controllers.GetNewHandler)
|
||||||
e.POST("/new", controllers.PostNewHandler)
|
e.POST("/new", controllers.PostNewHandler)
|
||||||
e.GET("/b/:id", controllers.GetBinHandler)
|
e.GET("/b/:id", controllers.GetBinHandler)
|
||||||
e.POST("/b/:id/delete", controllers.DeleteBinHandler)
|
e.POST("/b/:id/delete", controllers.DeleteBinHandler)
|
||||||
|
e.POST("/b/:id/email", controllers.PostEmailHandler)
|
||||||
|
|
||||||
partial := e.Group("/partial")
|
partial := e.Group("/partial")
|
||||||
|
partial.GET("/email", controllers.GetPartialEmailForm)
|
||||||
|
|
||||||
new := partial.Group("/new")
|
new := partial.Group("/new")
|
||||||
new.GET("/upload", controllers.GetPartialUploadHandler)
|
new.GET("/upload", controllers.GetPartialUploadHandler)
|
||||||
new.GET("/text", controllers.GetPartialTextHandler)
|
new.GET("/text", controllers.GetPartialTextHandler)
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import "gorm.io/gorm"
|
||||||
|
|
||||||
|
type File struct {
|
||||||
|
gorm.Model
|
||||||
|
|
||||||
|
PageKey string `gorm:"index:idx_pagekey,unique;unique"`
|
||||||
|
AdminKey string `gorm:"index:idx_adminkey"`
|
||||||
|
Filename string
|
||||||
|
Description string
|
||||||
|
Language string
|
||||||
|
Data string
|
||||||
|
SubmitterIP string
|
||||||
|
Email string `gorm:"index:idx_email"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateNewBin(db *gorm.DB, text, name, description, language, key, adminKey, ip string) (File, error) {
|
||||||
|
bin := File{
|
||||||
|
Filename: name,
|
||||||
|
Description: description,
|
||||||
|
Language: language,
|
||||||
|
PageKey: key,
|
||||||
|
AdminKey: adminKey,
|
||||||
|
Data: text,
|
||||||
|
SubmitterIP: ip,
|
||||||
|
}
|
||||||
|
result := db.Create(&bin)
|
||||||
|
if result.Error != nil {
|
||||||
|
return File{}, result.Error
|
||||||
|
}
|
||||||
|
return bin, nil
|
||||||
|
}
|
|
@ -4,46 +4,9 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/crypto/bcrypt"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
type File struct {
|
|
||||||
gorm.Model
|
|
||||||
|
|
||||||
PageKey string `gorm:"index:idx_pagekey,unique;unique"`
|
|
||||||
AdminKey string `gorm:"index:idx_adminkey"`
|
|
||||||
|
|
||||||
// The "virtual" filename.
|
|
||||||
Filename string
|
|
||||||
|
|
||||||
// The description of the file submission.
|
|
||||||
Description string
|
|
||||||
|
|
||||||
Language string
|
|
||||||
|
|
||||||
// The contents of the file must be valid text.
|
|
||||||
Data string
|
|
||||||
|
|
||||||
UserID uint
|
|
||||||
User User
|
|
||||||
}
|
|
||||||
|
|
||||||
type User struct {
|
|
||||||
gorm.Model
|
|
||||||
|
|
||||||
DisplayName string
|
|
||||||
Email string `gorm:"unique"`
|
|
||||||
Salt string
|
|
||||||
HashedPassword []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *User) MatchesPassword(password string) bool {
|
|
||||||
combined := append([]byte(u.Salt), []byte(password)...)
|
|
||||||
|
|
||||||
return bcrypt.CompareHashAndPassword(u.HashedPassword, []byte(combined)) == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func DatabaseMigrations(db *gorm.DB) {
|
func DatabaseMigrations(db *gorm.DB) {
|
||||||
tables := []interface{}{
|
tables := []interface{}{
|
||||||
File{},
|
File{},
|
||||||
|
@ -62,19 +25,3 @@ func DatabaseMigrations(db *gorm.DB) {
|
||||||
}
|
}
|
||||||
logrus.Infoln("Migrations ran successfully.")
|
logrus.Infoln("Migrations ran successfully.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateNewBin(db *gorm.DB, text, name, description, language, key, adminKey string) (File, error) {
|
|
||||||
bin := File{
|
|
||||||
Filename: name,
|
|
||||||
Description: description,
|
|
||||||
Language: language,
|
|
||||||
PageKey: key,
|
|
||||||
AdminKey: adminKey,
|
|
||||||
Data: text,
|
|
||||||
}
|
|
||||||
result := db.Create(&bin)
|
|
||||||
if result.Error != nil {
|
|
||||||
return File{}, result.Error
|
|
||||||
}
|
|
||||||
return bin, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
gorm.Model
|
||||||
|
|
||||||
|
DisplayName string
|
||||||
|
Email string `gorm:"unique"`
|
||||||
|
Salt string
|
||||||
|
HashedPassword []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *User) MatchesPassword(password string) bool {
|
||||||
|
combined := append([]byte(u.Salt), []byte(password)...)
|
||||||
|
|
||||||
|
return bcrypt.CompareHashAndPassword(u.HashedPassword, []byte(combined)) == nil
|
||||||
|
}
|
|
@ -682,6 +682,10 @@ video {
|
||||||
width: 6rem;
|
width: 6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.w-48 {
|
||||||
|
width: 12rem;
|
||||||
|
}
|
||||||
|
|
||||||
.w-fit {
|
.w-fit {
|
||||||
width: -moz-fit-content;
|
width: -moz-fit-content;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
|
|
|
@ -61,6 +61,7 @@ templ FileUpload(text, name, id string) {
|
||||||
templ BoostButton(label, to string) {
|
templ BoostButton(label, to string) {
|
||||||
<span hx-boost="true">
|
<span hx-boost="true">
|
||||||
<a
|
<a
|
||||||
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
class="transition ease-in-out
|
class="transition ease-in-out
|
||||||
px-1 outline outline-1
|
px-1 outline outline-1
|
||||||
|
@ -75,6 +76,28 @@ templ BoostButton(label, to string) {
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ GetButton(label, to, target, swap string) {
|
||||||
|
<span
|
||||||
|
tabindex="0"
|
||||||
|
role="button"
|
||||||
|
class="transition ease-in-out
|
||||||
|
px-1 outline outline-1
|
||||||
|
outline-slate-600 hover:outline-2
|
||||||
|
hover:bg-green-300 duration-300
|
||||||
|
active:bg-green-600
|
||||||
|
foucs:outline-2"
|
||||||
|
hx-get={ to }
|
||||||
|
if target != "" {
|
||||||
|
hx-target={ target }
|
||||||
|
}
|
||||||
|
if swap != "" {
|
||||||
|
hx-swap={ swap }
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{ label }
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
|
||||||
templ SubmitFormButton(label string) {
|
templ SubmitFormButton(label string) {
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
|
@ -120,11 +143,6 @@ templ NavMenu(items []models.MenuItem, current int, swapOob bool) {
|
||||||
</nav>
|
</nav>
|
||||||
}
|
}
|
||||||
|
|
||||||
// templ CombineTempls(top, bottom templ.Component) {
|
|
||||||
// {! top }
|
|
||||||
// {! bottom }
|
|
||||||
// }
|
|
||||||
|
|
||||||
templ CombineTempls(comps ...templ.Component) {
|
templ CombineTempls(comps ...templ.Component) {
|
||||||
for _, comp := range comps {
|
for _, comp := range comps {
|
||||||
{! comp }
|
{! comp }
|
||||||
|
|
|
@ -199,7 +199,7 @@ func BoostButton(label, to string) templ.Component {
|
||||||
var_7 = templ.NopComponent
|
var_7 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<span hx-boost=\"true\"><a role=\"button\" class=\"transition ease-in-out\n px-1 outline outline-1 \n outline-slate-600 hover:outline-2 \n hover:bg-green-300 duration-300\n active:bg-green-600\n foucs:outline-2\" href=\"")
|
_, err = templBuffer.WriteString("<span hx-boost=\"true\"><a tabindex=\"0\" role=\"button\" class=\"transition ease-in-out\n px-1 outline outline-1 \n outline-slate-600 hover:outline-2 \n hover:bg-green-300 duration-300\n active:bg-green-600\n foucs:outline-2\" href=\"")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ func BoostButton(label, to string) templ.Component {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func SubmitFormButton(label string) templ.Component {
|
func GetButton(label, to, target, swap string) templ.Component {
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
if !templIsBuffer {
|
if !templIsBuffer {
|
||||||
|
@ -241,6 +241,79 @@ func SubmitFormButton(label string) templ.Component {
|
||||||
var_10 = templ.NopComponent
|
var_10 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<span tabindex=\"0\" role=\"button\" class=\"transition ease-in-out\n px-1 outline outline-1 \n outline-slate-600 hover:outline-2 \n hover:bg-green-300 duration-300\n active:bg-green-600\n foucs:outline-2\" hx-get=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(to))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if target != "" {
|
||||||
|
_, err = templBuffer.WriteString(" hx-target=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(target))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if swap != "" {
|
||||||
|
_, err = templBuffer.WriteString(" hx-swap=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(swap))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_11 string = label
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(var_11))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</span>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func SubmitFormButton(label string) templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_12 := templ.GetChildren(ctx)
|
||||||
|
if var_12 == nil {
|
||||||
|
var_12 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<input type=\"submit\" value=\"")
|
_, err = templBuffer.WriteString("<input type=\"submit\" value=\"")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -268,9 +341,9 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_11 := templ.GetChildren(ctx)
|
var_13 := templ.GetChildren(ctx)
|
||||||
if var_11 == nil {
|
if var_13 == nil {
|
||||||
var_11 = templ.NopComponent
|
var_13 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<nav id=\"page-nav\" class=\"flex flex-col sm:flex-row justify-around\"")
|
_, err = templBuffer.WriteString("<nav id=\"page-nav\" class=\"flex flex-col sm:flex-row justify-around\"")
|
||||||
|
@ -293,8 +366,8 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_12 string = item.Label
|
var var_14 string = item.Label
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_12))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_14))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -307,8 +380,8 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_13 templ.SafeURL = templ.URL(item.Href)
|
var var_15 templ.SafeURL = templ.URL(item.Href)
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(string(var_13)))
|
_, err = templBuffer.WriteString(templ.EscapeString(string(var_15)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -316,8 +389,8 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_14 string = item.Label
|
var var_16 string = item.Label
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_14))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_16))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -338,11 +411,6 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// templ CombineTempls(top, bottom templ.Component) {
|
|
||||||
// {! top }
|
|
||||||
// {! bottom }
|
|
||||||
// }
|
|
||||||
|
|
||||||
func CombineTempls(comps ...templ.Component) templ.Component {
|
func CombineTempls(comps ...templ.Component) templ.Component {
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
@ -351,9 +419,9 @@ func CombineTempls(comps ...templ.Component) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_15 := templ.GetChildren(ctx)
|
var_17 := templ.GetChildren(ctx)
|
||||||
if var_15 == nil {
|
if var_17 == nil {
|
||||||
var_15 = templ.NopComponent
|
var_17 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
for _, comp := range comps {
|
for _, comp := range comps {
|
||||||
|
@ -377,9 +445,9 @@ func ErrorMessage(msg, id string) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_16 := templ.GetChildren(ctx)
|
var_18 := templ.GetChildren(ctx)
|
||||||
if var_16 == nil {
|
if var_18 == nil {
|
||||||
var_16 = templ.NopComponent
|
var_18 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<div id=\"")
|
_, err = templBuffer.WriteString("<div id=\"")
|
||||||
|
@ -394,8 +462,8 @@ func ErrorMessage(msg, id string) templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_17 string = msg
|
var var_19 string = msg
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_17))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_19))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -418,17 +486,17 @@ func ToastError(message string) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_18 := templ.GetChildren(ctx)
|
var_20 := templ.GetChildren(ctx)
|
||||||
if var_18 == nil {
|
if var_20 == nil {
|
||||||
var_18 = templ.NopComponent
|
var_20 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<div class=\"relative px-4 py-2 bg-rose-400 opacity-0\n border border-rose-600 rounded-lg m-1\" _=\"init transition my opacity to 1 over 250ms\"><span tabindex=\"0\" role=\"button\" aria-label=\"Close the toast message\" class=\"absolute top-0 right-1 cursor-pointer select-none\" _=\"on click set prnt to my parentElement\n then transition element prnt's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
_, err = templBuffer.WriteString("<div class=\"relative px-4 py-2 bg-rose-400 opacity-0\n border border-rose-600 rounded-lg m-1\" _=\"init transition my opacity to 1 over 250ms\"><span tabindex=\"0\" role=\"button\" aria-label=\"Close the toast message\" class=\"absolute top-0 right-1 cursor-pointer select-none\" _=\"on click set prnt to my parentElement\n then transition element prnt's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var_19 := `🞬`
|
var_21 := `🞬`
|
||||||
_, err = templBuffer.WriteString(var_19)
|
_, err = templBuffer.WriteString(var_21)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -436,8 +504,8 @@ func ToastError(message string) templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_20 string = message
|
var var_22 string = message
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_20))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_22))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -460,17 +528,17 @@ func ToastSuccess(message string) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_21 := templ.GetChildren(ctx)
|
var_23 := templ.GetChildren(ctx)
|
||||||
if var_21 == nil {
|
if var_23 == nil {
|
||||||
var_21 = templ.NopComponent
|
var_23 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<div class=\"relative px-4 py-2 bg-emerald-400 opacity-0\n border border-emerald-600 rounded-lg m-1\" _=\"init transition my opacity to 1 over 250ms\"><span tabindex=\"0\" role=\"button\" aria-label=\"Close the toast message\" class=\"absolute top-0 right-1 cursor-pointer select-none\" _=\"on click set prnt to my parentElement\n then transition element prnt's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
_, err = templBuffer.WriteString("<div class=\"relative px-4 py-2 bg-emerald-400 opacity-0\n border border-emerald-600 rounded-lg m-1\" _=\"init transition my opacity to 1 over 250ms\"><span tabindex=\"0\" role=\"button\" aria-label=\"Close the toast message\" class=\"absolute top-0 right-1 cursor-pointer select-none\" _=\"on click set prnt to my parentElement\n then transition element prnt's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var_22 := `🞬`
|
var_24 := `🞬`
|
||||||
_, err = templBuffer.WriteString(var_22)
|
_, err = templBuffer.WriteString(var_24)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -478,8 +546,8 @@ func ToastSuccess(message string) templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var var_23 string = message
|
var var_25 string = message
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_23))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_25))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -502,9 +570,9 @@ func SwapOOB(swapspec string, component templ.Component) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_24 := templ.GetChildren(ctx)
|
var_26 := templ.GetChildren(ctx)
|
||||||
if var_24 == nil {
|
if var_26 == nil {
|
||||||
var_24 = templ.NopComponent
|
var_26 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<div hx-swap-oob=\"")
|
_, err = templBuffer.WriteString("<div hx-swap-oob=\"")
|
||||||
|
@ -542,9 +610,9 @@ func SetTitle(title string) templ.Component {
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
var_25 := templ.GetChildren(ctx)
|
var_27 := templ.GetChildren(ctx)
|
||||||
if var_25 == nil {
|
if var_27 == nil {
|
||||||
var_25 = templ.NopComponent
|
var_27 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<title id=\"title\" hx-swap-oob=\"true\">")
|
_, err = templBuffer.WriteString("<title id=\"title\" hx-swap-oob=\"true\">")
|
||||||
|
@ -552,14 +620,14 @@ func SetTitle(title string) templ.Component {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if title == "" {
|
if title == "" {
|
||||||
var_26 := `bin`
|
var_28 := `bin`
|
||||||
_, err = templBuffer.WriteString(var_26)
|
_, err = templBuffer.WriteString(var_28)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var var_27 string = title
|
var var_29 string = title
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_27))
|
_, err = templBuffer.WriteString(templ.EscapeString(var_29))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -567,8 +635,8 @@ func SetTitle(title string) templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var_28 := `- bin`
|
var_30 := `- bin`
|
||||||
_, err = templBuffer.WriteString(var_28)
|
_, err = templBuffer.WriteString(var_30)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package pages
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.myrkvi.com/myrkvi/bin/config"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ BinFull(file models.File) {
|
||||||
|
@page(
|
||||||
|
BinPartial(file),
|
||||||
|
models.DefaultMenu,
|
||||||
|
-1,
|
||||||
|
file.Filename,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
templ BinPartial(file models.File) {
|
||||||
|
<div>
|
||||||
|
<h1 class="text-xl my-2 inline-block">{ file.Filename }
|
||||||
|
if file.Language != "" {
|
||||||
|
<sup class="text-base mx-4">({ file.Language })</sup>
|
||||||
|
}
|
||||||
|
</h1>
|
||||||
|
<p class="italic mx-1 my-2">{ file.Description }</p>
|
||||||
|
<pre class="my-4">{ file.Data }</pre>
|
||||||
|
<div class="relative h-full">
|
||||||
|
<div class="absolute -bottom-32">
|
||||||
|
<form
|
||||||
|
hx-post={ "/b/" + file.PageKey + "/delete" }
|
||||||
|
hx-confirm="Are you sure you want to delete this?"
|
||||||
|
hx-target="#main-content"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
name="adminKey"
|
||||||
|
id="adminKey"
|
||||||
|
type="text"
|
||||||
|
class="mr-4 w-24 bg-amber-50
|
||||||
|
hover:outline-slate-400 hover:outline-dotted
|
||||||
|
focus:outline-slate-600 focus:outline-dashed
|
||||||
|
active:outline-green-600"
|
||||||
|
placeholder="deletion key"
|
||||||
|
value={ file.AdminKey }
|
||||||
|
/>
|
||||||
|
@components.SubmitFormButton("delete")
|
||||||
|
if file.AdminKey != "" {
|
||||||
|
<a class="text-blue-500 mx-4" href={ templ.URL(fmt.Sprintf("/b/%s?delcode=%s", file.PageKey, file.AdminKey))}><sup>permalink with deletion key</sup></a>
|
||||||
|
}
|
||||||
|
<p class="opacity-0 my-1 max-w-md" _="init if #adminKey's value is not '' log then show me with *opacity">
|
||||||
|
this is your deletion key! <br /> you will need to store it if you want to delete the file.
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
if file.AdminKey != "" && file.Email == "" && config.SMTP.Enabled {
|
||||||
|
<form hx-post={ "/b/" + file.PageKey + "/email" } id="emailForm">
|
||||||
|
<input type="text" name="adminKey" id="adminKey" hidden value={ file.AdminKey } />
|
||||||
|
@components.GetButton("email me this!", "/partial/email", "this", "outerHTML")
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
|
@ -0,0 +1,223 @@
|
||||||
|
// Code generated by templ@v0.2.316 DO NOT EDIT.
|
||||||
|
|
||||||
|
package pages
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import "context"
|
||||||
|
import "io"
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.myrkvi.com/myrkvi/bin/config"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BinFull(file models.File) templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_1 := templ.GetChildren(ctx)
|
||||||
|
if var_1 == nil {
|
||||||
|
var_1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
err = page(
|
||||||
|
BinPartial(file),
|
||||||
|
models.DefaultMenu,
|
||||||
|
-1,
|
||||||
|
file.Filename,
|
||||||
|
).Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func BinPartial(file models.File) templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_2 := templ.GetChildren(ctx)
|
||||||
|
if var_2 == nil {
|
||||||
|
var_2 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<div><h1 class=\"text-xl my-2 inline-block\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_3 string = file.Filename
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(var_3))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if file.Language != "" {
|
||||||
|
_, err = templBuffer.WriteString("<sup class=\"text-base mx-4\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_4 := `(`
|
||||||
|
_, err = templBuffer.WriteString(var_4)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_5 string = file.Language
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(var_5))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_6 := `)`
|
||||||
|
_, err = templBuffer.WriteString(var_6)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</sup>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</h1><p class=\"italic mx-1 my-2\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_7 string = file.Description
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(var_7))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</p><pre class=\"my-4\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_8 string = file.Data
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(var_8))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</pre><div class=\"relative h-full\"><div class=\"absolute -bottom-32\"><form hx-post=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString("/b/" + file.PageKey + "/delete"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\" hx-confirm=\"Are you sure you want to delete this?\" hx-target=\"#main-content\"><input name=\"adminKey\" id=\"adminKey\" type=\"text\" class=\"mr-4 w-24 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" placeholder=\"deletion key\" value=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(file.AdminKey))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.SubmitFormButton("delete").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if file.AdminKey != "" {
|
||||||
|
_, err = templBuffer.WriteString("<a class=\"text-blue-500 mx-4\" href=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var var_9 templ.SafeURL = templ.URL(fmt.Sprintf("/b/%s?delcode=%s", file.PageKey, file.AdminKey))
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(string(var_9)))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\"><sup>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_10 := `permalink with deletion key`
|
||||||
|
_, err = templBuffer.WriteString(var_10)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</sup></a>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("<p class=\"opacity-0 my-1 max-w-md\" _=\"init if #adminKey's value is not '' log then show me with *opacity\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_11 := `this is your deletion key! `
|
||||||
|
_, err = templBuffer.WriteString(var_11)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("<br> ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_12 := `you will need to store it if you want to delete the file.`
|
||||||
|
_, err = templBuffer.WriteString(var_12)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</p></form>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if file.AdminKey != "" && file.Email == "" && config.SMTP.Enabled {
|
||||||
|
_, err = templBuffer.WriteString("<form hx-post=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString("/b/" + file.PageKey + "/email"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\" id=\"emailForm\"><input type=\"text\" name=\"adminKey\" id=\"adminKey\" hidden value=\"")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(templ.EscapeString(file.AdminKey))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.GetButton("email me this!", "/partial/email", "this", "outerHTML").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</form>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</div></div></div>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package pages
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ IndexFull() {
|
||||||
|
@page(
|
||||||
|
IndexPartial(),
|
||||||
|
models.DefaultMenu,
|
||||||
|
0,
|
||||||
|
"",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
templ IndexPartial() {
|
||||||
|
<h2 class="text-xl">Welcome to <i>bin</i></h2>
|
||||||
|
<p>bin is a simple paste bin.</p>
|
||||||
|
<br />
|
||||||
|
@components.BoostButton("new", "/new")
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
// Code generated by templ@v0.2.316 DO NOT EDIT.
|
||||||
|
|
||||||
|
package pages
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import "context"
|
||||||
|
import "io"
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
func IndexFull() templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_1 := templ.GetChildren(ctx)
|
||||||
|
if var_1 == nil {
|
||||||
|
var_1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
err = page(
|
||||||
|
IndexPartial(),
|
||||||
|
models.DefaultMenu,
|
||||||
|
0,
|
||||||
|
"",
|
||||||
|
).Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func IndexPartial() templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_2 := templ.GetChildren(ctx)
|
||||||
|
if var_2 == nil {
|
||||||
|
var_2 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<h2 class=\"text-xl\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_3 := `Welcome to `
|
||||||
|
_, err = templBuffer.WriteString(var_3)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("<i>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_4 := `bin`
|
||||||
|
_, err = templBuffer.WriteString(var_4)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</i></h2><p>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_5 := `bin is a simple paste bin.`
|
||||||
|
_, err = templBuffer.WriteString(var_5)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</p><br>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.BoostButton("new", "/new").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package pages
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/partials"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ NewFull(wantsText bool) {
|
||||||
|
@page(
|
||||||
|
NewPartial(wantsText),
|
||||||
|
models.DefaultMenu,
|
||||||
|
1,
|
||||||
|
"upload",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
templ NewPartial(wantsText bool) {
|
||||||
|
<h2 class="text-xl">submit a new file</h2>
|
||||||
|
<form
|
||||||
|
hx-post="/new"
|
||||||
|
hx-encoding="multipart/form-data"
|
||||||
|
method="POST"
|
||||||
|
hx-target="#main-content"
|
||||||
|
>
|
||||||
|
<div class="my-2 grid grid-cols-1 sm:grid-cols-3 md:grid-cols-5 gap-4 max-w-sm md:max-w-lg">
|
||||||
|
<label class="col-span-1" for="name">
|
||||||
|
file name:
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
class="col-span-2 md:col-span-4 justify-self-start
|
||||||
|
outline-2 bg-amber-50
|
||||||
|
hover:outline-slate-400 hover:outline-dotted
|
||||||
|
focus:outline-slate-600 focus:outline-dashed
|
||||||
|
active:outline-green-600"
|
||||||
|
type="text"
|
||||||
|
name="name"
|
||||||
|
id="name"
|
||||||
|
placeholder="foo.txt"
|
||||||
|
_="on change set #description's @placeholder to `some stuff about ${my value} ...`"
|
||||||
|
/>
|
||||||
|
<label for="lang" class="col-span-1">language:</label>
|
||||||
|
<div class="col-span-2 md:col-span-4">@components.ChooseSyntax("lang")</div>
|
||||||
|
<label class="col-span-1" for="description">description:</label>
|
||||||
|
<textarea
|
||||||
|
class="col-span-2 md:col-span-4 resize-none hover:resize justify-self-start
|
||||||
|
w-full outline-2 bg-amber-50
|
||||||
|
hover:outline-slate-400 hover:outline-dotted
|
||||||
|
focus:outline-slate-600 focus:outline-dashed
|
||||||
|
active:outline-green-600"
|
||||||
|
name="description"
|
||||||
|
id="description"
|
||||||
|
rows="3"
|
||||||
|
placeholder="some stuff about foo.txt ..."
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
if wantsText {
|
||||||
|
@partials.NewTextSubmit()
|
||||||
|
<input type="text" name="wantsText" hidden value="true" />
|
||||||
|
} else {
|
||||||
|
@partials.NewFileUpload()
|
||||||
|
}
|
||||||
|
@components.SubmitFormButton("submit")
|
||||||
|
</form>
|
||||||
|
}
|
|
@ -0,0 +1,136 @@
|
||||||
|
// Code generated by templ@v0.2.316 DO NOT EDIT.
|
||||||
|
|
||||||
|
package pages
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import "context"
|
||||||
|
import "io"
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
"git.myrkvi.com/myrkvi/bin/views/partials"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewFull(wantsText bool) templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_1 := templ.GetChildren(ctx)
|
||||||
|
if var_1 == nil {
|
||||||
|
var_1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
err = page(
|
||||||
|
NewPartial(wantsText),
|
||||||
|
models.DefaultMenu,
|
||||||
|
1,
|
||||||
|
"upload",
|
||||||
|
).Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPartial(wantsText bool) templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_2 := templ.GetChildren(ctx)
|
||||||
|
if var_2 == nil {
|
||||||
|
var_2 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<h2 class=\"text-xl\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_3 := `submit a new file`
|
||||||
|
_, err = templBuffer.WriteString(var_3)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</h2><form hx-post=\"/new\" hx-encoding=\"multipart/form-data\" method=\"POST\" hx-target=\"#main-content\"><div class=\"my-2 grid grid-cols-1 sm:grid-cols-3 md:grid-cols-5 gap-4 max-w-sm md:max-w-lg\"><label class=\"col-span-1\" for=\"name\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_4 := `file name:`
|
||||||
|
_, err = templBuffer.WriteString(var_4)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</label><input class=\"col-span-2 md:col-span-4 justify-self-start\n outline-2 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" type=\"text\" name=\"name\" id=\"name\" placeholder=\"foo.txt\" _=\"on change set #description's @placeholder to `some stuff about ${my value} ...`\"><label for=\"lang\" class=\"col-span-1\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_5 := `language:`
|
||||||
|
_, err = templBuffer.WriteString(var_5)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</label><div class=\"col-span-2 md:col-span-4\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.ChooseSyntax("lang").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</div><label class=\"col-span-1\" for=\"description\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_6 := `description:`
|
||||||
|
_, err = templBuffer.WriteString(var_6)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</label><textarea class=\"col-span-2 md:col-span-4 resize-none hover:resize justify-self-start\n w-full outline-2 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" name=\"description\" id=\"description\" rows=\"3\" placeholder=\"some stuff about foo.txt ...\"></textarea></div>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if wantsText {
|
||||||
|
err = partials.NewTextSubmit().Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString(" <input type=\"text\" name=\"wantsText\" hidden value=\"true\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = partials.NewFileUpload().Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = components.SubmitFormButton("submit").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</form>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,10 +1,8 @@
|
||||||
package pages
|
package pages
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"git.myrkvi.com/myrkvi/bin/models"
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
"git.myrkvi.com/myrkvi/bin/views/components"
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
"git.myrkvi.com/myrkvi/bin/views/partials"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title string) {
|
templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title string) {
|
||||||
|
@ -13,7 +11,7 @@ templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<script src="/static/htmx.min.js"></script>
|
<script src="/static/htmx.min.js"></script>
|
||||||
<script src="/static/_hyperscript.min.js"></script>
|
<script src="/static/hyperscript.min.js"></script>
|
||||||
<link rel="stylesheet" href="/static/tailwind.css" />
|
<link rel="stylesheet" href="/static/tailwind.css" />
|
||||||
if title == "" {
|
if title == "" {
|
||||||
<title id="title">bin</title>
|
<title id="title">bin</title>
|
||||||
|
@ -37,135 +35,3 @@ templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
}
|
}
|
||||||
|
|
||||||
templ IndexFull() {
|
|
||||||
@page(
|
|
||||||
IndexPartial(),
|
|
||||||
models.DefaultMenu,
|
|
||||||
0,
|
|
||||||
"",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
templ IndexPartial() {
|
|
||||||
<h2 class="text-xl">Welcome to <i>bin</i></h2>
|
|
||||||
<p>bin is a simple paste bin.</p>
|
|
||||||
<br />
|
|
||||||
@components.BoostButton("new", "/new")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
templ NewFull(wantsText bool) {
|
|
||||||
@page(
|
|
||||||
NewPartial(wantsText),
|
|
||||||
models.DefaultMenu,
|
|
||||||
1,
|
|
||||||
"upload",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const placeholderCode string = `#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
printf("Hello, world!\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}`
|
|
||||||
|
|
||||||
templ NewPartial(wantsText bool) {
|
|
||||||
<h2 class="text-xl">submit a new file</h2>
|
|
||||||
<form
|
|
||||||
hx-post="/new"
|
|
||||||
hx-encoding="multipart/form-data"
|
|
||||||
method="POST"
|
|
||||||
hx-target="#main-content"
|
|
||||||
>
|
|
||||||
<div class="my-2 grid grid-cols-1 sm:grid-cols-3 md:grid-cols-5 gap-4 max-w-sm md:max-w-lg">
|
|
||||||
<label class="col-span-1" for="name">
|
|
||||||
file name:
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
class="col-span-2 md:col-span-4 justify-self-start
|
|
||||||
outline-2 bg-amber-50
|
|
||||||
hover:outline-slate-400 hover:outline-dotted
|
|
||||||
focus:outline-slate-600 focus:outline-dashed
|
|
||||||
active:outline-green-600"
|
|
||||||
type="text"
|
|
||||||
name="name"
|
|
||||||
id="name"
|
|
||||||
placeholder="foo.txt"
|
|
||||||
_="on change set #description's @placeholder to `some stuff about ${my value} ...`"
|
|
||||||
/>
|
|
||||||
<label for="lang" class="col-span-1">language:</label>
|
|
||||||
<div class="col-span-2 md:col-span-4">@components.ChooseSyntax("lang")</div>
|
|
||||||
<label class="col-span-1" for="description">description:</label>
|
|
||||||
<textarea
|
|
||||||
class="col-span-2 md:col-span-4 resize-none hover:resize justify-self-start
|
|
||||||
w-full outline-2 bg-amber-50
|
|
||||||
hover:outline-slate-400 hover:outline-dotted
|
|
||||||
focus:outline-slate-600 focus:outline-dashed
|
|
||||||
active:outline-green-600"
|
|
||||||
name="description"
|
|
||||||
id="description"
|
|
||||||
rows="3"
|
|
||||||
placeholder="some stuff about foo.txt ..."
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
if wantsText {
|
|
||||||
@partials.NewTextSubmit()
|
|
||||||
<input type="text" name="wantsText" hidden value="true" />
|
|
||||||
} else {
|
|
||||||
@partials.NewFileUpload()
|
|
||||||
}
|
|
||||||
@components.SubmitFormButton("submit")
|
|
||||||
</form>
|
|
||||||
}
|
|
||||||
|
|
||||||
templ BinFull(file models.File) {
|
|
||||||
@page(
|
|
||||||
BinPartial(file),
|
|
||||||
models.DefaultMenu,
|
|
||||||
-1,
|
|
||||||
file.Filename,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
templ BinPartial(file models.File) {
|
|
||||||
<div>
|
|
||||||
<h1 class="text-xl my-2 inline-block">{ file.Filename }
|
|
||||||
if file.Language != "" {
|
|
||||||
<sup class="text-base mx-4">({ file.Language })</sup>
|
|
||||||
}
|
|
||||||
</h1>
|
|
||||||
<p class="italic mx-1 my-2">{ file.Description }</p>
|
|
||||||
<pre class="my-4">{ file.Data }</pre>
|
|
||||||
<div class="relative h-full">
|
|
||||||
<form
|
|
||||||
class="absolute -bottom-32"
|
|
||||||
hx-post={ "/b/" + file.PageKey + "/delete" }
|
|
||||||
hx-confirm="Are you sure you want to delete this?"
|
|
||||||
hx-target="#main-content"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
name="adminKey"
|
|
||||||
id="adminKey"
|
|
||||||
type="text"
|
|
||||||
class="mr-4 w-24 bg-amber-50
|
|
||||||
hover:outline-slate-400 hover:outline-dotted
|
|
||||||
focus:outline-slate-600 focus:outline-dashed
|
|
||||||
active:outline-green-600"
|
|
||||||
placeholder="deletion key"
|
|
||||||
value={ file.AdminKey }
|
|
||||||
/>
|
|
||||||
@components.SubmitFormButton("delete")
|
|
||||||
if file.AdminKey != "" {
|
|
||||||
<a class="text-blue-500 mx-4" href={ templ.URL(fmt.Sprintf("/b/%s?delcode=%s", file.PageKey, file.AdminKey))}><sup>permalink with deletion key</sup></a>
|
|
||||||
}
|
|
||||||
<p class="opacity-0 my-1 max-w-md" _="init if #adminKey's value is not '' log then show me with *opacity">
|
|
||||||
this is your deletion key! <br /> you will need to store it if you want to delete the file.
|
|
||||||
</p>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
|
@ -10,10 +10,8 @@ import "io"
|
||||||
import "bytes"
|
import "bytes"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"git.myrkvi.com/myrkvi/bin/models"
|
"git.myrkvi.com/myrkvi/bin/models"
|
||||||
"git.myrkvi.com/myrkvi/bin/views/components"
|
"git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
"git.myrkvi.com/myrkvi/bin/views/partials"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title string) templ.Component {
|
func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title string) templ.Component {
|
||||||
|
@ -38,7 +36,7 @@ func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = templBuffer.WriteString("</script><script src=\"/static/_hyperscript.min.js\">")
|
_, err = templBuffer.WriteString("</script><script src=\"/static/hyperscript.min.js\">")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -124,386 +122,3 @@ func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func IndexFull() templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_8 := templ.GetChildren(ctx)
|
|
||||||
if var_8 == nil {
|
|
||||||
var_8 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
err = page(
|
|
||||||
IndexPartial(),
|
|
||||||
models.DefaultMenu,
|
|
||||||
0,
|
|
||||||
"",
|
|
||||||
).Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func IndexPartial() templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_9 := templ.GetChildren(ctx)
|
|
||||||
if var_9 == nil {
|
|
||||||
var_9 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
_, err = templBuffer.WriteString("<h2 class=\"text-xl\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_10 := `Welcome to `
|
|
||||||
_, err = templBuffer.WriteString(var_10)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("<i>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_11 := `bin`
|
|
||||||
_, err = templBuffer.WriteString(var_11)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</i></h2><p>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_12 := `bin is a simple paste bin.`
|
|
||||||
_, err = templBuffer.WriteString(var_12)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</p><br>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = components.BoostButton("new", "/new").Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewFull(wantsText bool) templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_13 := templ.GetChildren(ctx)
|
|
||||||
if var_13 == nil {
|
|
||||||
var_13 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
err = page(
|
|
||||||
NewPartial(wantsText),
|
|
||||||
models.DefaultMenu,
|
|
||||||
1,
|
|
||||||
"upload",
|
|
||||||
).Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const placeholderCode string = `#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
printf("Hello, world!\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}`
|
|
||||||
|
|
||||||
func NewPartial(wantsText bool) templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_14 := templ.GetChildren(ctx)
|
|
||||||
if var_14 == nil {
|
|
||||||
var_14 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
_, err = templBuffer.WriteString("<h2 class=\"text-xl\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_15 := `submit a new file`
|
|
||||||
_, err = templBuffer.WriteString(var_15)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</h2><form hx-post=\"/new\" hx-encoding=\"multipart/form-data\" method=\"POST\" hx-target=\"#main-content\"><div class=\"my-2 grid grid-cols-1 sm:grid-cols-3 md:grid-cols-5 gap-4 max-w-sm md:max-w-lg\"><label class=\"col-span-1\" for=\"name\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_16 := `file name:`
|
|
||||||
_, err = templBuffer.WriteString(var_16)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</label><input class=\"col-span-2 md:col-span-4 justify-self-start\n outline-2 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" type=\"text\" name=\"name\" id=\"name\" placeholder=\"foo.txt\" _=\"on change set #description's @placeholder to `some stuff about ${my value} ...`\"><label for=\"lang\" class=\"col-span-1\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_17 := `language:`
|
|
||||||
_, err = templBuffer.WriteString(var_17)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</label><div class=\"col-span-2 md:col-span-4\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = components.ChooseSyntax("lang").Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</div><label class=\"col-span-1\" for=\"description\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_18 := `description:`
|
|
||||||
_, err = templBuffer.WriteString(var_18)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</label><textarea class=\"col-span-2 md:col-span-4 resize-none hover:resize justify-self-start\n w-full outline-2 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" name=\"description\" id=\"description\" rows=\"3\" placeholder=\"some stuff about foo.txt ...\"></textarea></div>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if wantsText {
|
|
||||||
err = partials.NewTextSubmit().Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString(" <input type=\"text\" name=\"wantsText\" hidden value=\"true\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = partials.NewFileUpload().Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = components.SubmitFormButton("submit").Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</form>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func BinFull(file models.File) templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_19 := templ.GetChildren(ctx)
|
|
||||||
if var_19 == nil {
|
|
||||||
var_19 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
err = page(
|
|
||||||
BinPartial(file),
|
|
||||||
models.DefaultMenu,
|
|
||||||
-1,
|
|
||||||
file.Filename,
|
|
||||||
).Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func BinPartial(file models.File) templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_20 := templ.GetChildren(ctx)
|
|
||||||
if var_20 == nil {
|
|
||||||
var_20 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
_, err = templBuffer.WriteString("<div><h1 class=\"text-xl my-2 inline-block\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var var_21 string = file.Filename
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_21))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if file.Language != "" {
|
|
||||||
_, err = templBuffer.WriteString("<sup class=\"text-base mx-4\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_22 := `(`
|
|
||||||
_, err = templBuffer.WriteString(var_22)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var var_23 string = file.Language
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_23))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_24 := `)`
|
|
||||||
_, err = templBuffer.WriteString(var_24)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</sup>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</h1><p class=\"italic mx-1 my-2\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var var_25 string = file.Description
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_25))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</p><pre class=\"my-4\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var var_26 string = file.Data
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(var_26))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</pre><div class=\"relative h-full\"><form class=\"absolute -bottom-32\" hx-post=\"")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString("/b/" + file.PageKey + "/delete"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("\" hx-confirm=\"Are you sure you want to delete this?\" hx-target=\"#main-content\"><input name=\"adminKey\" id=\"adminKey\" type=\"text\" class=\"mr-4 w-24 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" placeholder=\"deletion key\" value=\"")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(file.AdminKey))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = components.SubmitFormButton("delete").Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if file.AdminKey != "" {
|
|
||||||
_, err = templBuffer.WriteString("<a class=\"text-blue-500 mx-4\" href=\"")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var var_27 templ.SafeURL = templ.URL(fmt.Sprintf("/b/%s?delcode=%s", file.PageKey, file.AdminKey))
|
|
||||||
_, err = templBuffer.WriteString(templ.EscapeString(string(var_27)))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("\"><sup>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_28 := `permalink with deletion key`
|
|
||||||
_, err = templBuffer.WriteString(var_28)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</sup></a>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("<p class=\"opacity-0 my-1 max-w-md\" _=\"init if #adminKey's value is not '' log then show me with *opacity\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_29 := `this is your deletion key! `
|
|
||||||
_, err = templBuffer.WriteString(var_29)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("<br> ")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_30 := `you will need to store it if you want to delete the file.`
|
|
||||||
_, err = templBuffer.WriteString(var_30)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</p></form></div></div>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package partials
|
||||||
|
|
||||||
|
import "git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
|
||||||
|
templ EmailForm() {
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="mr-4 w-48 bg-amber-50
|
||||||
|
hover:outline-slate-400 hover:outline-dotted
|
||||||
|
focus:outline-slate-600 focus:outline-dashed
|
||||||
|
active:outline-green-600"
|
||||||
|
name="email"
|
||||||
|
id="email"
|
||||||
|
placeholder="email"
|
||||||
|
/>
|
||||||
|
@components.SubmitFormButton("send")
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Code generated by templ@v0.2.316 DO NOT EDIT.
|
||||||
|
|
||||||
|
package partials
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import "context"
|
||||||
|
import "io"
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
import "git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
|
||||||
|
func EmailForm() templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_1 := templ.GetChildren(ctx)
|
||||||
|
if var_1 == nil {
|
||||||
|
var_1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<input type=\"text\" class=\"mr-4 w-48 bg-amber-50\n hover:outline-slate-400 hover:outline-dotted \n focus:outline-slate-600 focus:outline-dashed\n active:outline-green-600\" name=\"email\" id=\"email\" placeholder=\"email\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.SubmitFormButton("send").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package partials
|
||||||
|
|
||||||
|
import "git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
|
||||||
|
templ NewFileUpload() {
|
||||||
|
<div id="file-submission" class="my-2">
|
||||||
|
<div class="mb-4 flex flex-row justify-start space-x-4">
|
||||||
|
<span
|
||||||
|
class="border-b-4 border-black cursor-pointer"
|
||||||
|
>
|
||||||
|
<b>upload</b>
|
||||||
|
</span>
|
||||||
|
<a
|
||||||
|
hx-get="/partial/new/text"
|
||||||
|
hx-target="#file-submission"
|
||||||
|
hx-swap="outerHTML"
|
||||||
|
class="cursor-pointer border-b-4 border-amber-300"
|
||||||
|
>
|
||||||
|
text
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
@components.FileUpload("browse ...", "file", "file")
|
||||||
|
</div>
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
// Code generated by templ@v0.2.316 DO NOT EDIT.
|
||||||
|
|
||||||
|
package partials
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import "context"
|
||||||
|
import "io"
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
import "git.myrkvi.com/myrkvi/bin/views/components"
|
||||||
|
|
||||||
|
func NewFileUpload() templ.Component {
|
||||||
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
|
if !templIsBuffer {
|
||||||
|
templBuffer = templ.GetBuffer()
|
||||||
|
defer templ.ReleaseBuffer(templBuffer)
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
var_1 := templ.GetChildren(ctx)
|
||||||
|
if var_1 == nil {
|
||||||
|
var_1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, err = templBuffer.WriteString("<div id=\"file-submission\" class=\"my-2\"><div class=\"mb-4 flex flex-row justify-start space-x-4\"><span class=\"border-b-4 border-black cursor-pointer\"><b>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_2 := `upload`
|
||||||
|
_, err = templBuffer.WriteString(var_2)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</b></span><a hx-get=\"/partial/new/text\" hx-target=\"#file-submission\" hx-swap=\"outerHTML\" class=\"cursor-pointer border-b-4 border-amber-300\">")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var_3 := `text`
|
||||||
|
_, err = templBuffer.WriteString(var_3)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</a></div>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = components.FileUpload("browse ...", "file", "file").Render(ctx, templBuffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = templBuffer.WriteString("</div>")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !templIsBuffer {
|
||||||
|
_, err = io.Copy(w, templBuffer)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
package partials
|
package partials
|
||||||
|
|
||||||
import "git.myrkvi.com/myrkvi/bin/views/components"
|
|
||||||
|
|
||||||
const placeholderCode string = `#include <stdio.h>
|
const placeholderCode string = `#include <stdio.h>
|
||||||
|
|
||||||
|
@ -10,26 +9,6 @@ int main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}`
|
}`
|
||||||
|
|
||||||
templ NewFileUpload() {
|
|
||||||
<div id="file-submission" class="my-2">
|
|
||||||
<div class="mb-4 flex flex-row justify-start space-x-4">
|
|
||||||
<span
|
|
||||||
class="border-b-4 border-black cursor-pointer"
|
|
||||||
>
|
|
||||||
<b>upload</b>
|
|
||||||
</span>
|
|
||||||
<a
|
|
||||||
hx-get="/partial/new/text"
|
|
||||||
hx-target="#file-submission"
|
|
||||||
hx-swap="outerHTML"
|
|
||||||
class="cursor-pointer border-b-4 border-amber-300"
|
|
||||||
>
|
|
||||||
text
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
@components.FileUpload("browse ...", "file", "file")
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
templ NewTextSubmit() {
|
templ NewTextSubmit() {
|
||||||
<div id="file-submission" class="my-2">
|
<div id="file-submission" class="my-2">
|
|
@ -9,8 +9,6 @@ import "context"
|
||||||
import "io"
|
import "io"
|
||||||
import "bytes"
|
import "bytes"
|
||||||
|
|
||||||
import "git.myrkvi.com/myrkvi/bin/views/components"
|
|
||||||
|
|
||||||
const placeholderCode string = `#include <stdio.h>
|
const placeholderCode string = `#include <stdio.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
@ -19,7 +17,7 @@ int main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}`
|
}`
|
||||||
|
|
||||||
func NewFileUpload() templ.Component {
|
func NewTextSubmit() templ.Component {
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
||||||
if !templIsBuffer {
|
if !templIsBuffer {
|
||||||
|
@ -32,7 +30,7 @@ func NewFileUpload() templ.Component {
|
||||||
var_1 = templ.NopComponent
|
var_1 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, err = templBuffer.WriteString("<div id=\"file-submission\" class=\"my-2\"><div class=\"mb-4 flex flex-row justify-start space-x-4\"><span class=\"border-b-4 border-black cursor-pointer\"><b>")
|
_, err = templBuffer.WriteString("<div id=\"file-submission\" class=\"my-2\"><div class=\"mb-4 flex flex-row justify-start space-x-4\"><a hx-get=\"/partial/new/upload\" hx-target=\"#file-submission\" hx-swap=\"outerHTML\" class=\"cursor-pointer border-b-4 border-amber-300\">")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -41,7 +39,7 @@ func NewFileUpload() templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = templBuffer.WriteString("</b></span><a hx-get=\"/partial/new/text\" hx-target=\"#file-submission\" hx-swap=\"outerHTML\" class=\"cursor-pointer border-b-4 border-amber-300\">")
|
_, err = templBuffer.WriteString("</a><span class=\"border-b-4 border-black cursor-pointer\"><b>")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -50,62 +48,12 @@ func NewFileUpload() templ.Component {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = templBuffer.WriteString("</a></div>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = components.FileUpload("browse ...", "file", "file").Render(ctx, templBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</div>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !templIsBuffer {
|
|
||||||
_, err = io.Copy(w, templBuffer)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewTextSubmit() templ.Component {
|
|
||||||
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
|
|
||||||
templBuffer, templIsBuffer := w.(*bytes.Buffer)
|
|
||||||
if !templIsBuffer {
|
|
||||||
templBuffer = templ.GetBuffer()
|
|
||||||
defer templ.ReleaseBuffer(templBuffer)
|
|
||||||
}
|
|
||||||
ctx = templ.InitializeContext(ctx)
|
|
||||||
var_4 := templ.GetChildren(ctx)
|
|
||||||
if var_4 == nil {
|
|
||||||
var_4 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
_, err = templBuffer.WriteString("<div id=\"file-submission\" class=\"my-2\"><div class=\"mb-4 flex flex-row justify-start space-x-4\"><a hx-get=\"/partial/new/upload\" hx-target=\"#file-submission\" hx-swap=\"outerHTML\" class=\"cursor-pointer border-b-4 border-amber-300\">")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_5 := `upload`
|
|
||||||
_, err = templBuffer.WriteString(var_5)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</a><span class=\"border-b-4 border-black cursor-pointer\"><b>")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var_6 := `text`
|
|
||||||
_, err = templBuffer.WriteString(var_6)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = templBuffer.WriteString("</b></span></div><label for=\"text\">")
|
_, err = templBuffer.WriteString("</b></span></div><label for=\"text\">")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var_7 := `paste/type your text here:`
|
var_4 := `paste/type your text here:`
|
||||||
_, err = templBuffer.WriteString(var_7)
|
_, err = templBuffer.WriteString(var_4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
Loading…
Reference in New Issue