Browse Source

Merge pull request #41 from qor5/worker-doc

add worker doc
xuxinx 1 year ago
parent
commit
447b692170
42 changed files with 618 additions and 3 deletions
  1. 4 0
      docs/advanced-functions/the-go-html-builder.html
  2. 11 1
      docs/appendix/all-demo-examples.html
  3. 4 0
      docs/basics/brand.html
  4. 5 1
      docs/basics/confirm-dialog.html
  5. 4 0
      docs/basics/event-handling.html
  6. 4 0
      docs/basics/filter.html
  7. 4 0
      docs/basics/form-handling.html
  8. 4 0
      docs/basics/layout-function-and-page-injector.html
  9. 4 0
      docs/basics/listing.html
  10. 4 0
      docs/basics/manipulate-page-url-in-event-func.html
  11. 4 0
      docs/basics/menu.html
  12. 4 0
      docs/basics/notification-center.html
  13. 4 0
      docs/basics/page-func-and-event-func.html
  14. 4 0
      docs/basics/partial-refresh-with-portal.html
  15. 4 0
      docs/basics/reload-page-with-a-flash.html
  16. 4 0
      docs/basics/scope-component.html
  17. 4 0
      docs/basics/shortcut.html
  18. 4 0
      docs/basics/summary-of-event-response.html
  19. 4 0
      docs/basics/switch-pages-with-push-state.html
  20. 211 0
      docs/basics/worker.html
  21. 4 0
      docs/components-guide/composite-new-component-with-go.html
  22. 4 0
      docs/components-guide/integrate-a-heavy-vue-component.html
  23. 4 0
      docs/getting-started/one-minute-quick-start.html
  24. 4 0
      docs/index.html
  25. 4 0
      docs/presets-guide/detail-page-for-complex-object.html
  26. 4 0
      docs/presets-guide/editing-customizations.html
  27. 4 0
      docs/presets-guide/its-the-whole-house.html
  28. 4 0
      docs/presets-guide/permissions.html
  29. 4 0
      docs/presets-guide/role.html
  30. 0 0
      docs/search_indexes.json
  31. 4 0
      docs/vuetify-components/a-taste-of-using-vuetify-in-go.html
  32. 4 0
      docs/vuetify-components/auto-complete.html
  33. 4 0
      docs/vuetify-components/basic-inputs.html
  34. 4 0
      docs/vuetify-components/lazy-portals.html
  35. 4 0
      docs/vuetify-components/linkage-select.html
  36. 38 0
      docsrc/content/basics/worker.go
  37. 1 0
      docsrc/doc_tree.go
  38. 1 1
      docsrc/examples/example_basics/confirm-dialog.go
  39. 98 0
      docsrc/examples/example_basics/worker.go
  40. 122 0
      docsrc/examples/example_basics/worker_mock_que.go
  41. 0 0
      docsrc/generated/examples-generated.go
  42. 7 0
      docsrc/mux.go

+ 4 - 0
docs/advanced-functions/the-go-html-builder.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 11 - 1
docs/appendix/all-demo-examples.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>
@@ -410,7 +414,7 @@
 </li>
 
 <li>
-<a href='/samples/confirm-dialog' target='_blank'>Confirm Dialog</a>
+<a href='/samples/confirm_dialog/confirm-dialog' target='_blank'>Confirm Dialog</a>
  | 
 <a href='https://github.com/qor5/docs/tree/main/docsrc/examples/example_basics/confirm-dialog.go' target='_blank'>Source</a>
 </li>
@@ -523,6 +527,12 @@
 <a href='https://github.com/qor5/docs/tree/main/docsrc/examples/e22_vuetify_variant_sub_form/page.go' target='_blank'>Source</a>
 </li>
 
+<li>
+<a href='/samples/worker/workers' target='_blank'>Worker</a>
+ | 
+<a href='https://github.com/qor5/docs/tree/main/docsrc/examples/example_basics/worker.go' target='_blank'>Source</a>
+</li>
+
 <li>
 <a href='/samples/composite-component-sample1' target='_blank'>Composite New Component With Go</a>
  | 

