public override Task Initialize(SelectTagsParameter parameter) { workspaceId = parameter.WorkspaceId; defaultResult = parameter.TagIds; selectedTagIds.AddRange(parameter.TagIds); creationEnabled = parameter.CreationEnabled; var filteredTags = FilterText .StartWith(string.Empty) .Select(text => text?.Trim() ?? string.Empty) .SelectMany(getSuggestions) .Select(selectableTagNameViewModel) .ShareReplay(); Tags = filteredTags .AsDriver(ImmutableList <SelectableTagBaseViewModel> .Empty, schedulerProvider); IsEmpty = filteredTags .Select(tags => tags.Any()) .Invert() .DistinctUntilChanged() .AsDriver(schedulerProvider); return(base.Initialize(parameter)); IImmutableList <SelectableTagBaseViewModel> selectableTagNameViewModel((string, IEnumerable <AutocompleteSuggestion>) pair) { var queryText = pair.Item1; var suggestions = pair.Item2; var tagSuggestionInWorkspace = suggestions .Cast <TagSuggestion>() .Where(s => s.WorkspaceId == workspaceId); var suggestCreation = creationEnabled && !string.IsNullOrEmpty(queryText) && tagSuggestionInWorkspace.None(tag => tag.Name.IsSameCaseInsensitiveTrimedTextAs(queryText)) && queryText.IsAllowedTagByteSize(); var selectableViewModels = tagSuggestionInWorkspace .OrderByDescending(tag => defaultResult.Contains(tag.TagId)) .ThenBy(tag => tag.Name) .Select(toSelectableTagViewModel); if (suggestCreation) { return(selectableViewModels .Prepend(new SelectableTagCreationViewModel(queryText, workspaceId)) .ToImmutableList()); } return(selectableViewModels.ToImmutableList()); } }
public override Task Initialize(SelectTagsParameter parameter) { workspaceId = parameter.WorkspaceId; defaultResult = parameter.TagIds; selectedTagIds.AddRange(parameter.TagIds); creationEnabled = parameter.CreationEnabled; var filteredTags = FilterText .StartWith(string.Empty) .Select(text => text?.Trim() ?? string.Empty) .SelectMany(getSuggestions) .Select(convertToSelectableTagNameViewModel) .ShareReplay(); Tags = filteredTags .AsDriver(ImmutableList <SelectableTagBaseViewModel> .Empty, schedulerProvider); IsEmpty = filteredTags .Select(tags => tags.Any()) .Invert() .DistinctUntilChanged() .AsDriver(schedulerProvider); return(base.Initialize(parameter)); IImmutableList <SelectableTagBaseViewModel> convertToSelectableTagNameViewModel(TagsFilteringContext context) { var tagSuggestionInWorkspace = context.TagSuggestions .Where(s => s.WorkspaceId == workspaceId); var shouldSuggestCreation = creationEnabled && !string.IsNullOrEmpty(context.Query) && tagSuggestionInWorkspace.None(tag => tag.Name.IsSameCaseInsensitiveTrimedTextAs(context.Query)) && context.Query.IsAllowedTagByteSize(); return(tagSuggestionInWorkspace .OrderByDescending(tag => defaultResult.Contains(tag.TagId)) .ThenBy(tag => tag.Name) .Select(toSelectableTagViewModel) .PrependIf(shouldSuggestCreation, () => new SelectableTagCreationViewModel(context.Query, workspaceId)) .ToImmutableList()); } }