more restructuring; email

This commit is contained in:
Vegard Berg 2023-09-12 22:30:58 +02:00
parent cae11a2e19
commit 77ba4bded8
30 changed files with 1094 additions and 713 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@ bin
*.db
tmp
tmp/*
config.toml

View File

@ -1,16 +1,29 @@
package main
package config
import (
"github.com/sirupsen/logrus"
"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("port", 8080)
viper.SetDefault("db_path", "bin.db")
viper.SetDefault("smtp.enabled", false)
viper.SetDefault("user.registration_enabled", false)
viper.SetDefault("base_url", "localhost")
viper.SetConfigName("config")
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
}

81
controllers/email.go Normal file
View File

@ -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>")
}

View File

@ -28,6 +28,7 @@ func PostNewHandler(c echo.Context) error {
name := c.FormValue("name")
description := c.FormValue("description")
lang := c.FormValue("lang")
ip := c.RealIP()
if (file == nil || err != nil) && text == "" {
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 {
return utils.RenderErrorToast(c, "server-side error occurred")
}

View File

@ -17,3 +17,7 @@ func GetPartialTextHandler(c echo.Context) error {
c.Response().Header().Add("HX-Push", "/new?text")
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
View File

@ -23,6 +23,7 @@ require (
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/glebarez/go-sqlite v1.21.2 // 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/universal-translator v0.18.1 // 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/time v0.3.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/yaml.v3 v3.0.1 // indirect
gorm.io/gorm v1.25.4 // indirect

4
go.sum
View File

@ -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/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-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/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
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 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=

14
main.go
View File

@ -1,8 +1,10 @@
package main
import (
"embed"
"fmt"
"git.myrkvi.com/myrkvi/bin/config"
"git.myrkvi.com/myrkvi/bin/controllers"
"git.myrkvi.com/myrkvi/bin/global"
"git.myrkvi.com/myrkvi/bin/models"
@ -15,13 +17,16 @@ import (
"gorm.io/gorm"
)
//go:embed static
var static embed.FS
func main() {
logrus.SetLevel(logrus.DebugLevel)
logrus.SetFormatter(&prefixed.TextFormatter{
FullTimestamp: true,
})
logrus.Infoln("Application started.")
initConfig()
config.InitConfig()
db_string := "bin.db"
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("/new", controllers.GetNewHandler)
e.POST("/new", controllers.PostNewHandler)
e.GET("/b/:id", controllers.GetBinHandler)
e.POST("/b/:id/delete", controllers.DeleteBinHandler)
e.POST("/b/:id/email", controllers.PostEmailHandler)
partial := e.Group("/partial")
partial.GET("/email", controllers.GetPartialEmailForm)
new := partial.Group("/new")
new.GET("/upload", controllers.GetPartialUploadHandler)
new.GET("/text", controllers.GetPartialTextHandler)

33
models/file.go Normal file
View File

@ -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
}

View File

@ -4,46 +4,9 @@ import (
"reflect"
"github.com/sirupsen/logrus"
"golang.org/x/crypto/bcrypt"
"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) {
tables := []interface{}{
File{},
@ -62,19 +25,3 @@ func DatabaseMigrations(db *gorm.DB) {
}
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
}

21
models/user.go Normal file
View File

@ -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
}

View File

@ -682,6 +682,10 @@ video {
width: 6rem;
}
.w-48 {
width: 12rem;
}
.w-fit {
width: -moz-fit-content;
width: fit-content;

View File

@ -61,6 +61,7 @@ templ FileUpload(text, name, id string) {
templ BoostButton(label, to string) {
<span hx-boost="true">
<a
tabindex="0"
role="button"
class="transition ease-in-out
px-1 outline outline-1
@ -75,6 +76,28 @@ templ BoostButton(label, to string) {
</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) {
<input
type="submit"
@ -120,11 +143,6 @@ templ NavMenu(items []models.MenuItem, current int, swapOob bool) {
</nav>
}
// templ CombineTempls(top, bottom templ.Component) {
// {! top }
// {! bottom }
// }
templ CombineTempls(comps ...templ.Component) {
for _, comp := range comps {
{! comp }

View File

@ -199,7 +199,7 @@ func BoostButton(label, to string) templ.Component {
var_7 = templ.NopComponent
}
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 {
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) {
templBuffer, templIsBuffer := w.(*bytes.Buffer)
if !templIsBuffer {
@ -241,6 +241,79 @@ func SubmitFormButton(label string) templ.Component {
var_10 = templ.NopComponent
}
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=\"")
if err != nil {
return err
@ -268,9 +341,9 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_11 := templ.GetChildren(ctx)
if var_11 == nil {
var_11 = templ.NopComponent
var_13 := templ.GetChildren(ctx)
if var_13 == nil {
var_13 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, 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 {
return err
}
var var_12 string = item.Label
_, err = templBuffer.WriteString(templ.EscapeString(var_12))
var var_14 string = item.Label
_, err = templBuffer.WriteString(templ.EscapeString(var_14))
if err != nil {
return err
}
@ -307,8 +380,8 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
if err != nil {
return err
}
var var_13 templ.SafeURL = templ.URL(item.Href)
_, err = templBuffer.WriteString(templ.EscapeString(string(var_13)))
var var_15 templ.SafeURL = templ.URL(item.Href)
_, err = templBuffer.WriteString(templ.EscapeString(string(var_15)))
if err != nil {
return err
}
@ -316,8 +389,8 @@ func NavMenu(items []models.MenuItem, current int, swapOob bool) templ.Component
if err != nil {
return err
}
var var_14 string = item.Label
_, err = templBuffer.WriteString(templ.EscapeString(var_14))
var var_16 string = item.Label
_, err = templBuffer.WriteString(templ.EscapeString(var_16))
if err != nil {
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 {
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
templBuffer, templIsBuffer := w.(*bytes.Buffer)
@ -351,9 +419,9 @@ func CombineTempls(comps ...templ.Component) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_15 := templ.GetChildren(ctx)
if var_15 == nil {
var_15 = templ.NopComponent
var_17 := templ.GetChildren(ctx)
if var_17 == nil {
var_17 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
for _, comp := range comps {
@ -377,9 +445,9 @@ func ErrorMessage(msg, id string) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_16 := templ.GetChildren(ctx)
if var_16 == nil {
var_16 = templ.NopComponent
var_18 := templ.GetChildren(ctx)
if var_18 == nil {
var_18 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, err = templBuffer.WriteString("<div id=\"")
@ -394,8 +462,8 @@ func ErrorMessage(msg, id string) templ.Component {
if err != nil {
return err
}
var var_17 string = msg
_, err = templBuffer.WriteString(templ.EscapeString(var_17))
var var_19 string = msg
_, err = templBuffer.WriteString(templ.EscapeString(var_19))
if err != nil {
return err
}
@ -418,17 +486,17 @@ func ToastError(message string) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_18 := templ.GetChildren(ctx)
if var_18 == nil {
var_18 = templ.NopComponent
var_20 := templ.GetChildren(ctx)
if var_20 == nil {
var_20 = templ.NopComponent
}
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&#39;s opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
if err != nil {
return err
}
var_19 := `&#x1F7AC;`
_, err = templBuffer.WriteString(var_19)
var_21 := `&#x1F7AC;`
_, err = templBuffer.WriteString(var_21)
if err != nil {
return err
}
@ -436,8 +504,8 @@ func ToastError(message string) templ.Component {
if err != nil {
return err
}
var var_20 string = message
_, err = templBuffer.WriteString(templ.EscapeString(var_20))
var var_22 string = message
_, err = templBuffer.WriteString(templ.EscapeString(var_22))
if err != nil {
return err
}
@ -460,17 +528,17 @@ func ToastSuccess(message string) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_21 := templ.GetChildren(ctx)
if var_21 == nil {
var_21 = templ.NopComponent
var_23 := templ.GetChildren(ctx)
if var_23 == nil {
var_23 = templ.NopComponent
}
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&#39;s opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
if err != nil {
return err
}
var_22 := `&#x1F7AC;`
_, err = templBuffer.WriteString(var_22)
var_24 := `&#x1F7AC;`
_, err = templBuffer.WriteString(var_24)
if err != nil {
return err
}
@ -478,8 +546,8 @@ func ToastSuccess(message string) templ.Component {
if err != nil {
return err
}
var var_23 string = message
_, err = templBuffer.WriteString(templ.EscapeString(var_23))
var var_25 string = message
_, err = templBuffer.WriteString(templ.EscapeString(var_25))
if err != nil {
return err
}
@ -502,9 +570,9 @@ func SwapOOB(swapspec string, component templ.Component) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_24 := templ.GetChildren(ctx)
if var_24 == nil {
var_24 = templ.NopComponent
var_26 := templ.GetChildren(ctx)
if var_26 == nil {
var_26 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, err = templBuffer.WriteString("<div hx-swap-oob=\"")
@ -542,9 +610,9 @@ func SetTitle(title string) templ.Component {
defer templ.ReleaseBuffer(templBuffer)
}
ctx = templ.InitializeContext(ctx)
var_25 := templ.GetChildren(ctx)
if var_25 == nil {
var_25 = templ.NopComponent
var_27 := templ.GetChildren(ctx)
if var_27 == nil {
var_27 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, err = templBuffer.WriteString("<title id=\"title\" hx-swap-oob=\"true\">")
@ -552,14 +620,14 @@ func SetTitle(title string) templ.Component {
return err
}
if title == "" {
var_26 := `bin`
_, err = templBuffer.WriteString(var_26)
var_28 := `bin`
_, err = templBuffer.WriteString(var_28)
if err != nil {
return err
}
} else {
var var_27 string = title
_, err = templBuffer.WriteString(templ.EscapeString(var_27))
var var_29 string = title
_, err = templBuffer.WriteString(templ.EscapeString(var_29))
if err != nil {
return err
}
@ -567,8 +635,8 @@ func SetTitle(title string) templ.Component {
if err != nil {
return err
}
var_28 := `- bin`
_, err = templBuffer.WriteString(var_28)
var_30 := `- bin`
_, err = templBuffer.WriteString(var_30)
if err != nil {
return err
}

64
views/pages/bin.templ Normal file
View File

@ -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>
}

223
views/pages/bin_templ.go Normal file
View File

@ -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&#39;s value is not &#39;&#39; 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
})
}

24
views/pages/index.templ Normal file
View File

@ -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")
}

View File

@ -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
})
}

65
views/pages/new.templ Normal file
View File

@ -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>
}

136
views/pages/new_templ.go Normal file
View File

@ -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&#39;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
})
}

View File

@ -1,10 +1,8 @@
package pages
import (
"fmt"
"git.myrkvi.com/myrkvi/bin/models"
"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) {
@ -13,7 +11,7 @@ templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<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" />
if title == "" {
<title id="title">bin</title>
@ -37,135 +35,3 @@ templ page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
</body>
</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>
}

View File

@ -10,10 +10,8 @@ import "io"
import "bytes"
import (
"fmt"
"git.myrkvi.com/myrkvi/bin/models"
"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 {
@ -38,7 +36,7 @@ func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
if err != nil {
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 {
return err
}
@ -124,386 +122,3 @@ func page(inner templ.Component, menu []models.MenuItem, currentMenu int, title
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&#39;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&#39;s value is not &#39;&#39; 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
})
}

View File

@ -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")
}

View File

@ -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
})
}

View File

@ -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>
}

View File

@ -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
})
}

View File

@ -1,6 +1,5 @@
package partials
import "git.myrkvi.com/myrkvi/bin/views/components"
const placeholderCode string = `#include <stdio.h>
@ -10,26 +9,6 @@ int main(int argc, char *argv[]) {
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() {
<div id="file-submission" class="my-2">

View File

@ -9,8 +9,6 @@ import "context"
import "io"
import "bytes"
import "git.myrkvi.com/myrkvi/bin/views/components"
const placeholderCode string = `#include <stdio.h>
int main(int argc, char *argv[]) {
@ -19,7 +17,7 @@ int main(int argc, char *argv[]) {
return 0;
}`
func NewFileUpload() templ.Component {
func NewTextSubmit() templ.Component {
return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
templBuffer, templIsBuffer := w.(*bytes.Buffer)
if !templIsBuffer {
@ -32,7 +30,7 @@ func NewFileUpload() templ.Component {
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>")
_, 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
}
@ -41,7 +39,7 @@ func NewFileUpload() templ.Component {
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\">")
_, err = templBuffer.WriteString("</a><span class=\"border-b-4 border-black cursor-pointer\"><b>")
if err != nil {
return err
}
@ -50,62 +48,12 @@ func NewFileUpload() templ.Component {
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
})
}
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\">")
if err != nil {
return err
}
var_7 := `paste/type your text here:`
_, err = templBuffer.WriteString(var_7)
var_4 := `paste/type your text here:`
_, err = templBuffer.WriteString(var_4)
if err != nil {
return err
}