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());
            }
        }
Beispiel #2
0
        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());
            }
        }