more restructuring; email
This commit is contained in:
parent
cae11a2e19
commit
77ba4bded8
|
@ -2,3 +2,4 @@ bin
|
|||
*.db
|
||||
tmp
|
||||
tmp/*
|
||||
config.toml
|
|
@ -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
|
||||
}
|
|
@ -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")
|
||||
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")
|
||||
}
|
||||
|
|
|
@ -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
2
go.mod
|
@ -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
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/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
14
main.go
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
||||
"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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
.w-48 {
|
||||
width: 12rem;
|
||||
}
|
||||
|
||||
.w-fit {
|
||||
width: -moz-fit-content;
|
||||
width: fit-content;
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var_19 := `🞬`
|
||||
_, err = templBuffer.WriteString(var_19)
|
||||
var_21 := `🞬`
|
||||
_, 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's opacity to 0 over 500ms\n then remove my parentElement\"><sup>")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var_22 := `🞬`
|
||||
_, err = templBuffer.WriteString(var_22)
|
||||
var_24 := `🞬`
|
||||
_, 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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
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>
|
||||
}
|
|
@ -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'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
|
||||
|
||||
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">
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue