public IssueMilestonesViewModel CreateMilestonesViewModel() { var vm = new IssueMilestonesViewModel( () => _milestonesCache.Value, () => Task.FromResult(Milestone), x => Task.FromResult(Milestone = x)); vm.LoadCommand.ExecuteIfCan(); return(vm); }
public IssueMilestonesViewModel CreateMilestonesViewModel() { var vm = new IssueMilestonesViewModel( () => _milestonesCache.Value, () => Task.FromResult(AssignedMilestone), x => UpdateIssue(AssignedUser, x, AssignedLabels)); vm.LoadCommand.ExecuteIfCan(); return(vm); }
protected IssueModifyViewModel( ISessionService applicationService, IAlertDialogFactory alertDialogFactory) { GoToAssigneesCommand = ReactiveCommand.Create(); GoToLabelsCommand = ReactiveCommand.Create(); GoToMilestonesCommand = ReactiveCommand.Create(); // Make sure repeated access is cached with Lazy var getAssignees = new Lazy<Task<IReadOnlyList<User>>>(() => applicationService.GitHubClient.Issue.Assignee.GetAllForRepository(RepositoryOwner, RepositoryName)); var getMilestones = new Lazy<Task<IReadOnlyList<Milestone>>>(() => applicationService.GitHubClient.Issue.Milestone.GetAllForRepository(RepositoryOwner, RepositoryName)); var getLables = new Lazy<Task<IReadOnlyList<Label>>>(() => applicationService.GitHubClient.Issue.Labels.GetAllForRepository(RepositoryOwner, RepositoryName)); Assignees = new IssueAssigneeViewModel(() => getAssignees.Value); Milestones = new IssueMilestonesViewModel(() => getMilestones.Value); Labels = new IssueLabelsViewModel(() => getLables.Value); var canSave = this.WhenAnyValue(x => x.Subject).Select(x => !string.IsNullOrEmpty(x)); SaveCommand = ReactiveCommand.CreateAsyncTask(canSave, _ => { using (alertDialogFactory.Activate("Saving...")) return Save(); }); // This is because the stupid ReactiveUI issue with the tableview :( SaveCommand.Subscribe(_ => Dismiss()); LoadCommand = ReactiveCommand.CreateAsyncTask(async t => { try { IsCollaborator = await applicationService.GitHubClient.Repository.RepoCollaborators .IsCollaborator(RepositoryOwner, RepositoryName, applicationService.Account.Username); } catch { IsCollaborator = false; } }); DismissCommand = ReactiveCommand.CreateAsyncTask(t => Discard()); DismissCommand.Where(x => x).Subscribe(_ => Dismiss()); }
public IssueMilestonesViewModel CreateMilestonesViewModel() { var vm = new IssueMilestonesViewModel( () => _milestonesCache.Value, () => Task.FromResult(AssignedMilestone), x => UpdateIssue(AssignedUser, x, AssignedLabels)); vm.LoadCommand.ExecuteIfCan(); return vm; }
protected BaseIssueViewModel( IApplicationService applicationService, IMarkdownService markdownService) { _applicationService = applicationService; var issuePresenceObservable = this.WhenAnyValue(x => x.Issue, x => x.CanModify) .Select(x => x.Item1 != null && x.Item2); Events = InternalEvents.CreateDerivedCollection(x => x); _participants = Events.Changed .Select(_ => Events.Select(y => y.Actor).Distinct().Count()) .Select(x => x == 0 ? 1 : x) .ToProperty(this, x => x.Participants); GoToAssigneesCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Assignees.LoadCommand.ExecuteIfCan()); GoToLabelsCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Labels.LoadCommand.ExecuteIfCan()); GoToMilestonesCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Milestones.LoadCommand.ExecuteIfCan()); _assignedUser = this.WhenAnyValue(x => x.Issue.Assignee) .ToProperty(this, x => x.AssignedUser); _assignedMilestone = this.WhenAnyValue(x => x.Issue.Milestone) .ToProperty(this, x => x.AssignedMilestone); _assignedLabels = this.WhenAnyValue(x => x.Issue.Labels) .ToProperty(this, x => x.AssignedLabels); _isClosed = this.WhenAnyValue(x => x.Issue.State) .Select(x => x == Octokit.ItemState.Closed) .ToProperty(this, x => x.IsClosed); Assignees = new IssueAssigneeViewModel( () => applicationService.GitHubClient.Issue.Assignee.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(Issue.Assignee), x => UpdateIssue(new Octokit.IssueUpdate { Assignee = x.With(y => y.Login), Milestone = AssignedMilestone.With(y => (int?)y.Number) })); Milestones = new IssueMilestonesViewModel( () => applicationService.GitHubClient.Issue.Milestone.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(Issue.Milestone), x => UpdateIssue(new Octokit.IssueUpdate { Assignee = AssignedUser.With(y => y.Login), Milestone = x.With(y => (int?)y.Number) })); Labels = new IssueLabelsViewModel( () => applicationService.GitHubClient.Issue.Labels.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult((IReadOnlyList <Octokit.Label>) new ReadOnlyCollection <Octokit.Label>(Issue.Labels.ToList())), x => { var update = new Octokit.IssueUpdate { Assignee = AssignedUser.With(y => y.Login), Milestone = AssignedMilestone.With(y => (int?)y.Number), }; foreach (var label in x.Select(y => y.Name)) { update.AddLabel(label); } return(UpdateIssue(update)); }); _markdownDescription = this.WhenAnyValue(x => x.Issue) .Select(x => ((x == null || string.IsNullOrEmpty(x.Body)) ? null : markdownService.Convert(x.Body))) .ToProperty(this, x => x.MarkdownDescription); LoadCommand = ReactiveCommand.CreateAsyncTask(t => Load(applicationService)); GoToOwnerCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.Issue).Select(x => x != null)); GoToOwnerCommand.Select(_ => Issue.User).Subscribe(x => { var vm = this.CreateViewModel <UserViewModel>(); vm.Username = x.Login; NavigateTo(vm); }); ToggleStateCommand = ReactiveCommand.CreateAsyncTask(issuePresenceObservable, async t => { try { Issue = await applicationService.GitHubClient.Issue.Update(RepositoryOwner, RepositoryName, Id, new Octokit.IssueUpdate { State = (Issue.State == Octokit.ItemState.Open) ? Octokit.ItemState.Closed : Octokit.ItemState.Open }); } catch (Exception e) { var close = (Issue.State == Octokit.ItemState.Open) ? "close" : "open"; throw new Exception("Unable to " + close + " the item. " + e.Message, e); } }); AddCommentCommand = ReactiveCommand.Create() .WithSubscription(_ => { var vm = this.CreateViewModel <IssueCommentViewModel>(); vm.RepositoryOwner = RepositoryOwner; vm.RepositoryName = RepositoryName; vm.Id = Id; vm.SaveCommand.Subscribe(x => InternalEvents.Add(new IssueCommentItemViewModel(x))); NavigateTo(vm); }); GoToUrlCommand = ReactiveCommand.Create(); GoToUrlCommand.OfType <string>().Subscribe(x => { var vm = this.CreateViewModel <WebBrowserViewModel>(); vm.Url = x; NavigateTo(vm); }); GoToUrlCommand.OfType <Uri>().Subscribe(x => { var vm = this.CreateViewModel <WebBrowserViewModel>(); vm.Url = x.AbsoluteUri; NavigateTo(vm); }); }
public IssueMilestonesViewModel CreateMilestonesViewModel() { var vm = new IssueMilestonesViewModel( () => _milestonesCache.Value, () => Task.FromResult(Milestone), x => Task.FromResult(Milestone = x)); vm.LoadCommand.ExecuteIfCan(); return vm; }
public RepositoryIssuesFilterViewModel(ISessionService sessionService, IActionMenuFactory actionMenu) { Title = "Filter"; State = IssueState.Open; SortType = CodeHub.Core.Filters.IssueSort.None; _userGet = new Lazy<Task<User>>(sessionService.GitHubClient.User.Current); SaveCommand = ReactiveCommand.Create().WithSubscription(_ => Dismiss()); this.WhenAnyValue(x => x.Milestones.Selected) .Select(x => x?.Title) .ToProperty(this, x => x.MilestoneString, out _milestoneString); this.WhenAnyValue(x => x.Assignees.Selected) .Select(x => x?.Login) .ToProperty(this, x => x.AssigneeString, out _assigneeString); this.WhenAnyValue(x => x.Labels.Selected) .Select(x => x ?? new List<Label>()) .Select(x => string.Join(",", x.Select(y => y.Name))) .ToProperty(this, x => x.LabelsString, out _labelsString); var getAssignees = new Lazy<Task<IReadOnlyList<User>>>(() => sessionService.GitHubClient.Issue.Assignee.GetAllForRepository(RepositoryOwner, RepositoryName)); var getMilestones = new Lazy<Task<IReadOnlyList<Milestone>>>(() => sessionService.GitHubClient.Issue.Milestone.GetAllForRepository(RepositoryOwner, RepositoryName)); var getLables = new Lazy<Task<IReadOnlyList<Label>>>(() => sessionService.GitHubClient.Issue.Labels.GetAllForRepository(RepositoryOwner, RepositoryName)); Assignees = new IssueAssigneeViewModel(() => getAssignees.Value); Milestones = new IssueMilestonesViewModel(() => getMilestones.Value); Labels = new IssueLabelsViewModel(() => getLables.Value); SelectAssigneeCommand = ReactiveCommand.Create(); SelectMilestoneCommand = ReactiveCommand.Create(); SelectLabelsCommand = ReactiveCommand.Create(); SelectStateCommand = ReactiveCommand.CreateAsyncTask(async sender => { var options = Enum.GetValues(typeof(IssueState)).Cast<IssueState>().ToList(); var picker = actionMenu.CreatePicker(); foreach (var option in options) picker.Options.Add(option.Humanize()); picker.SelectedOption = options.IndexOf(State); var ret = await picker.Show(sender); State = options[ret]; }); SelectSortCommand = ReactiveCommand.CreateAsyncTask(async sender => { var options = Enum.GetValues(typeof(CodeHub.Core.Filters.IssueSort)).Cast<CodeHub.Core.Filters.IssueSort>().ToList(); var picker = actionMenu.CreatePicker(); foreach (var option in options) picker.Options.Add(option.Humanize()); picker.SelectedOption = options.IndexOf(SortType); var ret = await picker.Show(sender); SortType = options[ret]; }); }
protected IssueModifyViewModel( IApplicationService applicationService, IAlertDialogFactory alertDialogFactory) { GoToAssigneesCommand = ReactiveCommand.Create(); GoToLabelsCommand = ReactiveCommand.Create(); GoToMilestonesCommand = ReactiveCommand.Create(); Assignees = new IssueAssigneeViewModel( () => applicationService.GitHubClient.Issue.Assignee.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(AssignedUser), x => Task.FromResult(AssignedUser = x)); Milestones = new IssueMilestonesViewModel( () => applicationService.GitHubClient.Issue.Milestone.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(AssignedMilestone), x => Task.FromResult(AssignedMilestone = x)); var assignedLabels = new ReactiveList <Octokit.Label>(); AssignedLabels = assignedLabels.CreateDerivedCollection(y => y); Labels = new IssueLabelsViewModel( () => applicationService.GitHubClient.Issue.Labels.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(new ReadOnlyCollection <Octokit.Label>(AssignedLabels.ToList()) as IReadOnlyList <Octokit.Label>), x => { assignedLabels.Reset(x); return(Task.FromResult(0)); }); Labels.SelectedLabels.Changed .Select(_ => new ReadOnlyCollection <Octokit.Label>(Labels.SelectedLabels.ToList())) .Subscribe(x => assignedLabels.Reset(x)); var canSave = this.WhenAnyValue(x => x.Subject).Select(x => !string.IsNullOrEmpty(x)); SaveCommand = ReactiveCommand.CreateAsyncTask(canSave, async _ => { using (alertDialogFactory.Activate("Saving...")) { await Save(); // This is because the stupid ReactiveUI issue with the tableview :( await Task.Delay(400); } Dismiss(); }); LoadCommand = ReactiveCommand.CreateAsyncTask(async t => { try { IsCollaborator = await applicationService.GitHubClient.Repository.RepoCollaborators .IsCollaborator(RepositoryOwner, RepositoryName, applicationService.Account.Username); } catch { IsCollaborator = false; } }); }
public IssueViewModel(IApplicationService applicationService, IActionMenuFactory actionMenuFactory, IMarkdownService markdownService, IGraphicService graphicsService) { _applicationService = applicationService; var issuePresenceObservable = this.WhenAnyValue(x => x.Issue).Select(x => x != null); GoToAssigneesCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Assignees.LoadCommand.ExecuteIfCan()); GoToLabelsCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Labels.LoadCommand.ExecuteIfCan()); GoToMilestonesCommand = ReactiveCommand.Create(issuePresenceObservable) .WithSubscription(_ => Milestones.LoadCommand.ExecuteIfCan()); this.WhenAnyValue(x => x.Id) .Subscribe(x => Title = "Issue #" + x); _assignedUser = this.WhenAnyValue(x => x.Issue.Assignee) .ToProperty(this, x => x.AssignedUser); _assignedMilestone = this.WhenAnyValue(x => x.Issue.Milestone) .ToProperty(this, x => x.AssignedMilestone); _assignedLabels = this.WhenAnyValue(x => x.Issue.Labels) .ToProperty(this, x => x.AssignedLabels); _markdownDescription = this.WhenAnyValue(x => x.Issue) .Select(x => ((x == null || string.IsNullOrEmpty(x.Body)) ? null : markdownService.Convert(x.Body))) .ToProperty(this, x => x.MarkdownDescription); ShareCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.Issue).Select(x => x != null)); ShareCommand.Subscribe(_ => actionMenuFactory.ShareUrl(Issue.HtmlUrl)); var events = new ReactiveList <IIssueEventItemViewModel>(); Events = events.CreateDerivedCollection(x => x); AddCommentCommand = ReactiveCommand.Create(); AddCommentCommand.Subscribe(_ => { var vm = this.CreateViewModel <IssueCommentViewModel>(); vm.RepositoryOwner = RepositoryOwner; vm.RepositoryName = RepositoryName; vm.Id = Id; vm.SaveCommand.Subscribe(x => events.Add(new IssueCommentItemViewModel(x))); NavigateTo(vm); }); ToggleStateCommand = ReactiveCommand.CreateAsyncTask(issuePresenceObservable, async t => { try { Issue = await applicationService.GitHubClient.Issue.Update(RepositoryOwner, RepositoryName, Id, new Octokit.IssueUpdate { State = (Issue.State == Octokit.ItemState.Open) ? Octokit.ItemState.Closed : Octokit.ItemState.Open }); } catch (Exception e) { var close = (Issue.State == Octokit.ItemState.Open) ? "close" : "open"; throw new Exception("Unable to " + close + " the item. " + e.Message, e); } }); GoToEditCommand = ReactiveCommand.Create(issuePresenceObservable); GoToEditCommand.Subscribe(_ => { var vm = this.CreateViewModel <IssueEditViewModel>(); vm.RepositoryOwner = RepositoryOwner; vm.RepositoryName = RepositoryName; vm.Id = Id; // vm.Issue = Issue; // vm.WhenAnyValue(x => x.Issue).Skip(1).Subscribe(x => Issue = x); NavigateTo(vm); }); Assignees = new IssueAssigneeViewModel( () => applicationService.GitHubClient.Issue.Assignee.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(Issue), UpdateIssue); Milestones = new IssueMilestonesViewModel( () => applicationService.GitHubClient.Issue.Milestone.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(Issue), UpdateIssue); Labels = new IssueLabelsViewModel( () => applicationService.GitHubClient.Issue.Labels.GetForRepository(RepositoryOwner, RepositoryName), () => Task.FromResult(Issue), UpdateIssue, graphicsService); LoadCommand = ReactiveCommand.CreateAsyncTask(async t => { var issueRequest = applicationService.GitHubClient.Issue.Get(RepositoryOwner, RepositoryName, Id) .ContinueWith(x => Issue = x.Result, new CancellationToken(), TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext()); var eventsRequest = applicationService.GitHubClient.Issue.Events.GetForIssue(RepositoryOwner, RepositoryName, Id); var commentsRequest = applicationService.GitHubClient.Issue.Comment.GetForIssue(RepositoryOwner, RepositoryName, Id); await Task.WhenAll(issueRequest, eventsRequest, commentsRequest); var tempList = new List <IIssueEventItemViewModel>(eventsRequest.Result.Count + commentsRequest.Result.Count); tempList.AddRange(eventsRequest.Result.Select(x => new IssueEventItemViewModel(x))); tempList.AddRange(commentsRequest.Result.Select(x => new IssueCommentItemViewModel(x))); events.Reset(tempList.OrderBy(x => x.CreatedAt)); }); ShowMenuCommand = ReactiveCommand.CreateAsyncTask( this.WhenAnyValue(x => x.Issue).Select(x => x != null), _ => { var menu = actionMenuFactory.Create(Title); menu.AddButton(Issue.State == Octokit.ItemState.Open ? "Close" : "Open", ToggleStateCommand); // // // var editButton = _actionSheet.AddButton("Edit"); // var commentButton = _actionSheet.AddButton("Comment"); // var shareButton = _actionSheet.AddButton("Share"); // var showButton = _actionSheet.AddButton("Show in GitHub"); return(menu.Show()); }); }