+ 4 - 0
docs/basics/brand.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 5 - 1
docs/basics/confirm-dialog.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-blue-500'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>
@@ -207,7 +211,7 @@ To use a custom portal for dialog.</p>
 
 <div>
 <div class='demo'>
-<a href='/samples/confirm-dialog' target='_blank'>Check the demo</a>
+<a href='/samples/confirm_dialog/confirm-dialog' target='_blank'>Check the demo</a>
  | 
 <a href='https://github.com/qor5/docs/tree/main/docsrc/examples/example_basics/confirm-dialog.go' target='_blank'>Source on GitHub</a>
 </div>

+ 4 - 0
docs/basics/event-handling.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/filter.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/form-handling.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/layout-function-and-page-injector.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/listing.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/manipulate-page-url-in-event-func.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/menu.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/notification-center.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/page-func-and-event-func.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/partial-refresh-with-portal.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/reload-page-with-a-flash.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/scope-component.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/shortcut.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/summary-of-event-response.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/basics/switch-pages-with-push-state.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

File diff suppressed because it is too large
+ 211 - 0
docs/basics/worker.html


+ 4 - 0
docs/components-guide/composite-new-component-with-go.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/components-guide/integrate-a-heavy-vue-component.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/getting-started/one-minute-quick-start.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/index.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/presets-guide/detail-page-for-complex-object.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/presets-guide/editing-customizations.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/presets-guide/its-the-whole-house.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/presets-guide/permissions.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/presets-guide/role.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

File diff suppressed because it is too large
+ 0 - 0
docs/search_indexes.json


+ 4 - 0
docs/vuetify-components/a-taste-of-using-vuetify-in-go.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/vuetify-components/auto-complete.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/vuetify-components/basic-inputs.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/vuetify-components/lazy-portals.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 4 - 0
docs/vuetify-components/linkage-select.html

@@ -78,6 +78,10 @@
 <a href='basics/confirm-dialog.html' id='basics/confirm-dialog.html' onclick='window.storeMenuState("basics/confirm-dialog.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Confirm Dialog</a>
 </li>
 
+<li class='m-0'>
+<a href='basics/worker.html' id='basics/worker.html' onclick='window.storeMenuState("basics/worker.html")' class='inline-block pl-10 pr-4 py-1 truncate break-words w-64 hover:text-blue-400 text-gray-700'>Worker</a>
+</li>
+
 <li class='cursor-default px-4 py-1 truncate break-words w-64 m-0'>Web Application</li>
 
 <li class='m-0'>

+ 38 - 0
docsrc/content/basics/worker.go

@@ -0,0 +1,38 @@
+package basics
+
+import (
+	"fmt"
+	"path"
+
+	"github.com/qor5/docs/docsrc/examples/example_basics"
+	"github.com/qor5/docs/docsrc/generated"
+	"github.com/qor5/docs/docsrc/utils"
+	. "github.com/theplant/docgo"
+	"github.com/theplant/docgo/ch"
+)
+
+var Worker = Doc(
+	Markdown(fmt.Sprintf(`
+Worker runs a single Job in the background, it can do so immediately or at a scheduled time.  
+Once registered with QOR Admin, Worker will provide a Workers section in the navigation tree, containing pages for listing and managing the following aspects of Workers:
+
+- All Jobs.
+- Running: Jobs that are currently running.
+- Scheduled: Jobs which have been scheduled to run at a time in the future.
+- Done: finished Jobs.
+- Errors: any errors output from any Workers that have been run.
+
+## Note
+- The default que GoQueQueue(https://github.com/tnclong/go-que) only supports postgres for now.
+- To make a job abortable, you need to check %s channel in job handler and stop the handler func.
+    `, "`ctx.Done()`")),
+	Markdown(`
+## Example
+`),
+	ch.Code(generated.WorkerExample).Language("go"),
+	utils.Demo(
+		"Worker",
+		path.Join(example_basics.WorkerExamplePath, "/workers"),
+		"example_basics/worker.go",
+	),
+).Slug("basics/worker").Title("Worker")

