diff --git a/src/designer/elsa-workflows-designer/src/components.d.ts b/src/designer/elsa-workflows-designer/src/components.d.ts index 928426eac..5a63df4e0 100644 --- a/src/designer/elsa-workflows-designer/src/components.d.ts +++ b/src/designer/elsa-workflows-designer/src/components.d.ts @@ -119,6 +119,8 @@ export namespace Components { "label": Label; } interface ElsaLabelPicker { + "buttonClass"?: string; + "containerClass"?: string; "selectedLabels": Array; } interface ElsaLabelsManager { @@ -658,6 +660,8 @@ declare namespace LocalJSX { "onLabelUpdated"?: (event: CustomEvent) => void; } interface ElsaLabelPicker { + "buttonClass"?: string; + "containerClass"?: string; "onSelectedLabelsChanged"?: (event: CustomEvent>) => void; "selectedLabels"?: Array; } diff --git a/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/filter.tsx b/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/filter.tsx index f3931ca07..56dd38ffa 100644 --- a/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/filter.tsx +++ b/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/filter.tsx @@ -1,5 +1,4 @@ import { FunctionalComponent, h } from '@stencil/core'; -import { OrderBy } from '../../../models'; import { WorkflowDefinitionsOrderBy } from '../../../services/api-client/workflow-definitions-api'; import { BulkActionsIcon, OrderByIcon, PageSizeIcon } from '../../icons/tooling'; import { DropdownButtonItem, DropdownButtonOrigin } from '../../shared/dropdown-button/models'; @@ -14,9 +13,17 @@ export interface OrderByFilterProps { onChange: (orderBy: WorkflowDefinitionsOrderBy) => void; } +export interface LabelFilterProps { + selectedLabels?: Array; + onSelectedLabelsChanged: (e: CustomEvent>) => void; + buttonClass?: string; + containerClass?: string; +} + export interface FilterProps extends BulkActionsProps { pageSizeFilter: PageSizeFilterProps; orderByFilter: OrderByFilterProps; + labelFilter: LabelFilterProps; } export interface BulkActionsProps { @@ -25,13 +32,16 @@ export interface BulkActionsProps { onBulkUnpublish: () => void; } -export const Filter: FunctionalComponent = ({ pageSizeFilter, orderByFilter, onBulkDelete, onBulkPublish, onBulkUnpublish }) => { +export const Filter: FunctionalComponent = ({ pageSizeFilter, orderByFilter, onBulkDelete, onBulkPublish, onBulkUnpublish, labelFilter }) => { return (
 
+ + + diff --git a/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/workflow-definition-browser.tsx b/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/workflow-definition-browser.tsx index 52fef7b4c..d0a77270c 100644 --- a/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/workflow-definition-browser.tsx +++ b/src/designer/elsa-workflows-designer/src/components/modals/workflow-definition-browser/workflow-definition-browser.tsx @@ -29,6 +29,7 @@ export class WorkflowDefinitionBrowser { @State() private currentPage: number = 0; @State() private currentPageSize: number = WorkflowDefinitionBrowser.DEFAULT_PAGE_SIZE; @State() private orderBy?: WorkflowDefinitionsOrderBy; + @State() private labels?: string[]; @State() private selectAllChecked: boolean; @Method() public async show() { @@ -107,6 +108,7 @@ export class WorkflowDefinitionBrowser { pageSize: this.currentPageSize, versionOptions: { isLatest: true }, orderBy: this.orderBy, + label: this.labels, }); const unpublishedWorkflowDefinitionIds = latestWorkflowDefinitions.items.filter(x => !x.isPublished).map(x => x.definitionId); this.publishedWorkflowDefinitions = await elsaClient.workflowDefinitions.list({ @@ -133,6 +135,12 @@ export class WorkflowDefinitionBrowser { selectedOrderBy: this.orderBy, onChange: this.onOrderByChanged, }, + labelFilter: { + selectedLabels: this.labels, + onSelectedLabelsChanged: this.onLabelChange, + buttonClass: 'text-gray-500 hover:text-gray-300', + containerClass: 'mt-1.5', + }, onBulkDelete: this.onDeleteManyClick, onBulkPublish: this.onPublishManyClick, onBulkUnpublish: this.onUnpublishManyClick, @@ -254,6 +262,11 @@ export class WorkflowDefinitionBrowser { await this.loadWorkflowDefinitions(); }; + private onLabelChange = async (e: CustomEvent>) => { + this.labels = e.detail; + await this.loadWorkflowDefinitions(); + }; + private resetPagination = () => { this.currentPage = 0; this.selectedWorkflowDefinitionIds = []; diff --git a/src/designer/elsa-workflows-designer/src/modules/labels/label-picker.tsx b/src/designer/elsa-workflows-designer/src/modules/labels/label-picker.tsx index fea5474dc..92f0c568c 100644 --- a/src/designer/elsa-workflows-designer/src/modules/labels/label-picker.tsx +++ b/src/designer/elsa-workflows-designer/src/modules/labels/label-picker.tsx @@ -25,6 +25,8 @@ export class LabelPicker { } @Prop() public selectedLabels: Array = []; + @Prop() public buttonClass?: string = 'text-blue-500 hover:text-blue-300'; + @Prop() public containerClass?: string; @Event() public selectedLabelsChanged: EventEmitter>; @@ -43,12 +45,12 @@ export class LabelPicker { public render() { const selectedLabels = this.getFilteredSelectedLabels(); - return
+ return
{selectedLabels.map(this.renderLabel)}
- {this.renderFlyout()} diff --git a/src/designer/elsa-workflows-designer/src/services/api-client/workflow-definitions-api.ts b/src/designer/elsa-workflows-designer/src/services/api-client/workflow-definitions-api.ts index 02e152aa8..d2d74ebae 100644 --- a/src/designer/elsa-workflows-designer/src/services/api-client/workflow-definitions-api.ts +++ b/src/designer/elsa-workflows-designer/src/services/api-client/workflow-definitions-api.ts @@ -88,6 +88,7 @@ export interface ListWorkflowDefinitionsRequest { versionOptions?: VersionOptions; materializerName?: string; orderBy?: WorkflowDefinitionsOrderBy; + label?: Array; } export interface DeleteManyWorkflowDefinitionResponse { @@ -155,6 +156,8 @@ export class WorkflowDefinitionsApiImpl implements WorkflowDefinitionsApi { if (!!request.pageSize) queryString.orderBy = request.orderBy; + if (!!request.label) queryString.label = request.label; + const queryStringText = serializeQueryString(queryString); const response = await this.httpClient.get>(`workflow-definitions${queryStringText}`); return response.data; diff --git a/src/designer/elsa-workflows-designer/src/utils/utils.ts b/src/designer/elsa-workflows-designer/src/utils/utils.ts index 7af60ae75..7b3450c75 100644 --- a/src/designer/elsa-workflows-designer/src/utils/utils.ts +++ b/src/designer/elsa-workflows-designer/src/utils/utils.ts @@ -70,6 +70,11 @@ export const isNullOrWhitespace = (input) => !input || !input.trim(); export const serializeQueryString = (queryString: object): string => { const filteredItems = _(queryString).omitBy(_.isUndefined).omitBy(_.isNull).value(); - const queryStringItems = _.map(filteredItems, (v, k) => `${k}=${v}`); + const queryStringItems = _.map(filteredItems, (v, k) => { + if (Array.isArray(v)) { + return v.map(item => `${k}=${item}`).join('&'); + }; + return `${k}=${v}`; + }); return queryStringItems.length > 0 ? `?${queryStringItems.join('&')}` : ''; };