|
@@ -0,0 +1,162 @@
|
|
|
|
+package example_basics
|
|
|
|
+
|
|
|
|
+// @snippet_begin(ActionWorkerExample)
|
|
|
|
+import (
|
|
|
|
+ "context"
|
|
|
|
+ "fmt"
|
|
|
|
+ "time"
|
|
|
|
+
|
|
|
|
+ "github.com/qor5/admin/presets"
|
|
|
|
+ "github.com/qor5/admin/worker"
|
|
|
|
+ "github.com/qor5/ui/vuetify"
|
|
|
|
+ "github.com/qor5/web"
|
|
|
|
+ h "github.com/theplant/htmlgo"
|
|
|
|
+ "gorm.io/gorm"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+type ExampleResource struct {
|
|
|
|
+ gorm.Model
|
|
|
|
+ Name string
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func MountActionWorker(b *presets.Builder) {
|
|
|
|
+ mb := b.Model(&ExampleResource{})
|
|
|
|
+ mb.Listing().ActionsAsMenu(true)
|
|
|
|
+
|
|
|
|
+ wb := worker.New(DB)
|
|
|
|
+ wb.Configure(b)
|
|
|
|
+ defer wb.Listen()
|
|
|
|
+
|
|
|
|
+ addActionJobs(mb, wb)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func addActionJobs(mb *presets.ModelBuilder, wb *worker.Builder) {
|
|
|
|
+ lb := mb.Listing()
|
|
|
|
+
|
|
|
|
+ noParametersJob := wb.ActionJob(
|
|
|
|
+ "No parameters",
|
|
|
|
+ mb,
|
|
|
|
+ func(ctx context.Context, job worker.QorJobInterface) error {
|
|
|
|
+ for i := 1; i <= 10; i++ {
|
|
|
|
+ select {
|
|
|
|
+ case <-ctx.Done():
|
|
|
|
+ job.AddLog("job aborted")
|
|
|
|
+ return nil
|
|
|
|
+ default:
|
|
|
|
+ job.SetProgress(uint(i * 10))
|
|
|
|
+ time.Sleep(time.Second)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ job.SetProgressText(`<a href="https://qor5-test.s3.ap-northeast-1.amazonaws.com/system/media_libraries/37/file.@qor_preview.png">Please download this file</a>`)
|
|
|
|
+ return nil
|
|
|
|
+ },
|
|
|
|
+ ).Description("This test demo is used to show that an no parameter job can be executed")
|
|
|
|
+
|
|
|
|
+ parametersBoxJob := wb.ActionJob(
|
|
|
|
+ "Parameter input box",
|
|
|
|
+ mb,
|
|
|
|
+ func(ctx context.Context, job worker.QorJobInterface) error {
|
|
|
|
+ for i := 1; i <= 10; i++ {
|
|
|
|
+ select {
|
|
|
|
+ case <-ctx.Done():
|
|
|
|
+ job.AddLog("job aborted")
|
|
|
|
+ return nil
|
|
|
|
+ default:
|
|
|
|
+ job.SetProgress(uint(i * 10))
|
|
|
|
+ time.Sleep(time.Second)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ job.SetProgressText(`<a href="https://qor5-test.s3.ap-northeast-1.amazonaws.com/system/media_libraries/37/file.@qor_preview.png">Please download this file</a>`)
|
|
|
|
+ return nil
|
|
|
|
+ },
|
|
|
|
+ ).Description("This test demo is used to show that an input box when there are parameters").
|
|
|
|
+ Params(&struct{ Name string }{})
|
|
|
|
+
|
|
|
|
+ displayLogJob := wb.ActionJob(
|
|
|
|
+ "Display log",
|
|
|
|
+ mb,
|
|
|
|
+ func(ctx context.Context, job worker.QorJobInterface) error {
|
|
|
|
+ for i := 1; i <= 10; i++ {
|
|
|
|
+ select {
|
|
|
|
+ case <-ctx.Done():
|
|
|
|
+ job.AddLog("job aborted")
|
|
|
|
+ return nil
|
|
|
|
+ default:
|
|
|
|
+ job.SetProgress(uint(i * 10))
|
|
|
|
+ job.AddLog(fmt.Sprintf("%v", i))
|
|
|
|
+ time.Sleep(time.Second)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ job.SetProgressText(`<a href="https://qor5-test.s3.ap-northeast-1.amazonaws.com/system/media_libraries/37/file.@qor_preview.png">Please download this file</a>`)
|
|
|
|
+ return nil
|
|
|
|
+ },
|
|
|
|
+ ).Description("This test demo is used to show the log section of this job").
|
|
|
|
+ Params(&struct{ Name string }{}).
|
|
|
|
+ DisplayLog(true).
|
|
|
|
+ ProgressingInterval(4000)
|
|
|
|
+
|
|
|
|
+ getArgsJob := wb.ActionJob(
|
|
|
|
+ "Get Args",
|
|
|
|
+ mb,
|
|
|
|
+ func(ctx context.Context, job worker.QorJobInterface) error {
|
|
|
|
+ jobInfo, err := job.GetJobInfo()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ job.AddLog(fmt.Sprintf("Action Params Name is %#+v", jobInfo.Argument.(*struct{ Name string }).Name))
|
|
|
|
+ job.AddLog(fmt.Sprintf("Origina Context AuthInfo is %#+v", jobInfo.Context["AuthInfo"]))
|
|
|
|
+ job.AddLog(fmt.Sprintf("Origina Context URL is %#+v", jobInfo.Context["URL"]))
|
|
|
|
+
|
|
|
|
+ for i := 1; i <= 10; i++ {
|
|
|
|
+ select {
|
|
|
|
+ case <-ctx.Done():
|
|
|
|
+ return nil
|
|
|
|
+ default:
|
|
|
|
+ job.SetProgress(uint(i * 10))
|
|
|
|
+ time.Sleep(time.Second)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ job.SetProgressText(`<a href="https://qor5-test.s3.ap-northeast-1.amazonaws.com/system/media_libraries/37/file.@qor_preview.png">Please download this file</a>`)
|
|
|
|
+ return nil
|
|
|
|
+ },
|
|
|
|
+ ).Description("This test demo is used to show how to get the action's arguments and original page context").
|
|
|
|
+ Params(&struct{ Name string }{}).
|
|
|
|
+ DisplayLog(true).
|
|
|
|
+ ContextHandler(func(ctx *web.EventContext) map[string]interface{} {
|
|
|
|
+ auth, err := ctx.R.Cookie("auth")
|
|
|
|
+ if err == nil {
|
|
|
|
+ return map[string]interface{}{"AuthInfo": auth.Value}
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ lb.Action("Action Job - No parameters").
|
|
|
|
+ ButtonCompFunc(
|
|
|
|
+ func(ctx *web.EventContext) h.HTMLComponent {
|
|
|
|
+ return vuetify.VBtn("Action Job - No parameters").Color("secondary").Depressed(true).Class("ml-2").
|
|
|
|
+ Attr("@click", noParametersJob.URL())
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ lb.Action("Action Job - Parameter input box").
|
|
|
|
+ ButtonCompFunc(
|
|
|
|
+ func(ctx *web.EventContext) h.HTMLComponent {
|
|
|
|
+ return vuetify.VBtn("Action Job - Parameter input box").Color("secondary").Depressed(true).Class("ml-2").
|
|
|
|
+ Attr("@click", parametersBoxJob.URL())
|
|
|
|
+ })
|
|
|
|
+ lb.Action("Action Job - Display log").
|
|
|
|
+ ButtonCompFunc(
|
|
|
|
+ func(ctx *web.EventContext) h.HTMLComponent {
|
|
|
|
+ return vuetify.VBtn("Action Job - Display log").Color("secondary").Depressed(true).Class("ml-2").
|
|
|
|
+ Attr("@click", displayLogJob.URL())
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ lb.Action("Action Job - Get Args").
|
|
|
|
+ ButtonCompFunc(
|
|
|
|
+ func(ctx *web.EventContext) h.HTMLComponent {
|
|
|
|
+ return vuetify.VBtn("Action Job - Get Args").Color("secondary").Depressed(true).Class("ml-2").
|
|
|
|
+ Attr("@click", getArgsJob.URL())
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// @snippet_end
|