+ 1 - 0
docsrc/doc_tree.go

@@ -38,6 +38,7 @@ var DocTree = []interface{}{
 			basics.NotificationCenter,
 			basics.ShortCut,
 			basics.ConfirmDialog,
+			basics.Worker,
 		},
 	},
 

+ 1 - 1
docsrc/examples/example_basics/confirm-dialog.go

@@ -51,4 +51,4 @@ func PresetsConfirmDialog(b *presets.Builder) {
 	})
 }
 
-const PresetsConfirmDialogPath = "/samples"
+const PresetsConfirmDialogPath = "/samples/confirm_dialog"

+ 98 - 0
docsrc/examples/example_basics/worker.go

@@ -0,0 +1,98 @@
+package example_basics
+
+// @snippet_begin(WorkerExample)
+import (
+	"context"
+	"errors"
+	"fmt"
+	"time"
+
+	"github.com/qor5/admin/presets"
+	"github.com/qor5/admin/worker"
+)
+
+func MountWorker(b *presets.Builder) {
+	wb := worker.New(DB)
+	wb.Configure(b)
+	defer wb.Listen()
+
+	addJobs(wb)
+}
+
+func addJobs(w *worker.Builder) {
+	w.NewJob("noArgJob").
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			job.AddLog("hoho1")
+			job.AddLog("hoho2")
+			job.AddLog("hoho3")
+			return nil
+		})
+
+	type ArgJobResource struct {
+		F1 string
+		F2 int
+		F3 bool
+	}
+	argJb := w.NewJob("argJob").
+		Resource(&ArgJobResource{}).
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			jobInfo, _ := job.GetJobInfo()
+			job.AddLog(fmt.Sprintf("Argument %#+v", jobInfo.Argument))
+			return nil
+		})
+	// you can to customize the resource Editing via GetResourceBuilder()
+	argJb.GetResourceBuilder().Editing()
+
+	w.NewJob("progressTextJob").
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			job.AddLog("hoho1")
+			job.AddLog("hoho2")
+			job.AddLog("hoho3")
+			job.SetProgressText(`<a href="https://www.google.com">Download users</a>`)
+			return nil
+		})
+
+	// check ctx.Done() to stop the handler
+	w.NewJob("longRunningJob").
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			for i := 1; i <= 5; i++ {
+				select {
+				case <-ctx.Done():
+					job.AddLog("job aborted")
+					return nil
+				default:
+					job.AddLog(fmt.Sprintf("%v", i))
+					job.SetProgress(uint(i * 20))
+					time.Sleep(time.Second)
+				}
+			}
+			return nil
+		})
+
+	// insert worker.Schedule to resource to make a job schedulable
+	type ScheduleJobResource struct {
+		F1 string
+		worker.Schedule
+	}
+	w.NewJob("scheduleJob").
+		Resource(&ScheduleJobResource{}).
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			jobInfo, _ := job.GetJobInfo()
+			job.AddLog(fmt.Sprintf("%#+v", jobInfo.Argument))
+			return nil
+		})
+
+	w.NewJob("errorJob").
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			job.AddLog("=====perform error job")
+			return errors.New("imError")
+		})
+
+	w.NewJob("panicJob").
+		Handler(func(ctx context.Context, job worker.QorJobInterface) error {
+			job.AddLog("=====perform panic job")
+			panic("letsPanic")
+		})
+}
+
+// @snippet_end

+ 122 - 0
docsrc/examples/example_basics/worker_mock_que.go

