private async Task <IList <Selection <CategoryBase> > > BuildChannelSelectionsAsync(
            CategoryInputOptions options)
        {
            if (options == null)
            {
                options = new CategoryInputOptions();
            }

            if (options.Categories != null)
            {
                var items = await RecurseCategories(options.Categories);

                var selections = items.Select(c => new Selection <CategoryBase>
                {
                    IsSelected = options.SelectedCategories.Any(v => v == c.Id),
                    Value      = c
                })
                                 .OrderBy(r => r.Value)
                                 .ToList();

                return(selections);
            }

            return(null);
        }
        public override async Task <IViewProviderResult> BuildEditAsync(Moderator moderator, IViewProviderContext updater)
        {
            // Build input options
            var viewModel = new CategoryInputOptions()
            {
                HtmlName           = ChannelHtmlName,
                SelectedCategories = new int[] { moderator.CategoryId },
                Categories         = await GetCategories()
            };

            return(Views(
                       View <CategoryInputOptions>("Moderation.Channels.Edit.Content", model => viewModel).Zone("sidebar").Order(1)
                       ));
        }
        public async Task <IViewComponentResult> InvokeAsync(CategoryInputOptions options)
        {
            if (options.SelectedCategories == null)
            {
                options.SelectedCategories = new int[0];
            }

            var categories = await BuildChannelSelectionsAsync(options);

            var model = new CategoryInputViewModel(categories)
            {
                HtmlName = options.HtmlName
            };

            return(View(model));
        }