From b45a9c6b663f32288dd835e93dc39cc3a25045f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:14:23 +0000 Subject: [PATCH] deploy: b80c45e779f7db11c377ae8f65efb1a49adbc70a --- 404.html | 2 +- assets/js/6ddfedc5.815ded3c.js | 1 - assets/js/6ddfedc5.e634bfd5.js | 1 + ...e~main.8d0c582c.js => runtime~main.9550676a.js} | 2 +- blog/archive/index.html | 2 +- blog/authors/coltmcnealy/index.html | 2 +- blog/authors/index.html | 2 +- blog/authors/lh-council/index.html | 2 +- blog/authors/mitchellh/index.html | 2 +- blog/basics-of-workflow/index.html | 2 +- blog/challenge-of-microservices/index.html | 2 +- blog/index.html | 2 +- blog/littlehorse-0.10-release/index.html | 2 +- blog/littlehorse-0.11-release/index.html | 2 +- blog/littlehorse-0.2.0-release/index.html | 2 +- blog/littlehorse-0.5.0-release/index.html | 2 +- blog/littlehorse-0.7-release/index.html | 2 +- blog/littlehorse-0.8-release/index.html | 2 +- blog/littlehorse-0.9-release/index.html | 2 +- blog/microservices-and-workflow/index.html | 2 +- blog/promise-of-microservices/index.html | 2 +- blog/saga-pattern/index.html | 2 +- blog/tags/analysis/index.html | 2 +- blog/tags/index.html | 2 +- blog/tags/integration-patterns/index.html | 2 +- blog/tags/littlehorse/index.html | 2 +- blog/tags/microservice-and-workflow/index.html | 2 +- blog/tags/release/index.html | 2 +- blog/transactional-outbox/index.html | 2 +- docs/api/index.html | 2 +- docs/architecture-and-guarantees/index.html | 2 +- docs/concepts/advanced/index.html | 2 +- .../concepts/advanced/wfspec-versioning/index.html | 2 +- docs/concepts/external-events/index.html | 2 +- docs/concepts/index.html | 2 +- docs/concepts/principals-and-tenants/index.html | 2 +- docs/concepts/tasks/index.html | 2 +- docs/concepts/user-tasks/index.html | 2 +- docs/concepts/workflow-events/index.html | 2 +- docs/concepts/workflows/index.html | 2 +- .../client-configuration/index.html | 2 +- docs/developer-guide/grpc/basics/index.html | 2 +- docs/developer-guide/grpc/index.html | 2 +- .../grpc/managing-metadata/index.html | 2 +- .../grpc/posting-external-events/index.html | 2 +- .../grpc/running-workflows/index.html | 2 +- docs/developer-guide/grpc/user-tasks/index.html | 2 +- docs/developer-guide/index.html | 2 +- docs/developer-guide/install/index.html | 2 +- docs/developer-guide/lhctl/index.html | 2 +- .../task-worker-development/index.html | 2 +- .../wfspec-development/advanced/index.html | 2 +- .../advanced/wait-for-condition/index.html | 2 +- .../wfspec-development/basics/index.html | 2 +- .../wfspec-development/child-threads/index.html | 2 +- .../wfspec-development/conditionals/index.html | 2 +- .../exception-handling/index.html | 2 +- .../wfspec-development/external-events/index.html | 2 +- docs/developer-guide/wfspec-development/index.html | 2 +- .../wfspec-development/interrupts/index.html | 2 +- .../mutating-variables/index.html | 2 +- .../wfspec-development/user-tasks/index.html | 14 +++++++------- docs/faq/index.html | 2 +- docs/operations/client-configuration/index.html | 2 +- docs/operations/dashboard-configuration/index.html | 2 +- docs/operations/docker-compose/basic/index.html | 2 +- .../docker-compose/confluent-cloud/index.html | 2 +- docs/operations/docker-compose/index.html | 2 +- .../docker-compose/three-servers/index.html | 2 +- docs/operations/index.html | 2 +- docs/operations/overview/index.html | 2 +- docs/operations/server-configuration/index.html | 2 +- docs/overview/index.html | 2 +- index.html | 2 +- markdown-page/index.html | 2 +- search/index.html | 2 +- 76 files changed, 81 insertions(+), 81 deletions(-) delete mode 100644 assets/js/6ddfedc5.815ded3c.js create mode 100644 assets/js/6ddfedc5.e634bfd5.js rename assets/js/{runtime~main.8d0c582c.js => runtime~main.9550676a.js} (99%) diff --git a/404.html b/404.html index 3d763c26c..0404d3019 100644 --- a/404.html +++ b/404.html @@ -18,7 +18,7 @@ - + diff --git a/assets/js/6ddfedc5.815ded3c.js b/assets/js/6ddfedc5.815ded3c.js deleted file mode 100644 index 37d45b395..000000000 --- a/assets/js/6ddfedc5.815ded3c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[6928],{5638:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var r=a(4848),n=a(8453),t=a(1470),i=a(9365);const l={},o="User Tasks",u={id:"developer-guide/wfspec-development/user-tasks",title:"User Tasks",description:"User Tasks allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow.",source:"@site/docs/05-developer-guide/08-wfspec-development/08-user-tasks.md",sourceDirName:"05-developer-guide/08-wfspec-development",slug:"/developer-guide/wfspec-development/user-tasks",permalink:"/docs/developer-guide/wfspec-development/user-tasks",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Child Threads",permalink:"/docs/developer-guide/wfspec-development/child-threads"},next:{title:"Advanced Features",permalink:"/docs/developer-guide/wfspec-development/advanced/"}},d={},c=[{value:"Assigning User Tasks",id:"assigning-user-tasks",level:2},{value:"Assigning to Users",id:"assigning-to-users",level:3},{value:"Assigning to Groups",id:"assigning-to-groups",level:3},{value:"Using User Task Outputs",id:"using-user-task-outputs",level:2},{value:"Using the Form Output",id:"using-the-form-output",level:3},{value:"Reminder Tasks",id:"reminder-tasks",level:3},{value:"Automatic Reassignment",id:"automatic-reassignment",level:3}];function h(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"user-tasks",children:"User Tasks"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow."]}),"\n",(0,r.jsx)(s.p,{children:"You can use the Workflow SDK's to schedule User Tasks, and also create lifecycle hooks such as:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Automatic Reassignment"}),"\n",(0,r.jsx)(s.li,{children:"Reminder Tasks"}),"\n",(0,r.jsx)(s.li,{children:"Automatic Cancellation."}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["See the ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc/managing-metadata",children:"Metadata Management docs"})," for information about how to create a ",(0,r.jsx)(s.code,{children:"UserTaskDef"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"assigning-user-tasks",children:"Assigning User Tasks"}),"\n",(0,r.jsx)(s.p,{children:"You can assign a User Task in two ways:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"To a specific User, specified by an arbitrary user id (and optionally a user group)."}),"\n",(0,r.jsx)(s.li,{children:"To a group of users."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"assigning-to-users",children:"Assigning to Users"}),"\n",(0,r.jsxs)(s.p,{children:["To assign a user task to a specific user who is not a part of a group, you can use ",(0,r.jsx)(s.code,{children:"WorkflowThread#assignTaskToUser()"}),"."]}),"\n","\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String hardCodedUserId = "some-user-id-or-email";\nWfRunVariable userIdVariable = wf.addVariable("user-id", VariableType.STR);\n\n// Hard-coded using a string\nwf.assignUserTask("some-user-task-def", hardCodedUserId, null);\n\n// Using a variable to set User Id\nwf.assignUserTask("another-user-task-def", userIdVariable, null);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-go",children:'hardCodedUserId := "some-user-id-or-email"\nuserIdVariable := wf.AddVariable("user-id", lhproto.VariableType_STR)\n\n// Hard-coded using a string\nwf.AssignUserTask("some-user-task-def", &hardCodedUserId, nil)\n\n// Using a variable to set User Id\nwf.AssignUserTask("some-user-task-def", userIdVariable, nil)\n'})})}),(0,r.jsx)(i.A,{value:"python",label:"Python",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-python",children:'hard_coded_user_id = "some-user-id-or-email"\nuser_id_variable = wf.add_variable("user-id", VariableType.STR)\n\n# assign using a hard coded string\nwf.assign_user_task("some-user-task", user_id=hard_coded_user_id)\n\n# assign using a variable\nwf.assign_user_task("some-user-task", user_id=user_id_variable)\n'})})})]}),"\n",(0,r.jsxs)(s.p,{children:["You can also assign a user task to a user as part of a group using ",(0,r.jsx)(s.code,{children:"WorkflowThread#assignUserTask"}),":"]}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'WfRunVariable userIdVariable = wf.addVariable("user-id", VariableType.STR);\nWfRunVariable userGroupVariable = wf.addVariable("user-group", VariableType.STR);\nString hardCodedUserGroup = "finance";\n\n// Hard-coded using a string\nwf.asignUserTask("some-user-task-def", userIdVariable, hardCodedUserGroup);\n\n// Using a variable to set User Group\nwf.assignUserTask("another-user-task-def", userIdVariable, userGroupVariable);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["Golang user task docs coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]}),"\n",(0,r.jsx)(s.h3,{id:"assigning-to-groups",children:"Assigning to Groups"}),"\n",(0,r.jsxs)(s.p,{children:["You can assign a task to a user group using ",(0,r.jsx)(s.code,{children:"WorkflowThread#assignUserTask()"}),"."]}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String hardCodedUserGroup = "sales";\nWfRunVariable userGroupVariable = wf.addVariable("user-group", VariableType.STR);\n\n// Hard-coded using a string\nString userId = null;\nwf.assignUserTask("some-user-task-def", userId, hardCodedUserGroup);\n\n// Using a variable to set User Group\nwf.assignUserTask("another-user-task-def", userId, userGroupVariable);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang docs for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]}),"\n",(0,r.jsx)(s.h2,{id:"using-user-task-outputs",children:"Using User Task Outputs"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"assignTaskToUser"})," and ",(0,r.jsx)(s.code,{children:"assignTaskToUserGroup"})," methods return a ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),", which is a special type of ",(0,r.jsx)(s.code,{children:"NodeOutput"}),". It can be used to:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Mutate variables"}),"\n",(0,r.jsx)(s.li,{children:"Schedule reminder tasks"}),"\n",(0,r.jsx)(s.li,{children:"Schedule user task reassignment."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"using-the-form-output",children:"Using the Form Output"}),"\n",(0,r.jsxs)(s.p,{children:["You can use a ",(0,r.jsx)(s.code,{children:"UserTaskOutput"})," to mutate variables. Note that a ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," has a series of fields, where each field has a ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"value"})," (which is a ",(0,r.jsx)(s.code,{children:"VariableValue"})," containing a primitive type)."]}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"UserTaskOutput"})," is essentially a Json output where each key is the name of each field, and the value is the value typed by the user. Let's say I have a user task def with two fields:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"userName"}),", which is a ",(0,r.jsx)(s.code,{children:"STR"})]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"age"}),", which is an ",(0,r.jsx)(s.code,{children:"INT"})]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"You can use the value as follows:"}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'WfRunVariable age = wf.addVariable("age", VariableType.INT);\nWfRunavariable userName = wf.addVariable("user-name", VariableType.STR);\n\nUserTaskOutput formResults = wf.assignUserTask("my-user-task", "obi-wan", null);\nwf.mutate(age, VariableMutationType.ASSIGN, formResults.jsonPath("$.age"));\nwf.mutate(userName, VariableMutationType.ASSIGN, formResults.jsonPath("$.userName"));\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang docs for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]}),"\n",(0,r.jsx)(s.h3,{id:"reminder-tasks",children:"Reminder Tasks"}),"\n",(0,r.jsxs)(s.p,{children:["You can use the ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),' to schedule a "Reminder Task", which is a ',(0,r.jsx)(s.code,{children:"TaskRun"})," that runs a set period of time after the User Task is scheduled. If the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," has been completed, cancelled, or reassigned by the time the Reminder Task is scheduled, ",(0,r.jsx)(s.em,{children:"the Reminder Task does not execute."})]}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'UserTaskOutput userTask = wf.assignTaskToUser("some-task", "yoda");\n\nint delaySeconds = 60; // wait one minute before reminder\n\nString taskArg1 = "reply to my email, you must!";\nString taskArg2 = "for my ally is the Force, and a powerful ally it is";\n\nString taskDefName = "send-reminder";\nwf.scheduleTaskAfter(userTask, delaySeconds, taskDefName, taskArg1, taskArg2);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsx)(s.p,{children:"GoLang support for user tasks coming soon."})})]}),"\n",(0,r.jsx)(s.h3,{id:"automatic-reassignment",children:"Automatic Reassignment"}),"\n",(0,r.jsxs)(s.p,{children:["You can use the ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),' to automatically "release" a task from a specific user to that user\'s group after a period of time passes.']}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["This only works if you assign the user task to a user ",(0,r.jsx)(s.em,{children:"and specify the group the user belongs to"}),"."]})}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String userGroup = "jedi-council";\nUserTaskOutput userTask = wf.assignUsrTask("some-task", "Mace Windu", userGroup);\n\n// If Mace Windu doesn\'t respond in 1 hour, allow any other Jedi Council member to claim\n// the task.\nwf.releaseToGroupOnDeadline(userTask, 60 * 60);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang support for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]})]})}function p(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,s,a)=>{a.d(s,{A:()=>i});a(6540);var r=a(8215);const n={tabItem:"tabItem_Ymn6"};var t=a(4848);function i(e){let{children:s,hidden:a,className:i}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(n.tabItem,i),hidden:a,children:s})}},1470:(e,s,a)=>{a.d(s,{A:()=>T});var r=a(6540),n=a(8215),t=a(3104),i=a(6347),l=a(205),o=a(7485),u=a(1682),d=a(679);function c(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:s}=e;return!!s&&"object"==typeof s&&"value"in s}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:s,children:a}=e;return(0,r.useMemo)((()=>{const e=s??function(e){return c(e).map((e=>{let{props:{value:s,label:a,attributes:r,default:n}}=e;return{value:s,label:a,attributes:r,default:n}}))}(a);return function(e){const s=(0,u.XI)(e,((e,s)=>e.value===s.value));if(s.length>0)throw new Error(`Docusaurus error: Duplicate values "${s.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[s,a])}function p(e){let{value:s,tabValues:a}=e;return a.some((e=>e.value===s))}function g(e){let{queryString:s=!1,groupId:a}=e;const n=(0,i.W6)(),t=function(e){let{queryString:s=!1,groupId:a}=e;if("string"==typeof s)return s;if(!1===s)return null;if(!0===s&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:s,groupId:a});return[(0,o.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const s=new URLSearchParams(n.location.search);s.set(t,e),n.replace({...n.location,search:s.toString()})}),[t,n])]}function f(e){const{defaultValue:s,queryString:a=!1,groupId:n}=e,t=h(e),[i,o]=(0,r.useState)((()=>function(e){let{defaultValue:s,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(s){if(!p({value:s,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${s}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return s}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:s,tabValues:t}))),[u,c]=g({queryString:a,groupId:n}),[f,m]=function(e){let{groupId:s}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(s),[n,t]=(0,d.Dv)(a);return[n,(0,r.useCallback)((e=>{a&&t.set(e)}),[a,t])]}({groupId:n}),b=(()=>{const e=u??f;return p({value:e,tabValues:t})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),m(e)}),[c,m,t]),tabValues:t}}var m=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=a(4848);function v(e){let{className:s,block:a,selectedValue:r,selectValue:i,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,t.a_)(),d=e=>{const s=e.currentTarget,a=o.indexOf(s),n=l[a].value;n!==r&&(u(s),i(n))},c=e=>{let s=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=o.indexOf(e.currentTarget)+1;s=o[a]??o[0];break}case"ArrowLeft":{const a=o.indexOf(e.currentTarget)-1;s=o[a]??o[o.length-1];break}}s?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":a},s),children:l.map((e=>{let{value:s,label:a,attributes:t}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:r===s?0:-1,"aria-selected":r===s,ref:e=>o.push(e),onKeyDown:c,onClick:d,...t,className:(0,n.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===s}),children:a??s},s)}))})}function k(e){let{lazy:s,children:a,selectedValue:t}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(s){const e=i.find((e=>e.props.value===t));return e?(0,r.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:i.map(((e,s)=>(0,r.cloneElement)(e,{key:s,hidden:e.props.value!==t})))})}function x(e){const s=f(e);return(0,j.jsxs)("div",{className:(0,n.A)("tabs-container",b.tabList),children:[(0,j.jsx)(v,{...s,...e}),(0,j.jsx)(k,{...s,...e})]})}function T(e){const s=(0,m.A)();return(0,j.jsx)(x,{...e,children:c(e.children)},String(s))}},8453:(e,s,a)=>{a.d(s,{R:()=>i,x:()=>l});var r=a(6540);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6ddfedc5.e634bfd5.js b/assets/js/6ddfedc5.e634bfd5.js new file mode 100644 index 000000000..80b149f0a --- /dev/null +++ b/assets/js/6ddfedc5.e634bfd5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[6928],{5638:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>d,contentTitle:()=>u,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var r=a(4848),n=a(8453),t=a(1470),i=a(9365);const l={},u="User Tasks",o={id:"developer-guide/wfspec-development/user-tasks",title:"User Tasks",description:"User Tasks allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow.",source:"@site/docs/05-developer-guide/08-wfspec-development/08-user-tasks.md",sourceDirName:"05-developer-guide/08-wfspec-development",slug:"/developer-guide/wfspec-development/user-tasks",permalink:"/docs/developer-guide/wfspec-development/user-tasks",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Child Threads",permalink:"/docs/developer-guide/wfspec-development/child-threads"},next:{title:"Advanced Features",permalink:"/docs/developer-guide/wfspec-development/advanced/"}},d={},c=[{value:"Assigning User Tasks",id:"assigning-user-tasks",level:2},{value:"Assigning to Users",id:"assigning-to-users",level:3},{value:"Assigning to Groups",id:"assigning-to-groups",level:3},{value:"Using User Task Outputs",id:"using-user-task-outputs",level:2},{value:"Using the Form Output",id:"using-the-form-output",level:3},{value:"Reminder Tasks",id:"reminder-tasks",level:3},{value:"Automatic Reassignment",id:"automatic-reassignment",level:3}];function h(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"user-tasks",children:"User Tasks"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow."]}),"\n",(0,r.jsx)(s.p,{children:"You can use the Workflow SDK's to schedule User Tasks, and also create lifecycle hooks such as:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Automatic Reassignment"}),"\n",(0,r.jsx)(s.li,{children:"Reminder Tasks"}),"\n",(0,r.jsx)(s.li,{children:"Automatic Cancellation."}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["See the ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc/managing-metadata",children:"Metadata Management docs"})," for information about how to create a ",(0,r.jsx)(s.code,{children:"UserTaskDef"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"assigning-user-tasks",children:"Assigning User Tasks"}),"\n",(0,r.jsx)(s.p,{children:"You can assign a User Task in two ways:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"To a specific User, specified by an arbitrary user id (and optionally a user group)."}),"\n",(0,r.jsx)(s.li,{children:"To a group of users."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"assigning-to-users",children:"Assigning to Users"}),"\n",(0,r.jsxs)(s.p,{children:["To assign a user task to a specific user who is not a part of a group, you can use ",(0,r.jsx)(s.code,{children:"WorkflowThread#assignUserTask()"}),"."]}),"\n","\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String hardCodedUserId = "some-user-id-or-email";\nWfRunVariable userIdVariable = wf.addVariable("user-id", VariableType.STR);\n\n// Hard-coded using a string, notice that the second parameter (group id) is null\nwf.assignUserTask("some-user-task-def", hardCodedUserId, null);\n\n// Using a variable to set User Id\nwf.assignUserTask("another-user-task-def", userIdVariable, null);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-go",children:'hardCodedUserId := "some-user-id-or-email"\nuserIdVariable := wf.AddVariable("user-id", lhproto.VariableType_STR)\n\n// Hard-coded using a string\nwf.AssignUserTask("some-user-task-def", &hardCodedUserId, nil)\n\n// Using a variable to set User Id\nwf.AssignUserTask("some-user-task-def", userIdVariable, nil)\n'})})}),(0,r.jsx)(i.A,{value:"python",label:"Python",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-python",children:'hard_coded_user_id = "some-user-id-or-email"\nuser_id_variable = wf.add_variable("user-id", VariableType.STR)\n\n# assign using a hard coded string\nwf.assign_user_task("some-user-task", user_id=hard_coded_user_id)\n\n# assign using a variable\nwf.assign_user_task("some-user-task", user_id=user_id_variable)\n'})})})]}),"\n",(0,r.jsx)(s.p,{children:"You can also assign a user task to a user as part of a group:"}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'WfRunVariable userIdVariable = wf.addVariable("user-id", VariableType.STR);\nWfRunVariable userGroupVariable = wf.addVariable("user-group", VariableType.STR);\nString hardCodedUserGroup = "finance";\n\n// Hard-coded using a string\nwf.asignUserTask("some-user-task-def", userIdVariable, hardCodedUserGroup);\n\n// Using a variable to set User Group\nwf.assignUserTask("another-user-task-def", userIdVariable, userGroupVariable);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["Golang user task docs coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})}),(0,r.jsx)(i.A,{value:"python",label:"Python",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-python",children:'user_id = wf.add_variable("user-id", VariableType.STR)\nuser_group = wf.add_variable("user_group", VariableType.STR)\nhard_coded_user_group = "finance";\n\n# assign using a hard coded string\nwf.assign_user_task("some-user-task", user_id=user_id, user_group=hard_coded_user_group)\n\n# assign using a variable\nwf.assign_user_task("some-user-task", user_id=user_id, user_group=user_group)\n'})})})]}),"\n",(0,r.jsx)(s.h3,{id:"assigning-to-groups",children:"Assigning to Groups"}),"\n",(0,r.jsxs)(s.p,{children:["You can assign a task to a user group using ",(0,r.jsx)(s.code,{children:"WorkflowThread#assignUserTask()"}),"."]}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String hardCodedUserGroup = "sales";\nWfRunVariable userGroupVariable = wf.addVariable("user-group", VariableType.STR);\n\n// Hard-coded using a string\nString userId = null;\nwf.assignUserTask("some-user-task-def", userId, hardCodedUserGroup);\n\n// Using a variable to set User Group\nwf.assignUserTask("another-user-task-def", userId, userGroupVariable);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang docs for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})}),(0,r.jsx)(i.A,{value:"python",label:"Python",children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-python",children:'user_group_str = "sales\nuser_group_var = wf.add_variable("user_group", VariableType.STR)\n\n# assign using a hard coded string\nwf.assign_user_task("some-user-task", user_group=user_group_str)\n\n# assign using a variable\nwf.assign_user_task("some-user-task", user_group=user_group_var)\n'})})})]}),"\n",(0,r.jsx)(s.h2,{id:"using-user-task-outputs",children:"Using User Task Outputs"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"assignUserTask"})," method return a ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),", which is a special type of ",(0,r.jsx)(s.code,{children:"NodeOutput"}),". It can be used to:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Mutate variables"}),"\n",(0,r.jsx)(s.li,{children:"Schedule reminder tasks"}),"\n",(0,r.jsx)(s.li,{children:"Schedule user task reassignment."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"using-the-form-output",children:"Using the Form Output"}),"\n",(0,r.jsxs)(s.p,{children:["You can use a ",(0,r.jsx)(s.code,{children:"UserTaskOutput"})," to mutate variables. Note that a ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," has a series of fields, where each field has a ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"value"})," (which is a ",(0,r.jsx)(s.code,{children:"VariableValue"})," containing a primitive type)."]}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"UserTaskOutput"})," is essentially a Json output where each key is the name of each field, and the value is the value typed by the user. Let's say I have a user task def with two fields:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"userName"}),", which is a ",(0,r.jsx)(s.code,{children:"STR"})]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"age"}),", which is an ",(0,r.jsx)(s.code,{children:"INT"})]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"You can use the value as follows:"}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'WfRunVariable age = wf.addVariable("age", VariableType.INT);\nWfRunavariable userName = wf.addVariable("user-name", VariableType.STR);\n\nUserTaskOutput formResults = wf.assignUserTask("my-user-task", "obi-wan", null);\nwf.mutate(age, VariableMutationType.ASSIGN, formResults.jsonPath("$.age"));\nwf.mutate(userName, VariableMutationType.ASSIGN, formResults.jsonPath("$.userName"));\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang docs for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]}),"\n",(0,r.jsx)(s.h3,{id:"reminder-tasks",children:"Reminder Tasks"}),"\n",(0,r.jsxs)(s.p,{children:["You can use the ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),' to schedule a "Reminder Task", which is a ',(0,r.jsx)(s.code,{children:"TaskRun"})," that runs a set period of time after the User Task is scheduled. If the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," has been completed, cancelled, or reassigned by the time the Reminder Task is scheduled, ",(0,r.jsx)(s.em,{children:"the Reminder Task does not execute."})]}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'UserTaskOutput userTask = wf.assignTaskToUser("some-task", "yoda");\n\nint delaySeconds = 60; // wait one minute before reminder\n\nString taskArg1 = "reply to my email, you must!";\nString taskArg2 = "for my ally is the Force, and a powerful ally it is";\n\nString taskDefName = "send-reminder";\nwf.scheduleTaskAfter(userTask, delaySeconds, taskDefName, taskArg1, taskArg2);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsx)(s.p,{children:"GoLang support for user tasks coming soon."})})]}),"\n",(0,r.jsx)(s.h3,{id:"automatic-reassignment",children:"Automatic Reassignment"}),"\n",(0,r.jsxs)(s.p,{children:["You can use the ",(0,r.jsx)(s.code,{children:"UserTaskOutput"}),' to automatically "release" a task from a specific user to that user\'s group after a period of time passes.']}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["This only works if you assign the user task to a user ",(0,r.jsx)(s.em,{children:"and specify the group the user belongs to"}),"."]})}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-java",children:'String userGroup = "jedi-council";\nUserTaskOutput userTask = wf.assignUsrTask("some-task", "Mace Windu", userGroup);\n\n// If Mace Windu doesn\'t respond in 1 hour, allow any other Jedi Council member to claim\n// the task.\nwf.releaseToGroupOnDeadline(userTask, 60 * 60);\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsxs)(s.p,{children:["GoLang support for user tasks coming soon. But if you want, you can try it out anyways ","\ud83d\ude09","."]})})]})]})}function p(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,s,a)=>{a.d(s,{A:()=>i});a(6540);var r=a(8215);const n={tabItem:"tabItem_Ymn6"};var t=a(4848);function i(e){let{children:s,hidden:a,className:i}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(n.tabItem,i),hidden:a,children:s})}},1470:(e,s,a)=>{a.d(s,{A:()=>y});var r=a(6540),n=a(8215),t=a(3104),i=a(6347),l=a(205),u=a(7485),o=a(1682),d=a(679);function c(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:s}=e;return!!s&&"object"==typeof s&&"value"in s}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:s,children:a}=e;return(0,r.useMemo)((()=>{const e=s??function(e){return c(e).map((e=>{let{props:{value:s,label:a,attributes:r,default:n}}=e;return{value:s,label:a,attributes:r,default:n}}))}(a);return function(e){const s=(0,o.XI)(e,((e,s)=>e.value===s.value));if(s.length>0)throw new Error(`Docusaurus error: Duplicate values "${s.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[s,a])}function p(e){let{value:s,tabValues:a}=e;return a.some((e=>e.value===s))}function g(e){let{queryString:s=!1,groupId:a}=e;const n=(0,i.W6)(),t=function(e){let{queryString:s=!1,groupId:a}=e;if("string"==typeof s)return s;if(!1===s)return null;if(!0===s&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:s,groupId:a});return[(0,u.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const s=new URLSearchParams(n.location.search);s.set(t,e),n.replace({...n.location,search:s.toString()})}),[t,n])]}function f(e){const{defaultValue:s,queryString:a=!1,groupId:n}=e,t=h(e),[i,u]=(0,r.useState)((()=>function(e){let{defaultValue:s,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(s){if(!p({value:s,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${s}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return s}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:s,tabValues:t}))),[o,c]=g({queryString:a,groupId:n}),[f,m]=function(e){let{groupId:s}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(s),[n,t]=(0,d.Dv)(a);return[n,(0,r.useCallback)((e=>{a&&t.set(e)}),[a,t])]}({groupId:n}),b=(()=>{const e=o??f;return p({value:e,tabValues:t})?e:null})();(0,l.A)((()=>{b&&u(b)}),[b]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);u(e),c(e),m(e)}),[c,m,t]),tabValues:t}}var m=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=a(4848);function j(e){let{className:s,block:a,selectedValue:r,selectValue:i,tabValues:l}=e;const u=[],{blockElementScrollPositionUntilNextRender:o}=(0,t.a_)(),d=e=>{const s=e.currentTarget,a=u.indexOf(s),n=l[a].value;n!==r&&(o(s),i(n))},c=e=>{let s=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;s=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;s=u[a]??u[u.length-1];break}}s?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":a},s),children:l.map((e=>{let{value:s,label:a,attributes:t}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:r===s?0:-1,"aria-selected":r===s,ref:e=>u.push(e),onKeyDown:c,onClick:d,...t,className:(0,n.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===s}),children:a??s},s)}))})}function k(e){let{lazy:s,children:a,selectedValue:t}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(s){const e=i.find((e=>e.props.value===t));return e?(0,r.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map(((e,s)=>(0,r.cloneElement)(e,{key:s,hidden:e.props.value!==t})))})}function x(e){const s=f(e);return(0,v.jsxs)("div",{className:(0,n.A)("tabs-container",b.tabList),children:[(0,v.jsx)(j,{...s,...e}),(0,v.jsx)(k,{...s,...e})]})}function y(e){const s=(0,m.A)();return(0,v.jsx)(x,{...e,children:c(e.children)},String(s))}},8453:(e,s,a)=>{a.d(s,{R:()=>i,x:()=>l});var r=a(6540);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.8d0c582c.js b/assets/js/runtime~main.9550676a.js similarity index 99% rename from assets/js/runtime~main.8d0c582c.js rename to assets/js/runtime~main.9550676a.js index 2aab20062..a53c09087 100644 --- a/assets/js/runtime~main.8d0c582c.js +++ b/assets/js/runtime~main.9550676a.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,c,d)=>{if(!f){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({216:"f23abd89",300:"a06c0eb2",312:"209570fd",456:"9e75eaed",536:"9215fec6",538:"5b3e9818",826:"e3618154",832:"dd97924f",849:"0058b4c6",867:"33fc5bb8",957:"c141421f",1173:"0fad6d0a",1235:"a7456010",1561:"b23d33c8",1634:"32279f3c",1642:"66680c26",1715:"81a46808",1872:"c9736c35",1886:"7f375326",1903:"acecf23e",1946:"5d0b0e70",2138:"1a4e3797",2186:"db1cb5ce",2296:"d0f4e7d1",2558:"f21a8f01",2634:"c4f5d8e4",2711:"9e4087bc",2775:"57cb429f",3133:"8bb7c884",3234:"eed23361",3249:"ccc49370",3324:"e33a6d67",3361:"c69aaf89",3372:"9a24bfa0",3408:"bd28587a",3457:"5b77cc54",3484:"bead5408",3828:"8bc86172",3896:"971c8a60",3983:"e359e6f5",4098:"141346fb",4120:"9b53f530",4134:"393be207",4212:"621db11d",4325:"366d7c2c",4372:"015df829",4635:"f447dd38",4723:"83879120",4792:"150c26e9",4813:"6875c492",4982:"524a0089",5174:"a957f15c",5739:"7f97f38f",5742:"aba21aa0",5808:"49cd91b3",6051:"f13b4cb1",6061:"1f391b9e",6309:"80b6e621",6417:"6ed84113",6583:"d61070d0",6848:"24a81a13",6928:"6ddfedc5",6958:"2494aaaa",7080:"df0890b4",7098:"a7bd4aaa",7130:"d5e335f6",7142:"fb7e2344",7173:"a86a7ed2",7316:"8dbae9ea",7434:"23f588f5",7472:"814f3328",7506:"845dc8ad",7643:"a6aa9e1f",7746:"7e3e0d30",7757:"84954295",7762:"b136319f",7784:"d9c5bba9",7828:"2a162317",7948:"ddb4e1f1",7962:"5263bac3",8035:"5a5f8fd5",8046:"be5744c7",8090:"74974c25",8121:"3a2db09e",8130:"f81c1134",8146:"c15d9823",8209:"01a85c17",8401:"17896441",8648:"5af1e9f6",8892:"4781d3d2",8947:"ef8b811a",9045:"a1824316",9048:"a94703ab",9291:"5a6d38a2",9371:"0bd106d9",9403:"d52af3ba",9445:"62796615",9615:"b770e739",9647:"5e95c892",9685:"b1ad0a29",9858:"36994c47",9905:"59f5fc7c",9964:"1d85cfc3",9993:"477ea5a4"}[e]||e)+"."+{216:"0404a672",300:"47a7d66e",312:"a04cc24b",416:"bd6759d1",456:"966b9594",536:"f8d8a16a",538:"5bdb5f9d",826:"9b13d064",832:"9ef757fe",849:"b64d5a7a",867:"40807a62",957:"541d7437",1173:"41f42246",1235:"fbb20977",1561:"709b12f5",1634:"8627ffc2",1642:"23896f8d",1715:"1d30f3e3",1872:"d4158810",1886:"7d79d881",1903:"8f73abf1",1946:"e68fd9dc",2138:"3ec61d80",2186:"3d1db817",2237:"68217b8a",2296:"8a374718",2558:"939e0c35",2634:"f834e126",2711:"0ef30c75",2775:"2b0514fd",3133:"5a828d6f",3234:"1b932553",3249:"16f4a0e3",3324:"82468289",3347:"7a0c4bea",3361:"7f98a7e0",3372:"b979efa0",3408:"f68ac721",3457:"17f618c6",3484:"d5194e8b",3828:"566493d9",3896:"e472b2fd",3983:"73afef77",4098:"75fa4823",4120:"715210c2",4134:"b2bf3017",4212:"3dca9c5a",4325:"0f6833c6",4372:"c4bfbae7",4635:"2cd44f06",4723:"a8a9ae07",4792:"dfc9c07e",4813:"174f4a92",4982:"e8b6233c",5174:"f75c6662",5739:"38383c7b",5742:"382f6066",5808:"ccdd0eae",6051:"083ab604",6061:"1887799c",6309:"a808ec2d",6417:"dde390bc",6583:"9bde1063",6848:"397031be",6928:"815ded3c",6958:"684a0a3d",7080:"a0b8ea9e",7098:"03a92e34",7130:"91c474a6",7142:"21ec2458",7173:"ee6a52f0",7316:"4c7f823c",7434:"3c383517",7472:"a5db8ea4",7506:"bc8570aa",7643:"44dbae04",7746:"7cf38925",7757:"588f31c1",7762:"fb8d8543",7784:"b1e3c7dc",7828:"e1b94b47",7948:"82873e64",7962:"24658d99",8035:"bd685f79",8046:"b55b8036",8090:"138c33f9",8121:"29ad30f3",8130:"3437bee0",8146:"55c527c7",8158:"26510717",8209:"471c1b01",8401:"8c1290d9",8498:"14012ec5",8648:"578d9587",8892:"e1d5b690",8913:"25f0add6",8947:"a4c3f802",9045:"f72768dd",9048:"da01bcc7",9291:"90b0091b",9371:"3cea8738",9403:"cc882533",9445:"08ee0677",9615:"c86f3b46",9647:"60173cbc",9685:"9cdbe99c",9858:"73ae0329",9905:"767a5198",9964:"e965be8b",9993:"ada62a64"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="lh-site:",r.l=(e,a,f,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",62796615:"9445",83879120:"4723",84954295:"7757",f23abd89:"216",a06c0eb2:"300","209570fd":"312","9e75eaed":"456","9215fec6":"536","5b3e9818":"538",e3618154:"826",dd97924f:"832","0058b4c6":"849","33fc5bb8":"867",c141421f:"957","0fad6d0a":"1173",a7456010:"1235",b23d33c8:"1561","32279f3c":"1634","66680c26":"1642","81a46808":"1715",c9736c35:"1872","7f375326":"1886",acecf23e:"1903","5d0b0e70":"1946","1a4e3797":"2138",db1cb5ce:"2186",d0f4e7d1:"2296",f21a8f01:"2558",c4f5d8e4:"2634","9e4087bc":"2711","57cb429f":"2775","8bb7c884":"3133",eed23361:"3234",ccc49370:"3249",e33a6d67:"3324",c69aaf89:"3361","9a24bfa0":"3372",bd28587a:"3408","5b77cc54":"3457",bead5408:"3484","8bc86172":"3828","971c8a60":"3896",e359e6f5:"3983","141346fb":"4098","9b53f530":"4120","393be207":"4134","621db11d":"4212","366d7c2c":"4325","015df829":"4372",f447dd38:"4635","150c26e9":"4792","6875c492":"4813","524a0089":"4982",a957f15c:"5174","7f97f38f":"5739",aba21aa0:"5742","49cd91b3":"5808",f13b4cb1:"6051","1f391b9e":"6061","80b6e621":"6309","6ed84113":"6417",d61070d0:"6583","24a81a13":"6848","6ddfedc5":"6928","2494aaaa":"6958",df0890b4:"7080",a7bd4aaa:"7098",d5e335f6:"7130",fb7e2344:"7142",a86a7ed2:"7173","8dbae9ea":"7316","23f588f5":"7434","814f3328":"7472","845dc8ad":"7506",a6aa9e1f:"7643","7e3e0d30":"7746",b136319f:"7762",d9c5bba9:"7784","2a162317":"7828",ddb4e1f1:"7948","5263bac3":"7962","5a5f8fd5":"8035",be5744c7:"8046","74974c25":"8090","3a2db09e":"8121",f81c1134:"8130",c15d9823:"8146","01a85c17":"8209","5af1e9f6":"8648","4781d3d2":"8892",ef8b811a:"8947",a1824316:"9045",a94703ab:"9048","5a6d38a2":"9291","0bd106d9":"9371",d52af3ba:"9403",b770e739:"9615","5e95c892":"9647",b1ad0a29:"9685","36994c47":"9858","59f5fc7c":"9905","1d85cfc3":"9964","477ea5a4":"9993"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,c,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,c,d)=>{if(!f){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({216:"f23abd89",300:"a06c0eb2",312:"209570fd",456:"9e75eaed",536:"9215fec6",538:"5b3e9818",826:"e3618154",832:"dd97924f",849:"0058b4c6",867:"33fc5bb8",957:"c141421f",1173:"0fad6d0a",1235:"a7456010",1561:"b23d33c8",1634:"32279f3c",1642:"66680c26",1715:"81a46808",1872:"c9736c35",1886:"7f375326",1903:"acecf23e",1946:"5d0b0e70",2138:"1a4e3797",2186:"db1cb5ce",2296:"d0f4e7d1",2558:"f21a8f01",2634:"c4f5d8e4",2711:"9e4087bc",2775:"57cb429f",3133:"8bb7c884",3234:"eed23361",3249:"ccc49370",3324:"e33a6d67",3361:"c69aaf89",3372:"9a24bfa0",3408:"bd28587a",3457:"5b77cc54",3484:"bead5408",3828:"8bc86172",3896:"971c8a60",3983:"e359e6f5",4098:"141346fb",4120:"9b53f530",4134:"393be207",4212:"621db11d",4325:"366d7c2c",4372:"015df829",4635:"f447dd38",4723:"83879120",4792:"150c26e9",4813:"6875c492",4982:"524a0089",5174:"a957f15c",5739:"7f97f38f",5742:"aba21aa0",5808:"49cd91b3",6051:"f13b4cb1",6061:"1f391b9e",6309:"80b6e621",6417:"6ed84113",6583:"d61070d0",6848:"24a81a13",6928:"6ddfedc5",6958:"2494aaaa",7080:"df0890b4",7098:"a7bd4aaa",7130:"d5e335f6",7142:"fb7e2344",7173:"a86a7ed2",7316:"8dbae9ea",7434:"23f588f5",7472:"814f3328",7506:"845dc8ad",7643:"a6aa9e1f",7746:"7e3e0d30",7757:"84954295",7762:"b136319f",7784:"d9c5bba9",7828:"2a162317",7948:"ddb4e1f1",7962:"5263bac3",8035:"5a5f8fd5",8046:"be5744c7",8090:"74974c25",8121:"3a2db09e",8130:"f81c1134",8146:"c15d9823",8209:"01a85c17",8401:"17896441",8648:"5af1e9f6",8892:"4781d3d2",8947:"ef8b811a",9045:"a1824316",9048:"a94703ab",9291:"5a6d38a2",9371:"0bd106d9",9403:"d52af3ba",9445:"62796615",9615:"b770e739",9647:"5e95c892",9685:"b1ad0a29",9858:"36994c47",9905:"59f5fc7c",9964:"1d85cfc3",9993:"477ea5a4"}[e]||e)+"."+{216:"0404a672",300:"47a7d66e",312:"a04cc24b",416:"bd6759d1",456:"966b9594",536:"f8d8a16a",538:"5bdb5f9d",826:"9b13d064",832:"9ef757fe",849:"b64d5a7a",867:"40807a62",957:"541d7437",1173:"41f42246",1235:"fbb20977",1561:"709b12f5",1634:"8627ffc2",1642:"23896f8d",1715:"1d30f3e3",1872:"d4158810",1886:"7d79d881",1903:"8f73abf1",1946:"e68fd9dc",2138:"3ec61d80",2186:"3d1db817",2237:"68217b8a",2296:"8a374718",2558:"939e0c35",2634:"f834e126",2711:"0ef30c75",2775:"2b0514fd",3133:"5a828d6f",3234:"1b932553",3249:"16f4a0e3",3324:"82468289",3347:"7a0c4bea",3361:"7f98a7e0",3372:"b979efa0",3408:"f68ac721",3457:"17f618c6",3484:"d5194e8b",3828:"566493d9",3896:"e472b2fd",3983:"73afef77",4098:"75fa4823",4120:"715210c2",4134:"b2bf3017",4212:"3dca9c5a",4325:"0f6833c6",4372:"c4bfbae7",4635:"2cd44f06",4723:"a8a9ae07",4792:"dfc9c07e",4813:"174f4a92",4982:"e8b6233c",5174:"f75c6662",5739:"38383c7b",5742:"382f6066",5808:"ccdd0eae",6051:"083ab604",6061:"1887799c",6309:"a808ec2d",6417:"dde390bc",6583:"9bde1063",6848:"397031be",6928:"e634bfd5",6958:"684a0a3d",7080:"a0b8ea9e",7098:"03a92e34",7130:"91c474a6",7142:"21ec2458",7173:"ee6a52f0",7316:"4c7f823c",7434:"3c383517",7472:"a5db8ea4",7506:"bc8570aa",7643:"44dbae04",7746:"7cf38925",7757:"588f31c1",7762:"fb8d8543",7784:"b1e3c7dc",7828:"e1b94b47",7948:"82873e64",7962:"24658d99",8035:"bd685f79",8046:"b55b8036",8090:"138c33f9",8121:"29ad30f3",8130:"3437bee0",8146:"55c527c7",8158:"26510717",8209:"471c1b01",8401:"8c1290d9",8498:"14012ec5",8648:"578d9587",8892:"e1d5b690",8913:"25f0add6",8947:"a4c3f802",9045:"f72768dd",9048:"da01bcc7",9291:"90b0091b",9371:"3cea8738",9403:"cc882533",9445:"08ee0677",9615:"c86f3b46",9647:"60173cbc",9685:"9cdbe99c",9858:"73ae0329",9905:"767a5198",9964:"e965be8b",9993:"ada62a64"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="lh-site:",r.l=(e,a,f,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",62796615:"9445",83879120:"4723",84954295:"7757",f23abd89:"216",a06c0eb2:"300","209570fd":"312","9e75eaed":"456","9215fec6":"536","5b3e9818":"538",e3618154:"826",dd97924f:"832","0058b4c6":"849","33fc5bb8":"867",c141421f:"957","0fad6d0a":"1173",a7456010:"1235",b23d33c8:"1561","32279f3c":"1634","66680c26":"1642","81a46808":"1715",c9736c35:"1872","7f375326":"1886",acecf23e:"1903","5d0b0e70":"1946","1a4e3797":"2138",db1cb5ce:"2186",d0f4e7d1:"2296",f21a8f01:"2558",c4f5d8e4:"2634","9e4087bc":"2711","57cb429f":"2775","8bb7c884":"3133",eed23361:"3234",ccc49370:"3249",e33a6d67:"3324",c69aaf89:"3361","9a24bfa0":"3372",bd28587a:"3408","5b77cc54":"3457",bead5408:"3484","8bc86172":"3828","971c8a60":"3896",e359e6f5:"3983","141346fb":"4098","9b53f530":"4120","393be207":"4134","621db11d":"4212","366d7c2c":"4325","015df829":"4372",f447dd38:"4635","150c26e9":"4792","6875c492":"4813","524a0089":"4982",a957f15c:"5174","7f97f38f":"5739",aba21aa0:"5742","49cd91b3":"5808",f13b4cb1:"6051","1f391b9e":"6061","80b6e621":"6309","6ed84113":"6417",d61070d0:"6583","24a81a13":"6848","6ddfedc5":"6928","2494aaaa":"6958",df0890b4:"7080",a7bd4aaa:"7098",d5e335f6:"7130",fb7e2344:"7142",a86a7ed2:"7173","8dbae9ea":"7316","23f588f5":"7434","814f3328":"7472","845dc8ad":"7506",a6aa9e1f:"7643","7e3e0d30":"7746",b136319f:"7762",d9c5bba9:"7784","2a162317":"7828",ddb4e1f1:"7948","5263bac3":"7962","5a5f8fd5":"8035",be5744c7:"8046","74974c25":"8090","3a2db09e":"8121",f81c1134:"8130",c15d9823:"8146","01a85c17":"8209","5af1e9f6":"8648","4781d3d2":"8892",ef8b811a:"8947",a1824316:"9045",a94703ab:"9048","5a6d38a2":"9291","0bd106d9":"9371",d52af3ba:"9403",b770e739:"9615","5e95c892":"9647",b1ad0a29:"9685","36994c47":"9858","59f5fc7c":"9905","1d85cfc3":"9964","477ea5a4":"9993"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n