@@ -0,0 +1,122 @@
+package example_basics
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"runtime/debug"
+	"time"
+
+	"github.com/qor5/admin/presets"
+	"github.com/qor5/admin/presets/gorm2op"
+	"github.com/qor5/admin/worker"
+	"github.com/qor5/admin/worker/mock"
+)
+
+func WorkerExampleMock(b *presets.Builder) {
+	b.URIPrefix(WorkerExamplePath).
+		DataOperator(gorm2op.DataOperator(DB))
+
+	wb := worker.NewWithQueue(DB, Que)
+	wb.Configure(b)
+	addJobs(wb)
+	wb.Listen()
+}
+
+const WorkerExamplePath = "/samples/worker"
+
+var Que = &mock.QueueMock{
+	AddFunc: func(job worker.QueJobInterface) error {
+		jobInfo, err := job.GetJobInfo()
+
+		if err != nil {
+			return err
+		}
+		if scheduler, ok := jobInfo.Argument.(worker.Scheduler); ok && scheduler.GetScheduleTime() != nil {
+			job.SetStatus(worker.JobStatusScheduled)
+			go func() {
+				time.Sleep(scheduler.GetScheduleTime().Sub(time.Now()))
+				ConsumeQueItem(job)
+			}()
+		} else {
+			go func() {
+				ConsumeQueItem(job)
+			}()
+		}
+		return nil
+	},
+	KillFunc: func(job worker.QueJobInterface) error {
+		return job.SetStatus(worker.JobStatusKilled)
+	},
+	ListenFunc: func(jobDefs []*worker.QorJobDefinition, getJob func(qorJobID uint) (worker.QueJobInterface, error)) error {
+		return nil
+	},
+	RemoveFunc: func(job worker.QueJobInterface) error {
+		return job.SetStatus(worker.JobStatusCancelled)
+	},
+}
+
+func ConsumeQueItem(job worker.QueJobInterface) (err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			job.AddLog(string(debug.Stack()))
+			job.SetProgressText(fmt.Sprint(r))
+			job.SetStatus(worker.JobStatusException)
+			job.StopRefresh()
+		}
+	}()
+
+	if job.GetStatus() == worker.JobStatusCancelled {
+		return
+	}
+	if job.GetStatus() != worker.JobStatusNew && job.GetStatus() != worker.JobStatusScheduled {
+		job.SetStatus(worker.JobStatusKilled)
+		return errors.New("invalid job status, current status: " + job.GetStatus())
+	}
+
+	err = job.SetStatus(worker.JobStatusRunning)
+	if err != nil {
+		return err
+	}
+	time.Sleep(100 * time.Millisecond)
+
+	hctx, cf := context.WithCancel(context.Background())
+	hDoneC := make(chan struct{})
+	isAborted := false
+	go func() {
+		timer := time.NewTicker(time.Second)
+		for {
+			select {
+			case <-hDoneC:
+				return
+			case <-timer.C:
+				status, _ := job.FetchAndSetStatus()
+				if status == worker.JobStatusKilled {
+					isAborted = true
+					cf()
+					return
+				}
+			}
+		}
+	}()
+	job.StartRefresh()
+	err = job.GetHandler()(hctx, job)
+	job.StopRefresh()
+	if !isAborted {
+		hDoneC <- struct{}{}
+	}
+	if err != nil {
+		job.SetProgressText(err.Error())
+		job.SetStatus(worker.JobStatusException)
+		return err
+	}
+	if isAborted {
+		return
+	}
+
+	err = job.SetStatus(worker.JobStatusDone)
+	if err != nil {
+		return err
+	}
+	return
+}

File diff suppressed because it is too large
+ 0 - 0
docsrc/generated/examples-generated.go


+ 7 - 0
docsrc/mux.go

@@ -718,5 +718,12 @@ func SamplesHandler(prefix string) http.Handler {
 		c22,
 	)
 
+	c23 := presets.New().AssetFunc(addGA)
+	example_basics.WorkerExampleMock(c23)
+	mux.Handle(
+		example_basics.WorkerExamplePath+"/",
+		c23,
+	)
+
 	return mux
 }

Some files were not shown because too many files changed in this diff