diff --git a/src/designer/elsa-workflows-studio/src/components.d.ts b/src/designer/elsa-workflows-studio/src/components.d.ts index 317abda98..21576081e 100644 --- a/src/designer/elsa-workflows-studio/src/components.d.ts +++ b/src/designer/elsa-workflows-studio/src/components.d.ts @@ -104,6 +104,11 @@ export namespace Components { "propertyDescriptor": ActivityPropertyDescriptor; "propertyModel": ActivityDefinitionProperty; } + interface ElsaPager { + "page": number; + "pageSize": number; + "totalCount": number; + } interface ElsaPropertyEditor { "context"?: string; "editorHeight": string; @@ -284,6 +289,12 @@ declare global { prototype: HTMLElsaMultiTextPropertyElement; new (): HTMLElsaMultiTextPropertyElement; }; + interface HTMLElsaPagerElement extends Components.ElsaPager, HTMLStencilElement { + } + var HTMLElsaPagerElement: { + prototype: HTMLElsaPagerElement; + new (): HTMLElsaPagerElement; + }; interface HTMLElsaPropertyEditorElement extends Components.ElsaPropertyEditor, HTMLStencilElement { } var HTMLElsaPropertyEditorElement: { @@ -366,6 +377,7 @@ declare global { "elsa-monaco": HTMLElsaMonacoElement; "elsa-multi-line-property": HTMLElsaMultiLinePropertyElement; "elsa-multi-text-property": HTMLElsaMultiTextPropertyElement; + "elsa-pager": HTMLElsaPagerElement; "elsa-property-editor": HTMLElsaPropertyEditorElement; "elsa-script-property": HTMLElsaScriptPropertyElement; "elsa-single-line-property": HTMLElsaSingleLinePropertyElement; @@ -470,6 +482,11 @@ declare namespace LocalJSX { "propertyDescriptor"?: ActivityPropertyDescriptor; "propertyModel"?: ActivityDefinitionProperty; } + interface ElsaPager { + "page"?: number; + "pageSize"?: number; + "totalCount"?: number; + } interface ElsaPropertyEditor { "context"?: string; "editorHeight"?: string; @@ -544,6 +561,7 @@ declare namespace LocalJSX { "elsa-monaco": ElsaMonaco; "elsa-multi-line-property": ElsaMultiLineProperty; "elsa-multi-text-property": ElsaMultiTextProperty; + "elsa-pager": ElsaPager; "elsa-property-editor": ElsaPropertyEditor; "elsa-script-property": ElsaScriptProperty; "elsa-single-line-property": ElsaSingleLineProperty; @@ -581,6 +599,7 @@ declare module "@stencil/core" { "elsa-monaco": LocalJSX.ElsaMonaco & JSXBase.HTMLAttributes; "elsa-multi-line-property": LocalJSX.ElsaMultiLineProperty & JSXBase.HTMLAttributes; "elsa-multi-text-property": LocalJSX.ElsaMultiTextProperty & JSXBase.HTMLAttributes; + "elsa-pager": LocalJSX.ElsaPager & JSXBase.HTMLAttributes; "elsa-property-editor": LocalJSX.ElsaPropertyEditor & JSXBase.HTMLAttributes; "elsa-script-property": LocalJSX.ElsaScriptProperty & JSXBase.HTMLAttributes; "elsa-single-line-property": LocalJSX.ElsaSingleLineProperty & JSXBase.HTMLAttributes; diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-pager/elsa-pager.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-pager/elsa-pager.tsx new file mode 100644 index 000000000..181a94c46 --- /dev/null +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-pager/elsa-pager.tsx @@ -0,0 +1,128 @@ +import {Component, Event, EventEmitter, h, Prop} from '@stencil/core'; + +@Component({ + tag: 'elsa-pager', + shadow: false, +}) +export class ElsaPager { + + @Prop() page: number; + @Prop() pageSize: number; + @Prop() totalCount: number; + + render() { + const page = this.page; + const pageSize = this.pageSize; + const totalCount = this.totalCount; + + const from = page * pageSize + 1; + const to = Math.min(from + pageSize, totalCount); + const pageCount = Math.round(((totalCount - 1) / pageSize) + 1); + + const maxPageButtons = 10; + const fromPage = Math.max(0, page - maxPageButtons / 2); + const toPage = Math.min(pageCount, fromPage + maxPageButtons); + + const renderPreviousButton = function () { + if (page <= 0) + return; + + return + Previous + + } + + const renderNextButton = function () { + if (page >= pageCount) + return; + + return + Next + + } + + const renderChevronLeft = function () { + if (page <= 0) + return; + + return ( + + + + + ); + } + + const renderChevronRight = function () { + if (page >= pageCount - 1) + return; + + return ( + + + + + + ); + } + + const renderPagerButtons = function () { + const buttons = []; + + for (let i = fromPage; i < toPage; i++) { + const isCurrent = page == i; + const isFirst = i == fromPage; + const isLast = i == toPage - 1; + const leftRoundedClass = isFirst && isCurrent ? "rounded-l-md" : ""; + const rightRoundedClass = isLast && isCurrent ? "rounded-r-md" : ""; + + if (isCurrent) { + buttons.push( + {i + 1} + ); + } else { + buttons.push( + {i + 1} + ) + } + } + + return buttons; + } + + return ( +
+
+ {renderPreviousButton()} + {renderNextButton()} +
+ +
+ ); + } +} diff --git a/src/designer/elsa-workflows-studio/src/components/screens/workflow-instances-list/elsa-workflow-instances-list-screen/elsa-workflow-instances-list-screen.tsx b/src/designer/elsa-workflows-studio/src/components/screens/workflow-instances-list/elsa-workflow-instances-list-screen/elsa-workflow-instances-list-screen.tsx index 12e3a6f08..c6a5ba4b0 100644 --- a/src/designer/elsa-workflows-studio/src/components/screens/workflow-instances-list/elsa-workflow-instances-list-screen/elsa-workflow-instances-list-screen.tsx +++ b/src/designer/elsa-workflows-studio/src/components/screens/workflow-instances-list/elsa-workflow-instances-list-screen/elsa-workflow-instances-list-screen.tsx @@ -22,6 +22,8 @@ export class ElsaWorkflowInstancesListScreen { @State() selectedOrderBy?: OrderBy = OrderBy.Started; @State() selectedWorkflowInstanceIds: Array = []; @State() selectAllChecked: boolean; + @State() page: number = 0; + @State() pageSize: number = 25; confirmDialog: HTMLElsaConfirmDialogElement; @@ -50,10 +52,7 @@ export class ElsaWorkflowInstancesListScreen { async loadWorkflowInstances() { const elsaClient = this.createClient(); - const page = 1; - const pageSize = 25; - - this.workflowInstances = await elsaClient.workflowInstancesApi.list(page, pageSize, this.selectedWorkflowId, this.selectedWorkflowStatus, this.selectedOrderBy); + this.workflowInstances = await elsaClient.workflowInstancesApi.list(this.page, this.pageSize, this.selectedWorkflowId, this.selectedWorkflowStatus, this.selectedOrderBy); } createClient() { @@ -140,8 +139,8 @@ export class ElsaWorkflowInstancesListScreen { await elsaClient.workflowInstancesApi.delete(workflowInstance.id); await this.loadWorkflowInstances(); } - - async onBulkDelete(){ + + async onBulkDelete() { const result = await this.confirmDialog.show('Delete Selected Workflow Instances', 'Are you sure you wish to permanently delete all selected workflow instances?'); if (!result) @@ -154,9 +153,8 @@ export class ElsaWorkflowInstancesListScreen { async onBulkActionSelected(e: CustomEvent) { const action = e.detail; - - switch(action.name) - { + + switch (action.name) { case 'Delete': await this.onBulkDelete(); } @@ -293,7 +291,7 @@ export class ElsaWorkflowInstancesListScreen { })} - + this.confirmDialog = el}/>