diff --git a/src/activities/Elsa.Activities.Rebus/Consumers/MessageConsumer.cs b/src/activities/Elsa.Activities.Rebus/Consumers/MessageConsumer.cs index cda17f0ea..6d0124e6f 100644 --- a/src/activities/Elsa.Activities.Rebus/Consumers/MessageConsumer.cs +++ b/src/activities/Elsa.Activities.Rebus/Consumers/MessageConsumer.cs @@ -12,10 +12,10 @@ namespace Elsa.Activities.Rebus.Consumers public class MessageConsumer : IHandleMessages where T : notnull { // TODO: Design multi-tenancy. - private const string TenantId = default; - + private const string? TenantId = default; + private readonly IMediator _mediator; - + public MessageConsumer(IMediator mediator) { _mediator = mediator; @@ -26,8 +26,8 @@ namespace Elsa.Activities.Rebus.Consumers var correlationId = MessageContext.Current.TransportMessage.Headers.GetValueOrNull(Headers.CorrelationId); await _mediator.Send(new TriggerWorkflowsRequest( nameof(RebusMessageReceived), - new MessageReceivedBookmark {MessageType = message.GetType().Name, CorrelationId = correlationId}, - new MessageReceivedBookmark {MessageType = message.GetType().Name}, + new MessageReceivedBookmark { MessageType = message.GetType().Name, CorrelationId = correlationId }, + new MessageReceivedBookmark { MessageType = message.GetType().Name }, message, correlationId, default, diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags-dropdown.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags-dropdown.tsx index 5334de298..b906c60ea 100644 --- a/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags-dropdown.tsx +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags-dropdown.tsx @@ -15,37 +15,38 @@ export class ElsaInputTagsDropdown { @Prop() dropdownValues?: Array = []; @Event({ bubbles: true }) valueChanged: EventEmitter>; @State() currentValues?: Array = []; - @State() dropdownTags?: Array = []; @Watch('values') valuesChangedHandler(newValue: Array) { let values: Array = []; - - newValue.forEach(value => { - this.dropdownValues.forEach(tag => { - if (value === tag.value) { - values.push(tag); - } + const dropdownValues = this.dropdownValues || []; + + if(!!newValue) { + newValue.forEach(value => { + dropdownValues.forEach(tag => { + if (value === tag.value) { + values.push(tag); + } + }) }) - }) + } + this.currentValues = values || []; } componentWillLoad() { - this.dropdownTags = this.dropdownValues; + const dropdownValues = this.dropdownValues || []; let values: Array = []; this.values.forEach(value => { - this.dropdownValues.forEach(tag => { + dropdownValues.forEach(tag => { if (value === tag.value) { values.push(tag); } }) }) + this.currentValues = values; - - const tagsToRemove: Array = this.currentValues.map(tag => tag.value); - this.dropdownTags = this.dropdownTags.filter(tag => !tagsToRemove.includes(tag.value)); } async onTagSelected(e: any) { @@ -64,7 +65,6 @@ export class ElsaInputTagsDropdown { values.push(currentTag); this.currentValues = values.distinct(); input.value = "Add"; - this.dropdownTags = this.dropdownTags.filter(tag => tag.value !== currentTag.value); await this.valueChanged.emit(values); } @@ -72,12 +72,12 @@ export class ElsaInputTagsDropdown { e.preventDefault(); this.currentValues = this.currentValues.filter(tag => tag.value !== currentTag.value); - this.dropdownTags = [...this.dropdownTags, currentTag].sort((tag1, tag2) => tag1.value.localeCompare(tag2.value)); await this.valueChanged.emit(this.currentValues); } render() { let values: Array = this.currentValues || []; + let dropdownItems = this.dropdownValues.filter(x => values.findIndex(y => y.value === x.value) < 0); if (!Array.isArray(values)) values = []; @@ -95,13 +95,11 @@ export class ElsaInputTagsDropdown { ))} - this.onTagSelected(e)}> - {this.dropdownTags.map(tag => + {dropdownItems.map(tag => ( - + ) )} diff --git a/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx index 59102cf40..eb142c570 100644 --- a/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx +++ b/src/designer/elsa-workflows-studio/src/components/controls/elsa-input-tags/elsa-input-tags.tsx @@ -23,6 +23,14 @@ export class ElsaInputTags { this.currentValues = this.values; } + async addItem(item: string) + { + const values = [...this.currentValues]; + values.push(item); + this.currentValues = values.distinct(); + await this.valueChanged.emit(values); + } + async onInputKeyDown(e: KeyboardEvent) { if (e.key != "Enter") return; @@ -35,11 +43,19 @@ export class ElsaInputTags { if (value.length == 0) return; - const values = [...this.currentValues]; - values.push(value); - this.currentValues = values.distinct(); + await this.addItem(value); + input.value = ''; + } + + async onInputBlur(e: Event) { + const input = e.target as HTMLInputElement; + const value = input.value.trim(); + + if (value.length == 0) + return; + + await this.addItem(value); input.value = ''; - await this.valueChanged.emit(values); } async onDeleteTagClick(e: Event, tag: string) { @@ -65,7 +81,9 @@ export class ElsaInputTags { × ))} - this.onInputKeyDown(e)} + this.onInputKeyDown(e)} + onBlur={e => this.onInputBlur(e)} class="tag-input inline-block text-sm outline-none focus:outline-none border-none shadow:none focus:border-none focus:border-transparent focus:shadow-none" placeholder={this.placeHolder}/> diff --git a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-multi-text-property/elsa-multi-text-property.tsx b/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-multi-text-property/elsa-multi-text-property.tsx index 123b59b57..9914d9ef5 100644 --- a/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-multi-text-property/elsa-multi-text-property.tsx +++ b/src/designer/elsa-workflows-studio/src/components/editors/properties/elsa-multi-text-property/elsa-multi-text-property.tsx @@ -23,12 +23,12 @@ export class ElsaMultiTextProperty { } onValueChanged(newValue: Array) { - const newValues = newValue.map(dropdown => { - if (typeof dropdown === 'string') return dropdown; - if (typeof dropdown === 'number') return dropdown.toString(); - if (typeof dropdown === 'boolean') return dropdown.toString(); + const newValues = newValue.map(item => { + if (typeof item === 'string') return item; + if (typeof item === 'number') return item.toString(); + if (typeof item === 'boolean') return item.toString(); - return dropdown.value; + return item.value; }) this.currentValue = JSON.stringify(newValues); @@ -58,10 +58,10 @@ export class ElsaMultiTextProperty { const fieldName = propertyName; const values = parseJson(this.currentValue); const items = this.items; - const valueType = propertyDescriptor.options !== null ? 'dropdown' : 'multi-text'; + const useDropdown = !!propertyDescriptor.options && propertyDescriptor.options.length > 0; const propertyOptions = this.createKeyValueOptions(items); - const elsaInputTags = valueType === 'multi-text' ? + const elsaInputTags = useDropdown ? this.onValueChanged(e.detail)} /> : this.onValueChanged(e.detail)} />; diff --git a/src/samples/server/Elsa.Samples.Server.Host/Activities/MultiTextWithOptionsSampleActivity.cs b/src/samples/server/Elsa.Samples.Server.Host/Activities/MultiTextWithOptionsSampleActivity.cs new file mode 100644 index 000000000..31edc9de0 --- /dev/null +++ b/src/samples/server/Elsa.Samples.Server.Host/Activities/MultiTextWithOptionsSampleActivity.cs @@ -0,0 +1,31 @@ +using System.Reflection; +using Elsa.ActivityResults; +using Elsa.Attributes; +using Elsa.Design; +using Elsa.Expressions; +using Elsa.Metadata; +using Elsa.Services; + +namespace Elsa.Samples.Server.Host.Activities +{ + public class ClosedMultiTextSampleActivity : Activity, IActivityPropertyOptionsProvider + { + [ActivityProperty( + UIHint = ActivityPropertyUIHints.MultiText, + OptionsProvider = typeof(ClosedMultiTextSampleActivity), + DefaultSyntax = SyntaxNames.Json, + SupportedSyntaxes = new[] { SyntaxNames.Json, SyntaxNames.JavaScript, SyntaxNames.Liquid } + )] + public string? FavoriteLanguage { get; set; } + + public object GetOptions(PropertyInfo property) => new[] + { + new SelectListItem("C#", "csharp"), + new SelectListItem("JavaScript", "javascript"), + new SelectListItem("Rust", "rust"), + new SelectListItem("PHP", "php"), + }; + + protected override IActivityExecutionResult OnExecute() => Done(FavoriteLanguage); + } +} \ No newline at end of file diff --git a/src/samples/server/Elsa.Samples.Server.Host/Activities/OpenMultiTextSampleActivity.cs b/src/samples/server/Elsa.Samples.Server.Host/Activities/OpenMultiTextSampleActivity.cs new file mode 100644 index 000000000..042008a55 --- /dev/null +++ b/src/samples/server/Elsa.Samples.Server.Host/Activities/OpenMultiTextSampleActivity.cs @@ -0,0 +1,19 @@ +using Elsa.ActivityResults; +using Elsa.Attributes; +using Elsa.Design; +using Elsa.Expressions; +using Elsa.Services; + +namespace Elsa.Samples.Server.Host.Activities +{ + public class OpenMultiTextSampleActivity : Activity + { + [ActivityProperty( + UIHint = ActivityPropertyUIHints.MultiText, + DefaultSyntax = SyntaxNames.Json, + SupportedSyntaxes = new[] { SyntaxNames.Json, SyntaxNames.JavaScript, SyntaxNames.Liquid } + )] + public string? FavoriteLanguage { get; set; } + protected override IActivityExecutionResult OnExecute() => Done(FavoriteLanguage); + } +} \ No newline at end of file diff --git a/src/samples/server/Elsa.Samples.Server.Host/Activities/VehicleActivity.cs b/src/samples/server/Elsa.Samples.Server.Host/Activities/VehicleActivity.cs index f401a0e42..67b3f68fc 100644 --- a/src/samples/server/Elsa.Samples.Server.Host/Activities/VehicleActivity.cs +++ b/src/samples/server/Elsa.Samples.Server.Host/Activities/VehicleActivity.cs @@ -16,7 +16,7 @@ namespace Elsa.Samples.Server.Host.Activities [Action] public class VehicleActivity : Activity, IActivityPropertyOptionsProvider, IRuntimeSelectListItemsProvider { - private Random _random; + private readonly Random _random; public VehicleActivity() {