From 727191c0e871aabff5cf34ab782b73eb6a7dbda7 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 5 Apr 2021 21:04:55 +0200 Subject: [PATCH] Incremental work on dashboard --- .../Elsa.Core/Activities/ControlFlow/If/If.cs | 2 +- .../VersionOptionsSpecification.cs | 2 + .../Shared/Pager.razor.cs | 13 -- .../elsa-workflows-studio/package-lock.json | 17 +++ .../elsa-workflows-studio/package.json | 6 +- .../src/assets/images/favicon-16x16.png | Bin 0 -> 1070 bytes .../src/assets/images/favicon-32x32.png | Bin 0 -> 1679 bytes .../src/assets/images/favicon.ico | Bin 0 -> 1150 bytes .../src/assets/images/logo.png | Bin 0 -> 9825 bytes .../src/assets/{ => styles}/tailwind.css | 0 .../elsa-workflows-studio/src/components.d.ts | 130 ++++++++++++++-- .../elsa-context-menu/elsa-context-menu.css | 0 .../elsa-context-menu/elsa-context-menu.tsx | 73 +++++++++ .../controls/elsa-context-menu/models.tsx | 6 + .../elsa-input-tags/elsa-input-tags.css | 0 .../elsa-input-tags/elsa-input-tags.tsx | 0 .../controls/elsa-input-tags/readme.md | 0 .../elsa-monaco/elsa-monaco-utils.ts | 0 .../elsa-monaco/elsa-monaco.css | 0 .../elsa-monaco/elsa-monaco.tsx | 2 +- .../monaco => controls}/elsa-monaco/readme.md | 0 .../dashboard/pages/app-root/app-root.css | 15 ++ .../dashboard/pages/app-root/app-root.tsx | 62 ++++++++ .../app-workflow-definitions-edit.css | 0 .../app-workflow-definitions-edit.tsx | 31 ++++ .../app-workflow-definitions-list.css | 0 .../app-workflow-definitions-list.tsx | 33 +++++ .../app-workflow-registry.css | 0 .../app-workflow-registry.tsx | 69 +++++++++ .../elsa-designer-tree-activity.tsx | 6 +- .../elsa-designer-tree/elsa-designer-tree.css | 2 +- .../elsa-expression-editor.css | 0 .../elsa-expression-editor.tsx | 4 +- .../elsa-property-editor.css | 0 .../elsa-property-editor.tsx | 2 +- .../elsa-script-property.tsx | 4 +- .../elsa-activity-editor-modal.css | 0 .../elsa-activity-editor-modal.tsx | 0 .../elsa-activity-editor-modal/readme.md | 0 ...lsa-workflow-definition-editor-screen.css} | 0 ...lsa-workflow-definition-editor-screen.tsx} | 12 +- .../readme.md | 0 .../elsa-workflow-editor-notifications.css} | 0 .../elsa-workflow-editor-notifications.tsx | 0 .../readme.md | 0 .../elsa-workflow-publish-button.css | 0 .../elsa-workflow-publish-button.tsx | 2 +- .../elsa-workflow-publish-button/readme.md | 0 .../elsa-workflow-settings-modal.css | 0 .../elsa-workflow-settings-modal.tsx | 2 +- .../elsa-workflow-settings-modal/readme.md | 0 .../elsa-workflow-definitions-list-screen.css | 0 .../elsa-workflow-definitions-list-screen.tsx | 140 ++++++++++++++++++ .../elsa-confirm-dialog.tsx | 97 ++++++++++++ .../src/data/dashboard.tsx | 13 ++ .../{components => }/data/workflow-editor.tsx | 0 .../elsa-workflows-studio/src/index.html | 6 +- .../elsa-workflows-studio/src/index.ts | 1 + .../src/models/domain.ts | 37 ++++- .../src/services/elsa-client.ts | 26 +++- .../Endpoints/WorkflowDefinitions/List.cs | 17 ++- .../Endpoints/WorkflowDefinitions/Models.cs | 16 ++ .../Mapping/AutoMapperProfile.cs | 2 + .../Examples/WebhookDefinitionExample.cs | 1 + .../WorkflowDefinitionSummaryModelExample.cs | 24 +++ ...wDefinitionSummaryModelPagedListExample.cs | 16 ++ 66 files changed, 832 insertions(+), 59 deletions(-) create mode 100644 src/designer/elsa-workflows-studio/src/assets/images/favicon-16x16.png create mode 100644 src/designer/elsa-workflows-studio/src/assets/images/favicon-32x32.png create mode 100644 src/designer/elsa-workflows-studio/src/assets/images/favicon.ico create mode 100644 src/designer/elsa-workflows-studio/src/assets/images/logo.png rename src/designer/elsa-workflows-studio/src/assets/{ => styles}/tailwind.css (100%) create mode 100644 src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.css create mode 100644 src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.tsx create mode 100644 src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/models.tsx rename src/designer/elsa-workflows-studio/src/components/{editors => }/controls/elsa-input-tags/elsa-input-tags.css (100%) rename src/designer/elsa-workflows-studio/src/components/{editors => }/controls/elsa-input-tags/elsa-input-tags.tsx (100%) rename src/designer/elsa-workflows-studio/src/components/{editors => }/controls/elsa-input-tags/readme.md (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/monaco => controls}/elsa-monaco/elsa-monaco-utils.ts (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/monaco => controls}/elsa-monaco/elsa-monaco.css (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/monaco => controls}/elsa-monaco/elsa-monaco.tsx (99%) rename src/designer/elsa-workflows-studio/src/components/{editors/monaco => controls}/elsa-monaco/readme.md (100%) create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.css create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.tsx create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.css create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.tsx create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.css create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.tsx create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.css create mode 100644 src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.tsx rename src/designer/elsa-workflows-studio/src/components/editors/{properties => }/elsa-expression-editor/elsa-expression-editor.css (100%) rename src/designer/elsa-workflows-studio/src/components/editors/{properties => }/elsa-expression-editor/elsa-expression-editor.tsx (94%) rename src/designer/elsa-workflows-studio/src/components/editors/{properties => }/elsa-property-editor/elsa-property-editor.css (100%) rename src/designer/elsa-workflows-studio/src/components/editors/{properties => }/elsa-property-editor/elsa-property-editor.tsx (99%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-activity-editor-modal/elsa-activity-editor-modal.css (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-activity-editor-modal/elsa-activity-editor-modal.tsx (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-activity-editor-modal/readme.md (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor/elsa-workflow-editor-notifications/elsa-workflow-editor-notifications.css => screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.css} (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor/elsa-workflow-editor/elsa-workflow-editor.tsx => screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx} (97%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor/elsa-workflow-editor => screens/workflow-definition-editor/elsa-workflow-definition-editor-screen}/readme.md (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor/elsa-workflow-editor/elsa-workflow-editor.css => screens/workflow-definition-editor/elsa-workflow-editor-notifications/elsa-workflow-editor-notifications.css} (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-editor-notifications/elsa-workflow-editor-notifications.tsx (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-editor-notifications/readme.md (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-publish-button/elsa-workflow-publish-button.css (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-publish-button/elsa-workflow-publish-button.tsx (99%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-publish-button/readme.md (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-settings-modal/elsa-workflow-settings-modal.css (100%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-settings-modal/elsa-workflow-settings-modal.tsx (99%) rename src/designer/elsa-workflows-studio/src/components/{editors/workflow-editor => screens/workflow-definition-editor}/elsa-workflow-settings-modal/readme.md (100%) create mode 100644 src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.css create mode 100644 src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.tsx create mode 100644 src/designer/elsa-workflows-studio/src/components/shared/elsa-confirm-dialog/elsa-confirm-dialog.tsx create mode 100644 src/designer/elsa-workflows-studio/src/data/dashboard.tsx rename src/designer/elsa-workflows-studio/src/{components => }/data/workflow-editor.tsx (100%) create mode 100644 src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Models.cs create mode 100644 src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelExample.cs create mode 100644 src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelPagedListExample.cs diff --git a/src/core/Elsa.Core/Activities/ControlFlow/If/If.cs b/src/core/Elsa.Core/Activities/ControlFlow/If/If.cs index aebc6a07c..336b24241 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/If/If.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/If/If.cs @@ -17,7 +17,7 @@ namespace Elsa.Activities.ControlFlow DisplayName = "If/Else", Category = "Control Flow", Description = "Evaluate a Boolean expression and continue execution depending on the result.", - Outcomes = new[] { True, False, OutcomeNames.Done } + Outcomes = new[] { True, False } )] public class If : Activity, INotificationHandler { diff --git a/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/VersionOptionsSpecification.cs b/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/VersionOptionsSpecification.cs index 4cc1cc1c4..923a383b5 100644 --- a/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/VersionOptionsSpecification.cs +++ b/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/VersionOptionsSpecification.cs @@ -10,6 +10,8 @@ namespace Elsa.Persistence.Specifications.WorkflowDefinitions public VersionOptionsSpecification(VersionOptions versionOptions) => VersionOptions = versionOptions; public override Expression> ToExpression() { + if (VersionOptions.AllVersions) + return x => true; if (VersionOptions.IsDraft) return x => !x.IsPublished; if (VersionOptions.IsLatest) diff --git a/src/dashboards/blazor/ElsaDashboard.Application/Shared/Pager.razor.cs b/src/dashboards/blazor/ElsaDashboard.Application/Shared/Pager.razor.cs index f9b2b0e1b..ca3944e72 100644 --- a/src/dashboards/blazor/ElsaDashboard.Application/Shared/Pager.razor.cs +++ b/src/dashboards/blazor/ElsaDashboard.Application/Shared/Pager.razor.cs @@ -11,19 +11,6 @@ namespace ElsaDashboard.Application.Shared private int From => Page!.Value * PageSize!.Value + 1; private int To => Math.Min(From + PageSize!.Value, TotalCount); - private int PageCount => (int) (((float) TotalCount - 1) / PageSize!.Value) + 1; - - // private int PageCount - // { - // get - // { - // var count = TotalCount / PageSize!.Value; - // var hasLeftOver = TotalCount % (float) PageSize!.Value == 0; - // var extra = hasLeftOver ? 1 : 0; - // - // return count + extra; - // } - // } } } \ No newline at end of file diff --git a/src/designer/elsa-workflows-studio/package-lock.json b/src/designer/elsa-workflows-studio/package-lock.json index 0a7694f7b..408e66749 100644 --- a/src/designer/elsa-workflows-studio/package-lock.json +++ b/src/designer/elsa-workflows-studio/package-lock.json @@ -12,6 +12,7 @@ "@fullhuman/postcss-purgecss": "^4.0.3", "@stencil/core": "^2.5.2", "@stencil/postcss": "^2.0.0", + "@stencil/router": "^1.0.1", "@stencil/state-tunnel": "^1.0.1", "@stencil/store": "^1.4.1", "@tailwindcss/aspect-ratio": "^0.2.0", @@ -258,6 +259,14 @@ "@stencil/core": ">=2.3.0" } }, + "node_modules/@stencil/router": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stencil/router/-/router-1.0.1.tgz", + "integrity": "sha512-ZMholl1BE+glNAc/8pcEb9RYkeH0XETxsJbx6D7f3azTmaTXqKYty1IACP/3BtVjuimpfLdxQJ+J95wKmnYBtA==", + "dependencies": { + "@stencil/state-tunnel": "^1.0.1" + } + }, "node_modules/@stencil/state-tunnel": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stencil/state-tunnel/-/state-tunnel-1.0.1.tgz", @@ -10589,6 +10598,14 @@ "postcss": "~8.2.1" } }, + "@stencil/router": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stencil/router/-/router-1.0.1.tgz", + "integrity": "sha512-ZMholl1BE+glNAc/8pcEb9RYkeH0XETxsJbx6D7f3azTmaTXqKYty1IACP/3BtVjuimpfLdxQJ+J95wKmnYBtA==", + "requires": { + "@stencil/state-tunnel": "^1.0.1" + } + }, "@stencil/state-tunnel": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stencil/state-tunnel/-/state-tunnel-1.0.1.tgz", diff --git a/src/designer/elsa-workflows-studio/package.json b/src/designer/elsa-workflows-studio/package.json index ab2bf0931..d9fcbe782 100644 --- a/src/designer/elsa-workflows-studio/package.json +++ b/src/designer/elsa-workflows-studio/package.json @@ -23,13 +23,14 @@ "test": "stencil test --spec --e2e", "test.watch": "stencil test --spec --e2e --watchAll", "generate": "stencil generate", - "build:tailwind:dev": "cross-env NODE_ENV=development tailwind build ./tailwind.css -o ./src/globals/tailwind.css & copyfiles -u 2 \"./src/globals/tailwind.css\" \"./src/assets\"", - "build:tailwind:prod": "cross-env NODE_ENV=production tailwind build ./tailwind.css -o ./src/globals/tailwind.css & copyfiles -u 2 \"./src/globals/tailwind.css\" \"./src/assets\"" + "build:tailwind:dev": "cross-env NODE_ENV=development tailwind build ./tailwind.css -o ./src/globals/tailwind.css & copyfiles -u 2 \"./src/globals/tailwind.css\" \"./src/assets/styles\"", + "build:tailwind:prod": "cross-env NODE_ENV=production tailwind build ./tailwind.css -o ./src/globals/tailwind.css & copyfiles -u 2 \"./src/globals/tailwind.css\" \"./src/assets/styles\"" }, "dependencies": { "@fullhuman/postcss-purgecss": "^4.0.3", "@stencil/core": "^2.5.2", "@stencil/postcss": "^2.0.0", + "@stencil/router": "^1.0.1", "@stencil/state-tunnel": "^1.0.1", "@stencil/store": "^1.4.1", "@tailwindcss/aspect-ratio": "^0.2.0", @@ -43,6 +44,7 @@ "eslint": "7.23.0", "js-event-bus": "^1.0.3", "jsplumb": "2.15.5", + "lodash": "^4.17.21", "monaco-editor": "^0.23.0", "postcss": "^8.2.9", "postcss-import": "^14.0.0", diff --git a/src/designer/elsa-workflows-studio/src/assets/images/favicon-16x16.png b/src/designer/elsa-workflows-studio/src/assets/images/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..12a813929485496a98dcca6de8670b2d9299d86f GIT binary patch literal 1070 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)W;g& z6XNrjDP;|{RW-GqP1)&}7Dn8d zV_X-b(GjipvRD3nhrqOuvZ|`;>RK&x6PJ#xz~d84>SML9Hc3v8lC#pUs;qAB=$t!u zUP)QGMVObekF{K&wPB=3X+`DiS#z3OTF;(6cl_9KODh{28~alyPMtV$vbnjnsi|e( zzWwbTT|K>hyLRoat8bh(ZHB9xM`dMoO--Grm#>ene??`rvy0o*Y17}ndpCK?)S}|j z;*!$R((<=&-@Vz_u?iHDB|(0{|D+zX*Mc}n-tI089jvk*Kn`btM`SSrgPt-7Ggd6M zF9Qm8c)B=-NL)@%NN{0&QS*k$=ZwypoSZi@b9@3A_44H6?CKaD6%$u9bgY=Mqh-mI zEj>CR4t{Ztfu51Bp}w+O3l^?ix>kAR>gD+iq6Q{LW`?H5+c#`!;*2o9b>r4eV=D_M z);V(|C1YbGCGXx@$Rsx}?w;Mgdv*U90~!x3crf9@g$WN97%ckR#Kcg_EvR|P|Lz%} zn^a3&BT7;dOH!?pi&B9UgOP!efv%w;5QP|8TA5f{8Cz-_7+4t?+?rN)14Tn_eoAIq zC2kF?PoGNxYH$PDP@JDuQl40p%HWxsn4apJn4X!Otzf2Su4kcZsbFMaXrgOis%vPZ z5NK$okWo@nV5P5LUS6)32~rKjK-GHrMd^3i-U1C|kN}w&l2MwQWM$=&pIn-onpa|F z6#!IP%wV|u|89LWHDEiftTIwF(=$pK3@wfL8H!qgYQ&MufvO45Oex6#DY?8xkprki z5=n_~W^QUpWkD(f*j4%kdFl3>!u-(8@eKj0VlXr_Ff}wXF*LV~oW{%qRKkyBPH<*b zDuaQO)09PaZ-7!^NK&Ceo(yT3IjKPJ>*wZ`mwpY-_X?Dz%0!& z#V9GsG{wv`IWf&5ImN`t+|<~_*xWcVRS&2`59q#yid$WPHZXX)`njxgN@xNA$uf4# literal 0 HcmV?d00001 diff --git a/src/designer/elsa-workflows-studio/src/assets/images/favicon-32x32.png b/src/designer/elsa-workflows-studio/src/assets/images/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a3db0929b8a6a30e45656fd6d11cf225e16b0e80 GIT binary patch literal 1679 zcmZ{k2~d+q6vtOAt=d5-Ng$9rkU$Li^5ulYA`*iTAgDl4%c$fc2^v6%reMV=$SG6; zq6jK-sP#f?v7R%5f--{KARrxSD^?V&RS<_dwI5D9wa#>B-@bXfzxRK;vpbu&IwII% zk^3S5fP*YV8i{!FoGqA-jMCctTZsEe7bp(|;NsVxzERpE@x0W?Ua#tIp~=2M^K;3oH?r?Q;$RuS-ITVoTM>KRjH-r8QPZ?95z z9{HlDB6^@))>bGS%IEyDkMSsvI-Y}@$U?u!`m83FK%&@ejo~{DTkqDPUt~J(4rloL zY8$KxoyT#%Wn(&1(f&*n%9R%tyy;4@y60GIUnS?^KE~sG>O?NCb2~=iM<7xtR8NS_ zb#Za0`3nMes#agg6%H5BTg>?ED2%@k))mL)3aB2m!-p#i3JRG_2!(RNLk#X#g`{B@ zNemN%h1{Fz)Rb@x%M)hvN=gnC7njsuxY*s@U0PZum99jiT}l32cP|e&A3AO+gh69N zL*<7Kl@AOIR9DxIjg9TxxeJdYp)puA8oM_qcYJ)jy1M4|>(}PAbc~Bzc24f>>@1n$ zdH#I;(9p0zC>kC8sp@z&o)-5DxYiqZblrnuFPnx$|Jn0@DbSjnRip62w@Kg`F zqZ3N6PnemR85|tcXyOS(GL6pA=@UjqMvBafYmjGZXNru7dh=)Lu^Uz-nx_g2mV#V+ zLI@HpOb%I}3IOCWXY;*Fi2_2#^XeeA&`@~p$j!`}l1l|=Dz4|8bUkgCMA{Va)?y=na(i@t*M;Y~t*7*SluA{M zX>Qq3%@~!1giE|bB4j~pZ53rli_7g}_8%#!ICw0^a-!L`=nCa%6bweV3>%MVYN zSB*L!y7txBl633+8%y06u7i8Y3dbrtP;)l_dnDckg?FMyHVk-OJi(zvF zzOXP}q~WSm0*z3hR>u3OHGHnGfXC-g^ zF?~{q9w9_bLQ<0H@bVBs#xBG=@O`-fe89T*`tuY>2{Y=?0s$crZx@WkOjQX<)6$tKc zmJDX9Y1ThIrulV(2jv9Wr!khk$FYC*GVVku77HQy-ux`f>M~QaH_2-KB-7`)o;l0CN|ez`4~db}G+d`^fA4L$bq8H7 rpcga@&4Z31ZC%x9)ZKmGPq^>_{a}6v%nzsimV{U1Q275JIPCcsO-pN) literal 0 HcmV?d00001 diff --git a/src/designer/elsa-workflows-studio/src/assets/images/logo.png b/src/designer/elsa-workflows-studio/src/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..28dbaafbfe82119161a9b48c7e1fb59fef019c2f GIT binary patch literal 9825 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 Iv{~r?0hzVtHvj+t literal 0 HcmV?d00001 diff --git a/src/designer/elsa-workflows-studio/src/assets/tailwind.css b/src/designer/elsa-workflows-studio/src/assets/styles/tailwind.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/assets/tailwind.css rename to src/designer/elsa-workflows-studio/src/assets/styles/tailwind.css diff --git a/src/designer/elsa-workflows-studio/src/components.d.ts b/src/designer/elsa-workflows-studio/src/components.d.ts index 8752c3122..2197ef0c6 100644 --- a/src/designer/elsa-workflows-studio/src/components.d.ts +++ b/src/designer/elsa-workflows-studio/src/components.d.ts @@ -5,10 +5,24 @@ * It contains typing information for all components that exist in this project. */ import { HTMLStencilElement, JSXBase } from "@stencil/core/internal"; +import { MatchResults, RouterHistory } from "@stencil/router"; import { ActivityDefinitionProperty, ActivityDesignDisplayContext, ActivityModel, ActivityPropertyDescriptor, VersionOptions, WorkflowDefinition, WorkflowModel } from "./models"; -import { MonacoValueChangedArgs } from "./components/editors/monaco/elsa-monaco/elsa-monaco"; +import { MenuItem } from "./components/controls/elsa-context-menu/models"; +import { MonacoValueChangedArgs } from "./components/controls/elsa-monaco/elsa-monaco"; import { ToastNotificationOptions } from "./components/shared/elsa-toast-notification/elsa-toast-notification"; export namespace Components { + interface AppRoot { + "serverUrl": string; + } + interface AppWorkflowDefinitionsEdit { + "match": MatchResults; + "serverUrl": string; + } + interface AppWorkflowDefinitionsList { + "serverUrl": string; + } + interface AppWorkflowRegistry { + } interface ElsaActivityEditorModal { } interface ElsaActivityPickerModal { @@ -21,6 +35,14 @@ export namespace Components { "propertyDescriptor": ActivityPropertyDescriptor; "propertyModel": ActivityDefinitionProperty; } + interface ElsaConfirmDialog { + "hide": () => Promise; + "show": (caption: string, message: string) => Promise; + } + interface ElsaContextMenu { + "history": RouterHistory; + "menuItems": Array; + } interface ElsaDesignerTree { "destroyJsPlumb": () => Promise; "model": WorkflowModel; @@ -96,7 +118,7 @@ export namespace Components { "hide": () => Promise; "show": (options: ToastNotificationOptions) => Promise; } - interface ElsaWorkflowEditor { + interface ElsaWorkflowDefinitionEditorScreen { "exportWorkflow": () => Promise; "getServerUrl": () => Promise; "getWorkflowDefinitionId": () => Promise; @@ -105,6 +127,9 @@ export namespace Components { "serverUrl": string; "workflowDefinitionId": string; } + interface ElsaWorkflowDefinitionsListScreen { + "serverUrl": string; + } interface ElsaWorkflowEditorNotifications { } interface ElsaWorkflowPublishButton { @@ -116,6 +141,30 @@ export namespace Components { } } declare global { + interface HTMLAppRootElement extends Components.AppRoot, HTMLStencilElement { + } + var HTMLAppRootElement: { + prototype: HTMLAppRootElement; + new (): HTMLAppRootElement; + }; + interface HTMLAppWorkflowDefinitionsEditElement extends Components.AppWorkflowDefinitionsEdit, HTMLStencilElement { + } + var HTMLAppWorkflowDefinitionsEditElement: { + prototype: HTMLAppWorkflowDefinitionsEditElement; + new (): HTMLAppWorkflowDefinitionsEditElement; + }; + interface HTMLAppWorkflowDefinitionsListElement extends Components.AppWorkflowDefinitionsList, HTMLStencilElement { + } + var HTMLAppWorkflowDefinitionsListElement: { + prototype: HTMLAppWorkflowDefinitionsListElement; + new (): HTMLAppWorkflowDefinitionsListElement; + }; + interface HTMLAppWorkflowRegistryElement extends Components.AppWorkflowRegistry, HTMLStencilElement { + } + var HTMLAppWorkflowRegistryElement: { + prototype: HTMLAppWorkflowRegistryElement; + new (): HTMLAppWorkflowRegistryElement; + }; interface HTMLElsaActivityEditorModalElement extends Components.ElsaActivityEditorModal, HTMLStencilElement { } var HTMLElsaActivityEditorModalElement: { @@ -140,6 +189,18 @@ declare global { prototype: HTMLElsaCheckboxPropertyElement; new (): HTMLElsaCheckboxPropertyElement; }; + interface HTMLElsaConfirmDialogElement extends Components.ElsaConfirmDialog, HTMLStencilElement { + } + var HTMLElsaConfirmDialogElement: { + prototype: HTMLElsaConfirmDialogElement; + new (): HTMLElsaConfirmDialogElement; + }; + interface HTMLElsaContextMenuElement extends Components.ElsaContextMenu, HTMLStencilElement { + } + var HTMLElsaContextMenuElement: { + prototype: HTMLElsaContextMenuElement; + new (): HTMLElsaContextMenuElement; + }; interface HTMLElsaDesignerTreeElement extends Components.ElsaDesignerTree, HTMLStencilElement { } var HTMLElsaDesignerTreeElement: { @@ -218,11 +279,17 @@ declare global { prototype: HTMLElsaToastNotificationElement; new (): HTMLElsaToastNotificationElement; }; - interface HTMLElsaWorkflowEditorElement extends Components.ElsaWorkflowEditor, HTMLStencilElement { + interface HTMLElsaWorkflowDefinitionEditorScreenElement extends Components.ElsaWorkflowDefinitionEditorScreen, HTMLStencilElement { } - var HTMLElsaWorkflowEditorElement: { - prototype: HTMLElsaWorkflowEditorElement; - new (): HTMLElsaWorkflowEditorElement; + var HTMLElsaWorkflowDefinitionEditorScreenElement: { + prototype: HTMLElsaWorkflowDefinitionEditorScreenElement; + new (): HTMLElsaWorkflowDefinitionEditorScreenElement; + }; + interface HTMLElsaWorkflowDefinitionsListScreenElement extends Components.ElsaWorkflowDefinitionsListScreen, HTMLStencilElement { + } + var HTMLElsaWorkflowDefinitionsListScreenElement: { + prototype: HTMLElsaWorkflowDefinitionsListScreenElement; + new (): HTMLElsaWorkflowDefinitionsListScreenElement; }; interface HTMLElsaWorkflowEditorNotificationsElement extends Components.ElsaWorkflowEditorNotifications, HTMLStencilElement { } @@ -243,10 +310,16 @@ declare global { new (): HTMLElsaWorkflowSettingsModalElement; }; interface HTMLElementTagNameMap { + "app-root": HTMLAppRootElement; + "app-workflow-definitions-edit": HTMLAppWorkflowDefinitionsEditElement; + "app-workflow-definitions-list": HTMLAppWorkflowDefinitionsListElement; + "app-workflow-registry": HTMLAppWorkflowRegistryElement; "elsa-activity-editor-modal": HTMLElsaActivityEditorModalElement; "elsa-activity-picker-modal": HTMLElsaActivityPickerModalElement; "elsa-check-list-property": HTMLElsaCheckListPropertyElement; "elsa-checkbox-property": HTMLElsaCheckboxPropertyElement; + "elsa-confirm-dialog": HTMLElsaConfirmDialogElement; + "elsa-context-menu": HTMLElsaContextMenuElement; "elsa-designer-tree": HTMLElsaDesignerTreeElement; "elsa-designer-tree-activity": HTMLElsaDesignerTreeActivityElement; "elsa-dropdown-property": HTMLElsaDropdownPropertyElement; @@ -260,13 +333,26 @@ declare global { "elsa-script-property": HTMLElsaScriptPropertyElement; "elsa-single-line-property": HTMLElsaSingleLinePropertyElement; "elsa-toast-notification": HTMLElsaToastNotificationElement; - "elsa-workflow-editor": HTMLElsaWorkflowEditorElement; + "elsa-workflow-definition-editor-screen": HTMLElsaWorkflowDefinitionEditorScreenElement; + "elsa-workflow-definitions-list-screen": HTMLElsaWorkflowDefinitionsListScreenElement; "elsa-workflow-editor-notifications": HTMLElsaWorkflowEditorNotificationsElement; "elsa-workflow-publish-button": HTMLElsaWorkflowPublishButtonElement; "elsa-workflow-settings-modal": HTMLElsaWorkflowSettingsModalElement; } } declare namespace LocalJSX { + interface AppRoot { + "serverUrl"?: string; + } + interface AppWorkflowDefinitionsEdit { + "match"?: MatchResults; + "serverUrl"?: string; + } + interface AppWorkflowDefinitionsList { + "serverUrl"?: string; + } + interface AppWorkflowRegistry { + } interface ElsaActivityEditorModal { } interface ElsaActivityPickerModal { @@ -279,6 +365,12 @@ declare namespace LocalJSX { "propertyDescriptor"?: ActivityPropertyDescriptor; "propertyModel"?: ActivityDefinitionProperty; } + interface ElsaConfirmDialog { + } + interface ElsaContextMenu { + "history"?: RouterHistory; + "menuItems"?: Array; + } interface ElsaDesignerTree { "model"?: WorkflowModel; "onWorkflow-changed"?: (event: CustomEvent) => void; @@ -353,11 +445,15 @@ declare namespace LocalJSX { } interface ElsaToastNotification { } - interface ElsaWorkflowEditor { + interface ElsaWorkflowDefinitionEditorScreen { "monacoLibPath"?: string; + "onWorkflowSaved"?: (event: CustomEvent) => void; "serverUrl"?: string; "workflowDefinitionId"?: string; } + interface ElsaWorkflowDefinitionsListScreen { + "serverUrl"?: string; + } interface ElsaWorkflowEditorNotifications { } interface ElsaWorkflowPublishButton { @@ -372,10 +468,16 @@ declare namespace LocalJSX { "workflowDefinition"?: WorkflowDefinition; } interface IntrinsicElements { + "app-root": AppRoot; + "app-workflow-definitions-edit": AppWorkflowDefinitionsEdit; + "app-workflow-definitions-list": AppWorkflowDefinitionsList; + "app-workflow-registry": AppWorkflowRegistry; "elsa-activity-editor-modal": ElsaActivityEditorModal; "elsa-activity-picker-modal": ElsaActivityPickerModal; "elsa-check-list-property": ElsaCheckListProperty; "elsa-checkbox-property": ElsaCheckboxProperty; + "elsa-confirm-dialog": ElsaConfirmDialog; + "elsa-context-menu": ElsaContextMenu; "elsa-designer-tree": ElsaDesignerTree; "elsa-designer-tree-activity": ElsaDesignerTreeActivity; "elsa-dropdown-property": ElsaDropdownProperty; @@ -389,7 +491,8 @@ declare namespace LocalJSX { "elsa-script-property": ElsaScriptProperty; "elsa-single-line-property": ElsaSingleLineProperty; "elsa-toast-notification": ElsaToastNotification; - "elsa-workflow-editor": ElsaWorkflowEditor; + "elsa-workflow-definition-editor-screen": ElsaWorkflowDefinitionEditorScreen; + "elsa-workflow-definitions-list-screen": ElsaWorkflowDefinitionsListScreen; "elsa-workflow-editor-notifications": ElsaWorkflowEditorNotifications; "elsa-workflow-publish-button": ElsaWorkflowPublishButton; "elsa-workflow-settings-modal": ElsaWorkflowSettingsModal; @@ -399,10 +502,16 @@ export { LocalJSX as JSX }; declare module "@stencil/core" { export namespace JSX { interface IntrinsicElements { + "app-root": LocalJSX.AppRoot & JSXBase.HTMLAttributes; + "app-workflow-definitions-edit": LocalJSX.AppWorkflowDefinitionsEdit & JSXBase.HTMLAttributes; + "app-workflow-definitions-list": LocalJSX.AppWorkflowDefinitionsList & JSXBase.HTMLAttributes; + "app-workflow-registry": LocalJSX.AppWorkflowRegistry & JSXBase.HTMLAttributes; "elsa-activity-editor-modal": LocalJSX.ElsaActivityEditorModal & JSXBase.HTMLAttributes; "elsa-activity-picker-modal": LocalJSX.ElsaActivityPickerModal & JSXBase.HTMLAttributes; "elsa-check-list-property": LocalJSX.ElsaCheckListProperty & JSXBase.HTMLAttributes; "elsa-checkbox-property": LocalJSX.ElsaCheckboxProperty & JSXBase.HTMLAttributes; + "elsa-confirm-dialog": LocalJSX.ElsaConfirmDialog & JSXBase.HTMLAttributes; + "elsa-context-menu": LocalJSX.ElsaContextMenu & JSXBase.HTMLAttributes; "elsa-designer-tree": LocalJSX.ElsaDesignerTree & JSXBase.HTMLAttributes; "elsa-designer-tree-activity": LocalJSX.ElsaDesignerTreeActivity & JSXBase.HTMLAttributes; "elsa-dropdown-property": LocalJSX.ElsaDropdownProperty & JSXBase.HTMLAttributes; @@ -416,7 +525,8 @@ declare module "@stencil/core" { "elsa-script-property": LocalJSX.ElsaScriptProperty & JSXBase.HTMLAttributes; "elsa-single-line-property": LocalJSX.ElsaSingleLineProperty & JSXBase.HTMLAttributes; "elsa-toast-notification": LocalJSX.ElsaToastNotification & JSXBase.HTMLAttributes; - "elsa-workflow-editor": LocalJSX.ElsaWorkflowEditor & JSXBase.HTMLAttributes; + "elsa-workflow-definition-editor-screen": LocalJSX.ElsaWorkflowDefinitionEditorScreen & JSXBase.HTMLAttributes; + "elsa-workflow-definitions-list-screen": LocalJSX.ElsaWorkflowDefinitionsListScreen & JSXBase.HTMLAttributes; "elsa-workflow-editor-notifications": LocalJSX.ElsaWorkflowEditorNotifications & JSXBase.HTMLAttributes; "elsa-workflow-publish-button": LocalJSX.ElsaWorkflowPublishButton & JSXBase.HTMLAttributes; "elsa-workflow-settings-modal": LocalJSX.ElsaWorkflowSettingsModal & JSXBase.HTMLAttributes; diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.css b/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.tsx new file mode 100644 index 000000000..4d3efea5c --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/elsa-context-menu.tsx @@ -0,0 +1,73 @@ +import {Component, h, Prop} from '@stencil/core'; +import {RouterHistory} from "@stencil/router"; +import {leave, toggle} from 'el-transition' +import {registerClickOutside} from "stencil-click-outside"; +import {MenuItem} from "./models"; + +@Component({ + tag: 'elsa-context-menu', + styleUrl: 'elsa-context-menu.css', + shadow: false, +}) +export class AppContextMenu { + @Prop() history: RouterHistory; + @Prop() menuItems: Array = []; + + contextMenu: HTMLElement; + + closeContextMenu() { + leave(this.contextMenu); + } + + toggleMenu() { + toggle(this.contextMenu); + } + + async onMenuItemClick(e: Event, menuItem: MenuItem) { + e.preventDefault(); + + if (!!menuItem.anchorUrl) + this.history.push(menuItem.anchorUrl); + else if (!!menuItem.clickHandler) { + menuItem.clickHandler(e); + } + + this.closeContextMenu(); + } + + render() { + return ( +
registerClickOutside(this, el, this.closeContextMenu)}> + +
this.contextMenu = el} + data-transition-enter="transition ease-out duration-100" + data-transition-enter-start="transform opacity-0 scale-95" + data-transition-leave="transition ease-in duration-75" + data-transition-leave-start="transform opacity-100 scale-100" + data-transition-leave-end="transform opacity-0 scale-95" + class="hidden z-10 mx-3 origin-top-right absolute right-7 top-0 w-48 mt-1 rounded-md shadow-lg"> + +
+
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/models.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/models.tsx new file mode 100644 index 000000000..bc1f64ab4 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-context-menu/models.tsx @@ -0,0 +1,6 @@ +export interface MenuItem { + text: string; + anchorUrl?: string; + clickHandler?: (e: Event) => void; + icon?: any; +} diff --git a/src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/elsa-input-tags.css b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/elsa-input-tags.css rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/elsa-input-tags.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/elsa-input-tags.tsx rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx diff --git a/src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/readme.md b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/readme.md similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/controls/elsa-input-tags/readme.md rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/readme.md diff --git a/src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco-utils.ts b/src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco-utils.ts similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco-utils.ts rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco-utils.ts diff --git a/src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco.css b/src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco.css rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco.tsx similarity index 99% rename from src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco.tsx rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco.tsx index 4c0a33dd4..a4c71c77e 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/elsa-monaco.tsx +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/elsa-monaco.tsx @@ -1,6 +1,6 @@ import {Component, Host, h, Prop, State, Listen, Method, Watch, Event, EventEmitter} from '@stencil/core'; import {initializeMonacoWorker} from "./elsa-monaco-utils"; -import state from '../../../../utils/store'; +import state from '../../../utils/store'; // Until I figure out why the ESM loader doesn't work properly, we need to include these scripts manually from index.html // import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; diff --git a/src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/readme.md b/src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/readme.md similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/monaco/elsa-monaco/readme.md rename to src/designer/elsa-workflows-studio/src/components/controls/elsa-monaco/readme.md diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.css b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.css new file mode 100644 index 000000000..a8fb2e3dc --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.css @@ -0,0 +1,15 @@ +header { + background: #5851ff; + color: white; + height: 56px; + display: flex; + align-items: center; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); +} + +h1 { + font-size: 1.4rem; + font-weight: 500; + color: #fff; + padding: 0 12px; +} diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.tsx b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.tsx new file mode 100644 index 000000000..50760f9fd --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-root/app-root.tsx @@ -0,0 +1,62 @@ +import {Component, h, Prop} from '@stencil/core'; +import Tunnel, {DashboardState} from '../../../../data/dashboard'; + +@Component({ + tag: 'app-root', + styleUrl: 'app-root.css', + shadow: false, +}) +export class AppRoot { + + @Prop({attribute: 'server-url', reflect: true}) serverUrl: string; + + render() { + + const serverUrl = this.serverUrl; + + // TODO: Tunneling doesn't appear to be working in combination with the router. + // const tunnelState: DashboardState = { + // serverUrl: serverUrl, + // }; + + return ( +
+ + +
+ {/**/} + + + } exact={true}/> + + + + + + {/**/} +
+
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.css b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.tsx b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.tsx new file mode 100644 index 000000000..78db6ffe7 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-edit/app-workflow-definitions-edit.tsx @@ -0,0 +1,31 @@ +import {Component, Prop, h} from '@stencil/core'; +import {MatchResults} from '@stencil/router'; + +@Component({ + tag: 'app-workflow-definitions-edit', + styleUrl: 'app-workflow-definitions-edit.css', + shadow: false, +}) +export class AppWorkflowDefinitionsEdit { + @Prop() match: MatchResults; + @Prop() serverUrl: string; + + id?: string; + + componentWillLoad() { + let id = this.match.params.id; + + if (id == 'new') + id = null; + + this.id = id; + } + + render() { + const id = this.id; + + return
+ +
; + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.css b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.tsx b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.tsx new file mode 100644 index 000000000..f8e3f8a86 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-definitions-list/app-workflow-definitions-list.tsx @@ -0,0 +1,33 @@ +import {Component, h, Prop, State} from '@stencil/core'; + +@Component({ + tag: 'app-workflow-definitions-list', + styleUrl: 'app-workflow-definitions-list.css', + shadow: false, +}) +export class AppWorkflowDefinitionsList { + + @Prop() serverUrl: string; + + render() { + return ( +
+
+
+

+ Workflow Definitions +

+
+
+ + Create Workflow + +
+
+ + +
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.css b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.tsx b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.tsx new file mode 100644 index 000000000..53a19b4c2 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/dashboard/pages/app-workflow-registry/app-workflow-registry.tsx @@ -0,0 +1,69 @@ +import {Component, h} from '@stencil/core'; + +@Component({ + tag: 'app-workflow-registry', + styleUrl: 'app-workflow-registry.css', + shadow: false, +}) +export class AppHome { + render() { + return ( +
+
+
+

+ Workflow Registry +

+
+
+ + Create Workflow + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Name + Instances + +
+ + +
+
+
4 + 999 + 75
+
+
+
+ +
+
+
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree-activity/elsa-designer-tree-activity.tsx b/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree-activity/elsa-designer-tree-activity.tsx index 5e3230182..146cf6f01 100644 --- a/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree-activity/elsa-designer-tree-activity.tsx +++ b/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree-activity/elsa-designer-tree-activity.tsx @@ -1,9 +1,7 @@ import {Component, Event, EventEmitter, h, Host, Prop, State} from '@stencil/core'; import {leave, toggle} from 'el-transition' import {registerClickOutside} from "stencil-click-outside"; -import {ActivityIcon} from '../../../icons/activity-icon'; import {ActivityModel, ActivityDesignDisplayContext, EventTypes} from "../../../../models"; -import {eventBus} from '../../../../services/event-bus'; @Component({ tag: 'elsa-designer-tree-activity', @@ -49,8 +47,8 @@ export class ElsaDesignerTreeActivity { const displayName = activity.displayName && activity.displayName.length > 0 ? activity.displayName : activity.name && activity.name.length > 0 ? activity.name : activity.type return ( - this.onEditActivityClick(e)} + this.onEditActivityClick(e)} class="activity border-2 border-solid border-white rounded bg-white text-left text-black text-lg hover:border-blue-600 select-none max-w-md shadow-sm relative">
diff --git a/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree/elsa-designer-tree.css b/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree/elsa-designer-tree.css index 243130f44..833b3ed6c 100644 --- a/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree/elsa-designer-tree.css +++ b/src/designer/elsa-workflows-studio/src/components/designers/tree/elsa-designer-tree/elsa-designer-tree.css @@ -3,7 +3,7 @@ } .workflow-canvas { - background-image: url(build/assets/tile.png); + background-image: url(/build/assets/tile.png); background-repeat: repeat; background-size: 30px 30px; background-color: #FBFBFB; diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-expression-editor/elsa-expression-editor.css b/src/designer/elsa-workflows-studio/src/components/editors/elsa-expression-editor/elsa-expression-editor.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-expression-editor/elsa-expression-editor.css rename to src/designer/elsa-workflows-studio/src/components/editors/elsa-expression-editor/elsa-expression-editor.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-expression-editor/elsa-expression-editor.tsx b/src/designer/elsa-workflows-studio/src/components/editors/elsa-expression-editor/elsa-expression-editor.tsx similarity index 94% rename from src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-expression-editor/elsa-expression-editor.tsx rename to src/designer/elsa-workflows-studio/src/components/editors/elsa-expression-editor/elsa-expression-editor.tsx index d01a50e1a..3d719426d 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-expression-editor/elsa-expression-editor.tsx +++ b/src/designer/elsa-workflows-studio/src/components/editors/elsa-expression-editor/elsa-expression-editor.tsx @@ -1,7 +1,7 @@ import {Component, EventEmitter, h, Host, Method, Prop, State, Watch, Event} from '@stencil/core'; -import {createElsaClient} from "../../../../services/elsa-client"; +import {createElsaClient} from "../../../services/elsa-client"; import Tunnel from '../../../data/workflow-editor'; -import {MonacoValueChangedArgs} from "../../monaco/elsa-monaco/elsa-monaco"; +import {MonacoValueChangedArgs} from "../../controls/elsa-monaco/elsa-monaco"; @Component({ tag: 'elsa-expression-editor', diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-property-editor/elsa-property-editor.css b/src/designer/elsa-workflows-studio/src/components/editors/elsa-property-editor/elsa-property-editor.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-property-editor/elsa-property-editor.css rename to src/designer/elsa-workflows-studio/src/components/editors/elsa-property-editor/elsa-property-editor.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-property-editor/elsa-property-editor.tsx b/src/designer/elsa-workflows-studio/src/components/editors/elsa-property-editor/elsa-property-editor.tsx similarity index 99% rename from src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-property-editor/elsa-property-editor.tsx rename to src/designer/elsa-workflows-studio/src/components/editors/elsa-property-editor/elsa-property-editor.tsx index eb544d773..f0d092ff8 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-property-editor/elsa-property-editor.tsx +++ b/src/designer/elsa-workflows-studio/src/components/editors/elsa-property-editor/elsa-property-editor.tsx @@ -1,5 +1,5 @@ import {Component, h, Prop, State, Event, EventEmitter} from '@stencil/core'; -import {ActivityDefinitionProperty, ActivityPropertyDescriptor, SyntaxNames} from "../../../../models"; +import {ActivityDefinitionProperty, ActivityPropertyDescriptor, SyntaxNames} from "../../../models"; import {registerClickOutside} from "stencil-click-outside"; import {enter, leave, toggle} from 'el-transition' diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-script-property/elsa-script-property.tsx b/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-script-property/elsa-script-property.tsx index 83fed57be..75e7a6e4f 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-script-property/elsa-script-property.tsx +++ b/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-script-property/elsa-script-property.tsx @@ -1,8 +1,8 @@ import {Component, h, Prop, State} from '@stencil/core'; import {ActivityDefinitionProperty, ActivityPropertyDescriptor} from "../../../../models"; import {createElsaClient} from "../../../../services/elsa-client"; -import Tunnel from '../../../data/workflow-editor'; -import {MonacoValueChangedArgs} from "../../monaco/elsa-monaco/elsa-monaco"; +import Tunnel from '../../../../data/workflow-editor'; +import {MonacoValueChangedArgs} from "../../../controls/elsa-monaco/elsa-monaco"; @Component({ tag: 'elsa-script-property', diff --git a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.css b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.css rename to src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.tsx b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.tsx similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.tsx rename to src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/elsa-activity-editor-modal.tsx diff --git a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/readme.md b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/readme.md similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-activity-editor-modal/readme.md rename to src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-activity-editor-modal/readme.md diff --git a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-workflow-editor-notifications/elsa-workflow-editor-notifications.css b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.css similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-workflow-editor-notifications/elsa-workflow-editor-notifications.css rename to src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.css diff --git a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-workflow-editor/elsa-workflow-editor.tsx b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx similarity index 97% rename from src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-workflow-editor/elsa-workflow-editor.tsx rename to src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx index 2d6556261..8e1ff06da 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/workflow-editor/elsa-workflow-editor/elsa-workflow-editor.tsx +++ b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx @@ -4,20 +4,21 @@ import {ActivityDefinition, ActivityDescriptor, ActivityModel, ConnectionDefinit import {createElsaClient, SaveWorkflowDefinitionRequest} from "../../../../services/elsa-client"; import {pluginManager} from '../../../../services/plugin-manager'; import state from '../../../../utils/store'; -import Tunnel, {WorkflowEditorState} from '../../../data/workflow-editor'; +import Tunnel, {WorkflowEditorState} from '../../../../data/workflow-editor'; import {downloadFromBlob} from "../../../../utils/download"; @Component({ - tag: 'elsa-workflow-editor', - styleUrl: 'elsa-workflow-editor.css', + tag: 'elsa-workflow-definition-editor-screen', + styleUrl: 'elsa-workflow-definition-editor-screen.css', shadow: false, }) -export class ElsaWorkflowDefinitionEditor { +export class ElsaWorkflowDefinitionEditorScreen { constructor() { pluginManager.initialize(); } + @Event() workflowSaved: EventEmitter; @Prop({attribute: 'workflow-definition-id', reflect: true}) workflowDefinitionId: string; @Prop({attribute: 'server-url', reflect: true}) serverUrl: string; @Prop({attribute: 'monaco-lib-path', reflect: true}) monacoLibPath: string; @@ -213,6 +214,7 @@ export class ElsaWorkflowDefinitionEditor { this.saved = !publish; this.publishing = false; setTimeout(() => this.saved = false, 500); + this.workflowSaved.emit(workflowDefinition); } catch (e) { console.error(e); this.saving = false; @@ -343,7 +345,7 @@ export class ElsaWorkflowDefinitionEditor { renderWorkflowSettingsButton() { return ( +
+
+
+ +
+
+ +
+

+ {this.message} +

+
+
+
+
+
+
+ + +
+
+ +
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/data/dashboard.tsx b/src/designer/elsa-workflows-studio/src/data/dashboard.tsx new file mode 100644 index 000000000..9f8cc9049 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/data/dashboard.tsx @@ -0,0 +1,13 @@ +import {createProviderConsumer} from "@stencil/state-tunnel"; +import {h} from "@stencil/core"; + +export interface DashboardState { + serverUrl: string; +} + +export default createProviderConsumer( + { + serverUrl: null + }, + (subscribe, child) => () +); diff --git a/src/designer/elsa-workflows-studio/src/components/data/workflow-editor.tsx b/src/designer/elsa-workflows-studio/src/data/workflow-editor.tsx similarity index 100% rename from src/designer/elsa-workflows-studio/src/components/data/workflow-editor.tsx rename to src/designer/elsa-workflows-studio/src/data/workflow-editor.tsx diff --git a/src/designer/elsa-workflows-studio/src/index.html b/src/designer/elsa-workflows-studio/src/index.html index c6c56897b..2a833516f 100644 --- a/src/designer/elsa-workflows-studio/src/index.html +++ b/src/designer/elsa-workflows-studio/src/index.html @@ -7,14 +7,16 @@ - + - + + + diff --git a/src/designer/elsa-workflows-studio/src/index.ts b/src/designer/elsa-workflows-studio/src/index.ts index 7531c10b8..9d8623245 100644 --- a/src/designer/elsa-workflows-studio/src/index.ts +++ b/src/designer/elsa-workflows-studio/src/index.ts @@ -1 +1,2 @@ export { Components, JSX } from './components'; +import '@stencil/router'; diff --git a/src/designer/elsa-workflows-studio/src/models/domain.ts b/src/designer/elsa-workflows-studio/src/models/domain.ts index 0f2ff3500..14ecdea8f 100644 --- a/src/designer/elsa-workflows-studio/src/models/domain.ts +++ b/src/designer/elsa-workflows-studio/src/models/domain.ts @@ -20,6 +20,20 @@ export interface WorkflowDefinition { connections: Array; } +export interface WorkflowDefinitionSummary { + id?: string; + definitionId?: string; + tenantId?: string; + name?: string; + displayName?: string; + description?: string; + version: number; + isSingleton?: boolean; + persistenceBehavior?: WorkflowPersistenceBehavior; + isPublished?: boolean; + isLatest?: boolean; +} + export interface ActivityDefinition { activityId: string; type: string; @@ -75,17 +89,21 @@ export interface VersionOptions { version?: number; } -export const getVersionOptionsString = (versionOptions: VersionOptions) => { +export const getVersionOptionsString = (versionOptions?: VersionOptions) => { + + if(!versionOptions) + return ''; + return versionOptions.allVersions - ? "AllVersions" + ? 'AllVersions' : versionOptions.isDraft - ? "Draft" + ? 'Draft' : versionOptions.isLatest - ? "Latest" + ? 'Latest' : versionOptions.isPublished - ? "Published" + ? 'Published' : versionOptions.isLatestOrPublished - ? "LatestOrPublished" + ? 'LatestOrPublished' : versionOptions.version.toString(); }; @@ -112,6 +130,13 @@ export interface ActivityPropertyDescriptor { supportedSyntaxes: Array } +export interface PagedList { + items: Array; + page: number; + pageSize: number; + totalCount: number; +} + export enum ActivityTraits { Action = 1, Trigger = 2, diff --git a/src/designer/elsa-workflows-studio/src/services/elsa-client.ts b/src/designer/elsa-workflows-studio/src/services/elsa-client.ts index 336f14f8c..adcd28ebc 100644 --- a/src/designer/elsa-workflows-studio/src/services/elsa-client.ts +++ b/src/designer/elsa-workflows-studio/src/services/elsa-client.ts @@ -1,5 +1,17 @@ import axios, {AxiosRequestConfig} from "axios"; -import {ActivityDefinition, ActivityDescriptor, ConnectionDefinition, getVersionOptionsString, Variables, VersionOptions, WorkflowContextOptions, WorkflowDefinition, WorkflowPersistenceBehavior} from "../models"; +import { + ActivityDefinition, + ActivityDescriptor, + ConnectionDefinition, + getVersionOptionsString, + PagedList, + Variables, + VersionOptions, + WorkflowContextOptions, + WorkflowDefinition, + WorkflowDefinitionSummary, + WorkflowPersistenceBehavior +} from "../models"; export const createElsaClient = function (serverUrl: string): ElsaClient { const config: AxiosRequestConfig = { @@ -16,6 +28,11 @@ export const createElsaClient = function (serverUrl: string): ElsaClient { } }, workflowDefinitionsApi: { + list: async (page?: number, pageSize?: number, versionOptions?: VersionOptions) => { + const versionOptionsString = getVersionOptionsString(versionOptions); + const response = await httpClient.get>(`v1/workflow-definitions?version=${versionOptionsString}`); + return response.data; + }, getByDefinitionAndVersion: async (definitionId: string, versionOptions: VersionOptions) => { const versionOptionsString = getVersionOptionsString(versionOptions); const response = await httpClient.get(`v1/workflow-definitions/${definitionId}/${versionOptionsString}`); @@ -25,6 +42,9 @@ export const createElsaClient = function (serverUrl: string): ElsaClient { const response = await httpClient.post('v1/workflow-definitions', request); return response.data; }, + delete: async definitionId => { + await httpClient.delete(`v1/workflow-definitions/${definitionId}`); + }, retract: async workflowDefinitionId => { const response = await httpClient.post(`v1/workflow-definitions/${workflowDefinitionId}/retract`); return response.data; @@ -78,8 +98,12 @@ export interface ActivitiesApi { export interface WorkflowDefinitionsApi { getByDefinitionAndVersion(definitionId: string, versionOptions: VersionOptions): Promise + list(page?: number, pageSize?: number, versionOptions?: VersionOptions): Promise> + save(request: SaveWorkflowDefinitionRequest): Promise + delete(definitionId: string): Promise + retract(workflowDefinitionId: string): Promise export(workflowDefinitionId: string, versionOptions: VersionOptions): Promise diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs index 2d9d8e16f..f4d0313df 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs @@ -1,6 +1,8 @@ +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AutoMapper; using Elsa.Models; using Elsa.Persistence; using Elsa.Persistence.Specifications; @@ -23,30 +25,33 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { private readonly IWorkflowDefinitionStore _workflowDefinitionStore; private readonly IContentSerializer _serializer; + private readonly IMapper _mapper; - public List(IWorkflowDefinitionStore workflowDefinitionStore, IContentSerializer serializer) + public List(IWorkflowDefinitionStore workflowDefinitionStore, IContentSerializer serializer, IMapper mapper) { _workflowDefinitionStore = workflowDefinitionStore; _serializer = serializer; + _mapper = mapper; } [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(PagedList))] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(PagedList))] [SwaggerResponseExample(StatusCodes.Status200OK, typeof(WorkflowDefinitionPagedListExample))] [SwaggerOperation( Summary = "Returns a list of workflow definitions.", - Description = "Returns paginated a list of workflow definitions. When no version options are specified, the latest versions are returned.", + Description = "Returns paginated a list of workflow definition summaries. When no version options are specified, the latest versions are returned.", OperationId = "WorkflowDefinitions.List", Tags = new[] { "WorkflowDefinitions" }) ] - public async Task>> Handle(int? page = default, int? pageSize = default, VersionOptions? version = default, CancellationToken cancellationToken = default) + public async Task>> Handle(int? page = default, int? pageSize = default, VersionOptions? version = default, CancellationToken cancellationToken = default) { version ??= VersionOptions.Latest; var specification = new VersionOptionsSpecification(version.Value); - var totalCount = await _workflowDefinitionStore.CountAsync(specification, cancellationToken: cancellationToken); + var totalCount = await _workflowDefinitionStore.CountAsync(specification, cancellationToken); var paging = page == null || pageSize == null ? default : Paging.Page(page.Value, pageSize.Value); var items = await _workflowDefinitionStore.FindManyAsync(specification, paging: paging, cancellationToken: cancellationToken); - var pagedList = new PagedList(items.ToList(), page, pageSize, totalCount); + var summaries = _mapper.Map>(items); + var pagedList = new PagedList(summaries, page, pageSize, totalCount); return Json(pagedList, _serializer.GetSettings()); } diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Models.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Models.cs new file mode 100644 index 000000000..45134cbf7 --- /dev/null +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Models.cs @@ -0,0 +1,16 @@ +using Elsa.Models; + +namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions +{ + public record WorkflowDefinitionSummaryModel( + string Id, + string DefinitionId, + string? Name, + string? DisplayName, + string? Description, + int Version, + bool IsSingleton, + WorkflowPersistenceBehavior PersistenceBehavior, + bool IsPublished, + bool IsLatest); +} \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Mapping/AutoMapperProfile.cs b/src/server/Elsa.Server.Api/Mapping/AutoMapperProfile.cs index d70d9277f..d6a0a5d0a 100644 --- a/src/server/Elsa.Server.Api/Mapping/AutoMapperProfile.cs +++ b/src/server/Elsa.Server.Api/Mapping/AutoMapperProfile.cs @@ -1,5 +1,6 @@ using AutoMapper; using Elsa.Models; +using Elsa.Server.Api.Endpoints.WorkflowDefinitions; using Elsa.Server.Api.Endpoints.WorkflowInstances; using Elsa.Server.Api.Endpoints.WorkflowRegistry; using Elsa.Services.Models; @@ -16,6 +17,7 @@ namespace Elsa.Server.Api.Mapping CreateMap(); CreateMap().ConvertUsing(); CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Swagger/Examples/WebhookDefinitionExample.cs b/src/server/Elsa.Server.Api/Swagger/Examples/WebhookDefinitionExample.cs index 5485be203..efa3c641c 100644 --- a/src/server/Elsa.Server.Api/Swagger/Examples/WebhookDefinitionExample.cs +++ b/src/server/Elsa.Server.Api/Swagger/Examples/WebhookDefinitionExample.cs @@ -1,5 +1,6 @@ using System; using Elsa.Activities.Webhooks.Models; +using Elsa.Server.Api.Endpoints.WorkflowDefinitions; using Swashbuckle.AspNetCore.Filters; namespace Elsa.Server.Api.Swagger.Examples diff --git a/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelExample.cs b/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelExample.cs new file mode 100644 index 000000000..95cc040be --- /dev/null +++ b/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelExample.cs @@ -0,0 +1,24 @@ +using System; +using Elsa.Models; +using Elsa.Server.Api.Endpoints.WorkflowDefinitions; +using Swashbuckle.AspNetCore.Filters; + +namespace Elsa.Server.Api.Swagger.Examples +{ + public class WorkflowDefinitionSummaryModelExample : IExamplesProvider + { + public WorkflowDefinitionSummaryModel GetExamples() => + new( + Guid.NewGuid().ToString("N"), + Guid.NewGuid().ToString("N"), + "ProcessOrderWorkflow", + "Process Order Workflow", + "Process new orders", + 1, + false, + WorkflowPersistenceBehavior.Suspended, + true, + false + ); + } +} \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelPagedListExample.cs b/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelPagedListExample.cs new file mode 100644 index 000000000..982f6a037 --- /dev/null +++ b/src/server/Elsa.Server.Api/Swagger/Examples/WorkflowDefinitionSummaryModelPagedListExample.cs @@ -0,0 +1,16 @@ +using System.Linq; +using Elsa.Server.Api.Endpoints.WorkflowDefinitions; +using Elsa.Server.Api.Models; +using Swashbuckle.AspNetCore.Filters; + +namespace Elsa.Server.Api.Swagger.Examples +{ + public class WorkflowDefinitionSummaryModelPagedListExample : IExamplesProvider> + { + public PagedList GetExamples() + { + var examples = Enumerable.Range(1, 3).Select(_ => new WorkflowDefinitionSummaryModelExample().GetExamples()).ToList(); + return new PagedList(examples, 0, 10, examples.Count); + } + } +} \ No newline at end of file