Compare commits

...

4 Commits

Author SHA1 Message Date
dependabot[bot]
770390c4ea build(deps): bump github.com/wneessen/go-mail from 0.6.2 to 0.7.1 (#1159)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-02 19:37:20 +02:00
Jonas Plum
4e03a52b71 fix: text alignment (#1158) 2025-09-21 16:58:46 +00:00
Jonas Plum
e475b38ea4 refactor: sanitize webhook auth payload (#1157) 2025-09-21 17:26:18 +02:00
Jonas Plum
e07afd0f3a chore: remove admin interface link from dashboard cards (#1156) 2025-09-21 17:25:31 +02:00
21 changed files with 108 additions and 149 deletions

View File

@@ -60,7 +60,7 @@ func runHook(ctx context.Context, queries *sqlc.Queries, collection, event strin
Action: event, Action: event,
Collection: collection, Collection: collection,
Record: record, Record: record,
Auth: auth, Auth: webhook.SanitizeUser(auth),
Admin: nil, Admin: nil,
}) })
if err != nil { if err != nil {

View File

@@ -8,6 +8,7 @@ import (
"io" "io"
"log/slog" "log/slog"
"net/http" "net/http"
"time"
"github.com/SecurityBrewery/catalyst/app/auth/usercontext" "github.com/SecurityBrewery/catalyst/app/auth/usercontext"
"github.com/SecurityBrewery/catalyst/app/database" "github.com/SecurityBrewery/catalyst/app/database"
@@ -35,11 +36,43 @@ func BindHooks(hooks *hook.Hooks, queries *sqlc.Queries) {
} }
type Payload struct { type Payload struct {
Action string `json:"action"` Action string `json:"action"`
Collection string `json:"collection"` Collection string `json:"collection"`
Record any `json:"record"` Record any `json:"record"`
Auth *sqlc.User `json:"auth,omitempty"` Auth *AuthUser `json:"auth,omitempty"`
Admin *sqlc.User `json:"admin,omitempty"` Admin *AuthUser `json:"admin,omitempty"`
}
type AuthUser struct {
ID string `json:"id"`
Username string `json:"username"`
Active bool `json:"active"`
Name *string `json:"name,omitempty"`
Email *string `json:"email,omitempty"`
Avatar *string `json:"avatar,omitempty"`
Lastresetsentat *time.Time `json:"lastresetsentat,omitempty"`
Lastverificationsentat *time.Time `json:"lastverificationsentat,omitempty"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
}
func SanitizeUser(user *sqlc.User) *AuthUser {
if user == nil {
return nil
}
return &AuthUser{
ID: user.ID,
Username: user.Username,
Active: user.Active,
Name: user.Name,
Email: user.Email,
Avatar: user.Avatar,
Lastresetsentat: user.Lastresetsentat,
Lastverificationsentat: user.Lastverificationsentat,
Created: user.Created,
Updated: user.Updated,
}
} }
func event(ctx context.Context, queries *sqlc.Queries, event, collection string, record any) { func event(ctx context.Context, queries *sqlc.Queries, event, collection string, record any) {
@@ -67,7 +100,7 @@ func event(ctx context.Context, queries *sqlc.Queries, event, collection string,
Action: event, Action: event,
Collection: collection, Collection: collection,
Record: record, Record: record,
Auth: user, Auth: SanitizeUser(user),
Admin: nil, Admin: nil,
}) })
if err != nil { if err != nil {

16
go.mod
View File

@@ -20,8 +20,8 @@ require (
github.com/tidwall/sjson v1.2.5 github.com/tidwall/sjson v1.2.5
github.com/tus/tusd/v2 v2.8.0 github.com/tus/tusd/v2 v2.8.0
github.com/urfave/cli/v3 v3.3.8 github.com/urfave/cli/v3 v3.3.8
github.com/wneessen/go-mail v0.6.2 github.com/wneessen/go-mail v0.7.1
golang.org/x/crypto v0.39.0 golang.org/x/crypto v0.41.0
) )
require ( require (
@@ -82,12 +82,12 @@ require (
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect go.uber.org/zap v1.27.0 // indirect
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
golang.org/x/mod v0.25.0 // indirect golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.41.0 // indirect golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.15.0 // indirect golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.33.0 // indirect golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.26.0 // indirect golang.org/x/text v0.29.0 // indirect
golang.org/x/tools v0.34.0 // indirect golang.org/x/tools v0.36.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect google.golang.org/grpc v1.73.0 // indirect

90
go.sum
View File

@@ -59,7 +59,6 @@ github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6
github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY= github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY=
github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
@@ -198,9 +197,8 @@ github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07 h1:mJdDDPblDfP
github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07/go.mod h1:Ak17IJ037caFp4jpCw/iQQ7/W74Sqpb1YuKJU6HTKfM= github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07/go.mod h1:Ak17IJ037caFp4jpCw/iQQ7/W74Sqpb1YuKJU6HTKfM=
github.com/wasilibs/wazero-helpers v0.0.0-20250123031827-cd30c44769bb h1:gQ+ZV4wJke/EBKYciZ2MshEouEHFuinB85dY3f5s1q8= github.com/wasilibs/wazero-helpers v0.0.0-20250123031827-cd30c44769bb h1:gQ+ZV4wJke/EBKYciZ2MshEouEHFuinB85dY3f5s1q8=
github.com/wasilibs/wazero-helpers v0.0.0-20250123031827-cd30c44769bb/go.mod h1:jMeV4Vpbi8osrE/pKUxRZkVaA0EX7NZN0A9/oRzgpgY= github.com/wasilibs/wazero-helpers v0.0.0-20250123031827-cd30c44769bb/go.mod h1:jMeV4Vpbi8osrE/pKUxRZkVaA0EX7NZN0A9/oRzgpgY=
github.com/wneessen/go-mail v0.6.2 h1:c6V7c8D2mz868z9WJ+8zDKtUyLfZ1++uAZmo2GRFji8= github.com/wneessen/go-mail v0.7.1 h1:rvy63sp14N06/kdGqCYwW8Na5gDCXjTQM1E7So4PuKk=
github.com/wneessen/go-mail v0.6.2/go.mod h1:L/PYjPK3/2ZlNb2/FjEBIn9n1rUWjW+Toy531oVmeb4= github.com/wneessen/go-mail v0.7.1/go.mod h1:+TkW6QP3EVkgTEqHtVmnAE/1MRhmzb8Y9/W3pweuS+k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
@@ -229,91 +227,35 @@ go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=

View File

@@ -62,7 +62,7 @@ watch(
<div v-for="(property, key) in schema?.properties" :key="key"> <div v-for="(property, key) in schema?.properties" :key="key">
<FormField v-if="property.enum" :name="key" v-slot="{ componentField }" v-model="formdata[key]"> <FormField v-if="property.enum" :name="key" v-slot="{ componentField }" v-model="formdata[key]">
<FormItem> <FormItem>
<FormLabel :for="key" class="text-right"> <FormLabel :for="key" class="text-left">
{{ property.title }} {{ property.title }}
</FormLabel> </FormLabel>
<Select :id="key" class="col-span-3" v-bind="componentField"> <Select :id="key" class="col-span-3" v-bind="componentField">
@@ -87,7 +87,7 @@ watch(
v-model="formdata[key]" v-model="formdata[key]"
> >
<FormItem> <FormItem>
<FormLabel :for="key" class="text-right"> <FormLabel :for="key" class="text-left">
{{ property.title }} {{ property.title }}
</FormLabel> </FormLabel>
<Input :id="key" class="col-span-3" v-bind="componentField" /> <Input :id="key" class="col-span-3" v-bind="componentField" />
@@ -120,7 +120,7 @@ watch(
v-model="formdata[key]" v-model="formdata[key]"
> >
<FormItem> <FormItem>
<FormLabel :for="key" class="text-right"> <FormLabel :for="key" class="text-left">
{{ property.title }} {{ property.title }}
</FormLabel> </FormLabel>
<Input :id="key" class="col-span-3" type="number" v-bind="componentField" /> <Input :id="key" class="col-span-3" type="number" v-bind="componentField" />

View File

@@ -133,7 +133,7 @@ const permissionItems = computed(() => config.value?.permissions || [])
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="name" v-slot="{ componentField }" validate-on-input> <FormField name="name" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="name" class="text-right">Name</FormLabel> <FormLabel for="name" class="text-left">Name</FormLabel>
<Input <Input
id="name" id="name"
class="col-span-3" class="col-span-3"
@@ -152,7 +152,7 @@ const permissionItems = computed(() => config.value?.permissions || [])
> >
<FormItem id="permissions" class="w-full"> <FormItem id="permissions" class="w-full">
<div class="space-y-0.5"> <div class="space-y-0.5">
<FormLabel for="permissions" class="text-right">Permissions</FormLabel> <FormLabel for="permissions" class="text-left">Permissions</FormLabel>
</div> </div>
<FormControl> <FormControl>
<MultiSelect <MultiSelect

View File

@@ -82,7 +82,7 @@ watch(
<form @submit="onSubmit" @change="change"> <form @submit="onSubmit" @change="change">
<FormField name="group" v-slot="{ componentField }"> <FormField name="group" v-slot="{ componentField }">
<FormItem> <FormItem>
<FormLabel for="group" class="text-right"> Group</FormLabel> <FormLabel for="group" class="text-left"> Group</FormLabel>
<Select id="group" v-bind="componentField"> <Select id="group" v-bind="componentField">
<SelectTrigger> <SelectTrigger>
<SelectValue placeholder="Select a group" /> <SelectValue placeholder="Select a group" />

View File

@@ -13,7 +13,7 @@ import {
<template> <template>
<FormField name="actiondata.requirements" v-slot="{ componentField }"> <FormField name="actiondata.requirements" v-slot="{ componentField }">
<FormItem> <FormItem>
<FormLabel for="requirements" class="text-right">requirements.txt</FormLabel> <FormLabel for="requirements" class="text-left">requirements.txt</FormLabel>
<FormControl> <FormControl>
<GrowTextarea id="requirements" class="col-span-3" v-bind="componentField" /> <GrowTextarea id="requirements" class="col-span-3" v-bind="componentField" />
</FormControl> </FormControl>
@@ -23,7 +23,7 @@ import {
</FormField> </FormField>
<FormField name="actiondata.script" v-slot="{ componentField }" validate-on-input> <FormField name="actiondata.script" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="script" class="text-right">Script</FormLabel> <FormLabel for="script" class="text-left">Script</FormLabel>
<FormControl> <FormControl>
<GrowTextarea id="script" class="col-span-3" v-bind="componentField" /> <GrowTextarea id="script" class="col-span-3" v-bind="componentField" />
</FormControl> </FormControl>

View File

@@ -14,7 +14,7 @@ import { Input } from '@/components/ui/input'
<template> <template>
<FormField name="actiondata.headers" v-slot="{ value, handleChange }"> <FormField name="actiondata.headers" v-slot="{ value, handleChange }">
<FormItem> <FormItem>
<FormLabel for="headers" class="text-right">Headers</FormLabel> <FormLabel for="headers" class="text-left">Headers</FormLabel>
<FormControl> <FormControl>
<GrowListTextarea <GrowListTextarea
id="headers" id="headers"
@@ -29,7 +29,7 @@ import { Input } from '@/components/ui/input'
</FormField> </FormField>
<FormField name="actiondata.url" v-slot="{ componentField }" validate-on-input> <FormField name="actiondata.url" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="url" class="text-right">URL</FormLabel> <FormLabel for="url" class="text-left">URL</FormLabel>
<FormControl> <FormControl>
<Input id="url" v-bind="componentField" placeholder="https://example.com/webhook" /> <Input id="url" v-bind="componentField" placeholder="https://example.com/webhook" />
</FormControl> </FormControl>

View File

@@ -267,7 +267,7 @@ const curlExample = computed(() => {
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="name" v-slot="{ componentField }" validate-on-input> <FormField name="name" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="name" class="text-right">Name</FormLabel> <FormLabel for="name" class="text-left">Name</FormLabel>
<Input id="name" class="col-span-3" v-bind="componentField" /> <Input id="name" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -280,7 +280,7 @@ const curlExample = computed(() => {
<CardContent class="flex flex-col gap-4"> <CardContent class="flex flex-col gap-4">
<FormField name="trigger" v-slot="{ componentField }" validate-on-input> <FormField name="trigger" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="trigger" class="text-right">Type</FormLabel> <FormLabel for="trigger" class="text-left">Type</FormLabel>
<FormControl> <FormControl>
<Select id="trigger" class="col-span-3" v-bind="componentField"> <Select id="trigger" class="col-span-3" v-bind="componentField">
<SelectTrigger class="font-medium"> <SelectTrigger class="font-medium">
@@ -321,7 +321,7 @@ const curlExample = computed(() => {
<CardContent class="flex flex-col gap-4"> <CardContent class="flex flex-col gap-4">
<FormField name="action" v-slot="{ componentField }" validate-on-input> <FormField name="action" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="action" class="text-right">Type</FormLabel> <FormLabel for="action" class="text-left">Type</FormLabel>
<FormControl> <FormControl>
<Select id="action" class="col-span-3" v-bind="componentField"> <Select id="action" class="col-span-3" v-bind="componentField">
<SelectTrigger class="font-medium"> <SelectTrigger class="font-medium">

View File

@@ -14,7 +14,7 @@ import {
<template> <template>
<FormField name="triggerdata.collections" v-slot="{ componentField }" validate-on-input> <FormField name="triggerdata.collections" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="collections" class="text-right">Collections</FormLabel> <FormLabel for="collections" class="text-left">Collections</FormLabel>
<FormControl> <FormControl>
<TriggerHookFormFieldCollections id="collections" v-bind="componentField" /> <TriggerHookFormFieldCollections id="collections" v-bind="componentField" />
</FormControl> </FormControl>
@@ -25,7 +25,7 @@ import {
<FormField name="triggerdata.events" v-slot="{ componentField }" validate-on-input> <FormField name="triggerdata.events" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="events" class="text-right">Events</FormLabel> <FormLabel for="events" class="text-left">Events</FormLabel>
<FormControl> <FormControl>
<TriggerHookFormFieldEvents id="events" v-bind="componentField" /> <TriggerHookFormFieldEvents id="events" v-bind="componentField" />
</FormControl> </FormControl>

View File

@@ -13,7 +13,7 @@ import { Input } from '@/components/ui/input'
<template> <template>
<FormField name="triggerdata.expression" v-slot="{ componentField }" validate-on-input> <FormField name="triggerdata.expression" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="expression" class="text-right"> Cron Expression </FormLabel> <FormLabel for="expression" class="text-left"> Cron Expression </FormLabel>
<FormControl> <FormControl>
<Input <Input
id="expression" id="expression"

View File

@@ -13,7 +13,7 @@ import { Input } from '@/components/ui/input'
<template> <template>
<FormField name="triggerdata.token" v-slot="{ componentField }" validate-on-input> <FormField name="triggerdata.token" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="token" class="text-right">Token</FormLabel> <FormLabel for="token" class="text-left">Token</FormLabel>
<FormControl> <FormControl>
<Input id="token" class="col-span-3" v-bind="componentField" placeholder="Enter a token" /> <Input id="token" class="col-span-3" v-bind="componentField" placeholder="Enter a token" />
</FormControl> </FormControl>
@@ -27,7 +27,7 @@ import { Input } from '@/components/ui/input'
<FormField name="triggerdata.path" v-slot="{ componentField }" validate-on-input> <FormField name="triggerdata.path" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="path" class="text-right">Path</FormLabel> <FormLabel for="path" class="text-left">Path</FormLabel>
<FormControl> <FormControl>
<Input id="path" class="col-span-3" v-bind="componentField" placeholder="Enter a path" /> <Input id="path" class="col-span-3" v-bind="componentField" placeholder="Enter a path" />
</FormControl> </FormControl>

View File

@@ -225,7 +225,7 @@ const onSubmit = handleSubmit((vals) => {
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="meta.appName" v-slot="{ componentField }" validate-on-input> <FormField name="meta.appName" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="meta.appName" class="text-right">App Name</FormLabel> <FormLabel for="meta.appName" class="text-left">App Name</FormLabel>
<Input id="meta.appName" class="col-span-3" v-bind="componentField" /> <Input id="meta.appName" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -233,7 +233,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="meta.appUrl" v-slot="{ componentField }" validate-on-input> <FormField name="meta.appUrl" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="meta.appUrl" class="text-right">App URL</FormLabel> <FormLabel for="meta.appUrl" class="text-left">App URL</FormLabel>
<Input id="meta.appUrl" class="col-span-3" v-bind="componentField" /> <Input id="meta.appUrl" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -241,7 +241,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="meta.senderName" v-slot="{ componentField }" validate-on-input> <FormField name="meta.senderName" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="meta.senderName" class="text-right">Sender Name</FormLabel> <FormLabel for="meta.senderName" class="text-left">Sender Name</FormLabel>
<Input id="meta.senderName" class="col-span-3" v-bind="componentField" /> <Input id="meta.senderName" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -249,7 +249,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="meta.senderAddress" v-slot="{ componentField }" validate-on-input> <FormField name="meta.senderAddress" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="meta.senderAddress" class="text-right">Sender Address</FormLabel> <FormLabel for="meta.senderAddress" class="text-left">Sender Address</FormLabel>
<Input id="meta.senderAddress" type="email" class="col-span-3" v-bind="componentField" /> <Input id="meta.senderAddress" type="email" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -262,7 +262,7 @@ const onSubmit = handleSubmit((vals) => {
<CardContent class="flex flex-col gap-4"> <CardContent class="flex flex-col gap-4">
<FormField name="maxDays" v-slot="{ componentField }" validate-on-input> <FormField name="maxDays" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="maxDays" class="text-right">Max Days</FormLabel> <FormLabel for="maxDays" class="text-left">Max Days</FormLabel>
<Input id="maxDays" type="number" class="col-span-3" v-bind="componentField" /> <Input id="maxDays" type="number" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -270,7 +270,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="logLevel" v-slot="{ componentField }" validate-on-input> <FormField name="logLevel" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="logLevel" class="text-right">Log Level</FormLabel> <FormLabel for="logLevel" class="text-left">Log Level</FormLabel>
<FormControl> <FormControl>
<Select id="logLevel" class="col-span-3" v-bind="componentField"> <Select id="logLevel" class="col-span-3" v-bind="componentField">
<SelectTrigger class="font-medium"> <SelectTrigger class="font-medium">
@@ -328,7 +328,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.host" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.host" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="smtp.host" class="text-right">Host</FormLabel> <FormLabel for="smtp.host" class="text-left">Host</FormLabel>
<Input id="smtp.host" class="col-span-3" v-bind="componentField" /> <Input id="smtp.host" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
<FormDescription>SMTP server hostname (e.g., smtp.gmail.com)</FormDescription> <FormDescription>SMTP server hostname (e.g., smtp.gmail.com)</FormDescription>
@@ -337,7 +337,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.port" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.port" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="smtp.port" class="text-right">Port</FormLabel> <FormLabel for="smtp.port" class="text-left">Port</FormLabel>
<Input id="smtp.port" type="number" class="col-span-3" v-bind="componentField" /> <Input id="smtp.port" type="number" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
<FormDescription>Common ports: 25, 465 (SSL), 587 (TLS)</FormDescription> <FormDescription>Common ports: 25, 465 (SSL), 587 (TLS)</FormDescription>
@@ -346,7 +346,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.username" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.username" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="smtp.username" class="text-right">Username</FormLabel> <FormLabel for="smtp.username" class="text-left">Username</FormLabel>
<Input id="smtp.username" class="col-span-3" v-bind="componentField" /> <Input id="smtp.username" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -354,7 +354,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.password" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.password" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="smtp.password" class="text-right">Password</FormLabel> <FormLabel for="smtp.password" class="text-left">Password</FormLabel>
<Input id="smtp.password" type="password" class="col-span-3" v-bind="componentField" /> <Input id="smtp.password" type="password" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -362,7 +362,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.authMethod" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.authMethod" v-slot="{ componentField }" validate-on-input>
<FormItem> <FormItem>
<FormLabel for="smtp.authMethod" class="text-right"> Authentication Method </FormLabel> <FormLabel for="smtp.authMethod" class="text-left"> Authentication Method </FormLabel>
<Select id="smtp.authMethod" class="col-span-3" v-bind="componentField"> <Select id="smtp.authMethod" class="col-span-3" v-bind="componentField">
<SelectTrigger class="font-medium"> <SelectTrigger class="font-medium">
<SelectValue placeholder="Select authentication method" /> <SelectValue placeholder="Select authentication method" />
@@ -392,7 +392,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="smtp.localName" v-slot="{ componentField }" validate-on-input> <FormField name="smtp.localName" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="smtp.localName" class="text-right">HELO domain</FormLabel> <FormLabel for="smtp.localName" class="text-left">HELO domain</FormLabel>
<Input id="smtp.localName" class="col-span-3" v-bind="componentField" /> <Input id="smtp.localName" class="col-span-3" v-bind="componentField" />
<FormDescription>Optional. Leave empty to use default hostname.</FormDescription> <FormDescription>Optional. Leave empty to use default hostname.</FormDescription>
<FormMessage /> <FormMessage />
@@ -408,7 +408,7 @@ const onSubmit = handleSubmit((vals) => {
<CardContent class="flex flex-col gap-4"> <CardContent class="flex flex-col gap-4">
<FormField name="cron" v-slot="{ componentField }" validate-on-input> <FormField name="cron" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="cron" class="text-right">Cron Expression</FormLabel> <FormLabel for="cron" class="text-left">Cron Expression</FormLabel>
<Input id="cron" class="col-span-3" v-bind="componentField" /> <Input id="cron" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -416,7 +416,7 @@ const onSubmit = handleSubmit((vals) => {
<FormField name="cronMaxKeep" v-slot="{ componentField }" validate-on-input> <FormField name="cronMaxKeep" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="cronMaxKeep" class="text-right">Max Keep</FormLabel> <FormLabel for="cronMaxKeep" class="text-left">Max Keep</FormLabel>
<Input id="cronMaxKeep" type="number" class="col-span-3" v-bind="componentField" /> <Input id="cronMaxKeep" type="number" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -142,7 +142,7 @@ watch(
<form @submit="onSubmit"> <form @submit="onSubmit">
<FormField name="name" v-slot="{ componentField }" v-model="name"> <FormField name="name" v-slot="{ componentField }" v-model="name">
<FormItem> <FormItem>
<FormLabel for="name" class="text-right">Name</FormLabel> <FormLabel for="name" class="text-left">Name</FormLabel>
<Input id="name" class="col-span-3" v-bind="componentField" /> <Input id="name" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -150,7 +150,7 @@ watch(
<FormField name="description" v-slot="{ componentField }" v-model="description"> <FormField name="description" v-slot="{ componentField }" v-model="description">
<FormItem> <FormItem>
<FormLabel for="description" class="text-right">Description</FormLabel> <FormLabel for="description" class="text-left">Description</FormLabel>
<Input id="description" class="col-span-3" v-bind="componentField" /> <Input id="description" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -86,7 +86,7 @@ const change = () => validate({ mode: 'silent' }).then((res) => (submitDisabled.
<form @submit="onSubmit" @change="change"> <form @submit="onSubmit" @change="change">
<FormField name="name" v-slot="{ componentField }"> <FormField name="name" v-slot="{ componentField }">
<FormItem> <FormItem>
<FormLabel for="name" class="text-right"> Name</FormLabel> <FormLabel for="name" class="text-left"> Name</FormLabel>
<Input id="name" v-bind="componentField" /> <Input id="name" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -94,7 +94,7 @@ const change = () => validate({ mode: 'silent' }).then((res) => (submitDisabled.
<FormField name="url" v-slot="{ componentField }" class="mt-2"> <FormField name="url" v-slot="{ componentField }" class="mt-2">
<FormItem> <FormItem>
<FormLabel for="url" class="text-right"> URL</FormLabel> <FormLabel for="url" class="text-left"> URL</FormLabel>
<Input id="url" v-bind="componentField" /> <Input id="url" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -138,7 +138,7 @@ const onSubmit = handleSubmit((values) => {
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="singular" v-slot="{ componentField }" validate-on-input> <FormField name="singular" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="singular" class="text-right">Singular</FormLabel> <FormLabel for="singular" class="text-left">Singular</FormLabel>
<Input id="singular" class="col-span-3" v-bind="componentField" /> <Input id="singular" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -146,7 +146,7 @@ const onSubmit = handleSubmit((values) => {
<FormField name="plural" v-slot="{ componentField }" validate-on-input> <FormField name="plural" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="plural" class="text-right">Plural</FormLabel> <FormLabel for="plural" class="text-left">Plural</FormLabel>
<Input id="plural" class="col-span-3" v-bind="componentField" /> <Input id="plural" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -153,7 +153,7 @@ const onSubmit = handleSubmit((values) => emit('submit', values))
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="name" v-slot="{ componentField }" validate-on-input> <FormField name="name" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="name" class="text-right">Name</FormLabel> <FormLabel for="name" class="text-left">Name</FormLabel>
<Input id="name" class="col-span-3" v-bind="componentField" /> <Input id="name" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -161,7 +161,7 @@ const onSubmit = handleSubmit((values) => emit('submit', values))
<FormField name="username" v-slot="{ componentField }" validate-on-input> <FormField name="username" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="username" class="text-right">Username</FormLabel> <FormLabel for="username" class="text-left">Username</FormLabel>
<Input id="username" class="col-span-3" v-bind="componentField" /> <Input id="username" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -169,7 +169,7 @@ const onSubmit = handleSubmit((values) => emit('submit', values))
<FormField name="email" v-slot="{ componentField }" validate-on-input> <FormField name="email" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="email" class="text-right">Email</FormLabel> <FormLabel for="email" class="text-left">Email</FormLabel>
<Input id="email" type="email" class="col-span-3" v-bind="componentField" /> <Input id="email" type="email" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -111,7 +111,7 @@ const onSubmit = handleSubmit((values) => emit('submit', values))
<form @submit="onSubmit" class="flex w-full flex-col items-start gap-4"> <form @submit="onSubmit" class="flex w-full flex-col items-start gap-4">
<FormField name="password" v-slot="{ componentField }" validate-on-input> <FormField name="password" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="password" class="text-right">Password</FormLabel> <FormLabel for="password" class="text-left">Password</FormLabel>
<Input id="password" type="password" class="col-span-3" v-bind="componentField" /> <Input id="password" type="password" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -119,7 +119,7 @@ const onSubmit = handleSubmit((values) => emit('submit', values))
<FormField name="passwordConfirm" v-slot="{ componentField }" validate-on-input> <FormField name="passwordConfirm" v-slot="{ componentField }" validate-on-input>
<FormItem class="w-full"> <FormItem class="w-full">
<FormLabel for="passwordConfirm" class="text-right">Confirm Password</FormLabel> <FormLabel for="passwordConfirm" class="text-left">Confirm Password</FormLabel>
<Input id="passwordConfirm" type="password" class="col-span-3" v-bind="componentField" /> <Input id="passwordConfirm" type="password" class="col-span-3" v-bind="componentField" />
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -82,7 +82,7 @@ watch(
<form @submit="onSubmit" @change="change"> <form @submit="onSubmit" @change="change">
<FormField name="user" v-slot="{ componentField }"> <FormField name="user" v-slot="{ componentField }">
<FormItem> <FormItem>
<FormLabel for="user" class="text-right"> User</FormLabel> <FormLabel for="user" class="text-left"> User</FormLabel>
<Select id="user" v-bind="componentField"> <Select id="user" v-bind="componentField">
<SelectTrigger> <SelectTrigger>
<SelectValue placeholder="Select a user" /> <SelectValue placeholder="Select a user" />

View File

@@ -58,14 +58,6 @@ const count = (id: string) => {
Open Catalyst Handbook Open Catalyst Handbook
<ExternalLink class="ml-2 h-4 w-4" /> <ExternalLink class="ml-2 h-4 w-4" />
</a> </a>
<a
href="/_/"
target="_blank"
class="flex items-center rounded border p-2 text-blue-500 hover:bg-accent"
>
Open Admin Interface
<ExternalLink class="ml-2 h-4 w-4" />
</a>
</CardContent> </CardContent>
</Card> </Card>
<Card> <Card>
@@ -118,14 +110,6 @@ const count = (id: string) => {
Open Catalyst Handbook Open Catalyst Handbook
<ExternalLink class="ml-2 h-4 w-4" /> <ExternalLink class="ml-2 h-4 w-4" />
</a> </a>
<a
href="/_/"
target="_blank"
class="flex items-center rounded border p-2 text-blue-500 hover:bg-accent"
>
Open Admin Interface
<ExternalLink class="ml-2 h-4 w-4" />
</a>
</CardContent> </CardContent>
</Card> </Card>
<Card> <Card>