public PullRequestFilesViewModel( IPullRequestService service, IPullRequestEditorService editorService) { Guard.ArgumentNotNull(service, nameof(service)); Guard.ArgumentNotNull(editorService, nameof(editorService)); this.service = service; DiffFile = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(x => editorService.OpenDiff(pullRequestSession, x.RelativePath, "HEAD")); ViewFile = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(x => editorService.OpenFile(pullRequestSession, x.RelativePath, false)); DiffFileWithWorkingDirectory = ReactiveCommand.CreateFromTask <IPullRequestFileNode>( x => editorService.OpenDiff(pullRequestSession, x.RelativePath), isBranchCheckedOut); OpenFileInWorkingDirectory = ReactiveCommand.CreateFromTask <IPullRequestFileNode>( x => editorService.OpenFile(pullRequestSession, x.RelativePath, true), isBranchCheckedOut); OpenFirstComment = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(async file => { var thread = await GetFirstCommentThread(file); if (thread != null) { await editorService.OpenDiff(pullRequestSession, file.RelativePath, thread); } }); }
static PullRequestReviewAuthoringViewModel CreateTarget( IPullRequestService pullRequestService = null, IPullRequestEditorService editorService = null, IPullRequestSessionManager sessionManager = null, IMessageDraftStore draftStore = null, IPullRequestFilesViewModel files = null, IScheduler timerScheduler = null, IAutoCompleteAdvisor autoCompleteAdvisor = null ) { editorService = editorService ?? Substitute.For <IPullRequestEditorService>(); sessionManager = sessionManager ?? CreateSessionManager(); draftStore = draftStore ?? Substitute.For <IMessageDraftStore>(); files = files ?? Substitute.For <IPullRequestFilesViewModel>(); autoCompleteAdvisor = autoCompleteAdvisor ?? Substitute.For <IAutoCompleteAdvisor>(); timerScheduler = timerScheduler ?? DefaultScheduler.Instance; return(new PullRequestReviewAuthoringViewModel( pullRequestService, editorService, sessionManager, draftStore, files, autoCompleteAdvisor, timerScheduler)); }
public PullRequestFilesViewModel( IPullRequestService service, IPullRequestEditorService editorService) { Guard.ArgumentNotNull(service, nameof(service)); Guard.ArgumentNotNull(editorService, nameof(editorService)); this.service = service; DiffFile = ReactiveCommand.CreateAsyncTask(x => (Task)editorService.OpenDiff(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, "HEAD")); ViewFile = ReactiveCommand.CreateAsyncTask(x => (Task)editorService.OpenFile(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, false)); DiffFileWithWorkingDirectory = ReactiveCommand.CreateAsyncTask( isBranchCheckedOut, x => (Task)editorService.OpenDiff(pullRequestSession, ((IPullRequestFileNode)x).RelativePath)); OpenFileInWorkingDirectory = new NonDeletedFileCommand( isBranchCheckedOut, x => (Task)editorService.OpenFile(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, true)); OpenFirstComment = ReactiveCommand.CreateAsyncTask(async x => { var file = (IPullRequestFileNode)x; var thread = await GetFirstCommentThread(file); if (thread != null) { await editorService.OpenDiff(pullRequestSession, file.RelativePath, thread); } }); }
public PullRequestAnnotationsViewModel(IPullRequestSessionManager sessionManager, IPullRequestEditorService pullRequestEditorService) { this.sessionManager = sessionManager; this.pullRequestEditorService = pullRequestEditorService; NavigateToPullRequest = ReactiveCommand.Create(() => { NavigateTo(FormattableString.Invariant( $"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestNumber}")); }); }
public PullRequestReviewAuthoringViewModel( IPullRequestService pullRequestService, IPullRequestEditorService editorService, IPullRequestSessionManager sessionManager, IMessageDraftStore draftStore, IPullRequestFilesViewModel files) : this(pullRequestService, editorService, sessionManager, draftStore, files, DefaultScheduler.Instance) { }
private async Task OpenFirstAnnotation(IPullRequestEditorService editorService, IPullRequestFileNode file, CheckAnnotationLevel checkAnnotationLevel) { var annotationModel = await GetFirstAnnotation(file, checkAnnotationLevel); if (annotationModel != null) { await editorService.OpenDiff(pullRequestSession, file.RelativePath, annotationModel.HeadSha, annotationModel.EndLine); } }
PullRequestUserReviewsViewModel CreateTarget( IPullRequestEditorService editorService = null, IPullRequestSessionManager sessionManager = null) { editorService = editorService ?? Substitute.For <IPullRequestEditorService>(); sessionManager = sessionManager ?? CreateSessionManager(); return(new PullRequestUserReviewsViewModel( editorService, sessionManager)); }
public PullRequestUserReviewsViewModel( IPullRequestEditorService editorService, IPullRequestSessionManager sessionManager) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); this.editorService = editorService; this.sessionManager = sessionManager; NavigateToPullRequest = ReactiveCommand.Create(() => NavigateTo(Invariant($"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestNumber}"))); }
private async Task OpenFirstAnnotation(IPullRequestEditorService editorService, IPullRequestFileNode file, CheckAnnotationLevel checkAnnotationLevel) { var annotationModel = await GetFirstAnnotation(file, checkAnnotationLevel); if (annotationModel != null) { //AnnotationModel.EndLine is a 1-based number //EditorService.OpenDiff takes a 0-based line number to start searching AFTER and will open the next tag var nextInlineCommentFromLine = annotationModel.EndLine - 2; await editorService.OpenDiff(pullRequestSession, file.RelativePath, annotationModel.HeadSha, nextInlineCommentFromLine); } }
static PullRequestReviewAuthoringViewModel CreateTarget( IPullRequestEditorService editorService = null, IPullRequestSessionManager sessionManager = null, IPullRequestFilesViewModel files = null) { editorService = editorService ?? Substitute.For <IPullRequestEditorService>(); sessionManager = sessionManager ?? CreateSessionManager(); files = files ?? Substitute.For <IPullRequestFilesViewModel>(); return(new PullRequestReviewAuthoringViewModel( editorService, sessionManager, files)); }
/// <summary> /// Initializes the <see cref="PullRequestAnnotationItemViewModel"/>. /// </summary> /// <param name="annotation">The check run annotation model.</param> /// <param name="isFileInPullRequest">A flag that denotes if the annotation is part of the pull request's changes.</param> /// <param name="checkSuite">The check suite model.</param> /// <param name="session">The pull request session.</param> /// <param name="editorService">The pull request editor service.</param> public PullRequestAnnotationItemViewModel( CheckRunAnnotationModel annotation, bool isFileInPullRequest, CheckSuiteModel checkSuite, IPullRequestSession session, IPullRequestEditorService editorService) { Annotation = annotation; IsFileInPullRequest = isFileInPullRequest; OpenAnnotation = ReactiveCommand.CreateFromTask <Unit>( async _ => await editorService.OpenDiff(session, annotation.Path, checkSuite.HeadSha, annotation.EndLine - 1), Observable.Return(IsFileInPullRequest)); }
PullRequestUserReviewsViewModel CreateTarget( IPullRequestEditorService editorService = null, IPullRequestSessionManager sessionManager = null, IModelServiceFactory modelServiceFactory = null) { editorService = editorService ?? Substitute.For <IPullRequestEditorService>(); sessionManager = sessionManager ?? Substitute.For <IPullRequestSessionManager>(); modelServiceFactory = modelServiceFactory ?? Substitute.For <IModelServiceFactory>(); return(new PullRequestUserReviewsViewModel( editorService, sessionManager, modelServiceFactory)); }
public PullRequestReviewFileCommentViewModel( IPullRequestEditorService editorService, IPullRequestSession session, IPullRequestReviewCommentModel model) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(session, nameof(session)); Guard.ArgumentNotNull(model, nameof(model)); this.editorService = editorService; this.session = session; this.model = model; Open = ReactiveCommand.CreateAsyncTask(DoOpen); }
PullRequestReviewViewModel CreateTarget( IPullRequestEditorService editorService = null, IPullRequestSession session = null, PullRequestDetailModel pullRequest = null, PullRequestReviewModel model = null) { editorService = editorService ?? Substitute.For <IPullRequestEditorService>(); session = session ?? Substitute.For <IPullRequestSession>(); pullRequest = pullRequest ?? CreatePullRequest(); model = model ?? pullRequest.Reviews[0]; return(new PullRequestReviewViewModel( editorService, session, model)); }
public PullRequestReviewAuthoringViewModel( IPullRequestService pullRequestService, IPullRequestEditorService editorService, IPullRequestSessionManager sessionManager, IMessageDraftStore draftStore, IPullRequestFilesViewModel files, IAutoCompleteAdvisor autoCompleteAdvisor, IScheduler timerScheduler) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); Guard.ArgumentNotNull(draftStore, nameof(draftStore)); Guard.ArgumentNotNull(files, nameof(files)); Guard.ArgumentNotNull(autoCompleteAdvisor, nameof(autoCompleteAdvisor)); Guard.ArgumentNotNull(timerScheduler, nameof(timerScheduler)); this.pullRequestService = pullRequestService; this.editorService = editorService; this.sessionManager = sessionManager; this.draftStore = draftStore; this.timerScheduler = timerScheduler; canApproveRequestChanges = this.WhenAnyValue( x => x.Model, x => x.PullRequestModel, (review, pr) => review != null && pr != null && review.Author.Login != pr.Author.Login) .ToProperty(this, x => x.CanApproveRequestChanges); Files = files; AutoCompleteAdvisor = autoCompleteAdvisor; var hasBodyOrComments = this.WhenAnyValue( x => x.Body, x => x.FileComments.Count, (body, comments) => !string.IsNullOrWhiteSpace(body) || comments > 0); Approve = ReactiveCommand.CreateFromTask(() => DoSubmit(Octokit.PullRequestReviewEvent.Approve)); Comment = ReactiveCommand.CreateFromTask( () => DoSubmit(Octokit.PullRequestReviewEvent.Comment), hasBodyOrComments); RequestChanges = ReactiveCommand.CreateFromTask( () => DoSubmit(Octokit.PullRequestReviewEvent.RequestChanges), hasBodyOrComments); Cancel = ReactiveCommand.CreateFromTask(DoCancel); NavigateToPullRequest = ReactiveCommand.Create(() => NavigateTo(Invariant($"{RemoteRepositoryOwner}/{LocalRepository.Name}/pull/{PullRequestModel.Number}"))); }
public PullRequestReviewCommentViewModel( IPullRequestEditorService editorService, IPullRequestSession session, string relativePath, PullRequestReviewCommentModel model) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(session, nameof(session)); Guard.ArgumentNotNull(model, nameof(model)); this.editorService = editorService; this.session = session; this.model = model; RelativePath = relativePath; Open = ReactiveCommand.CreateFromTask(DoOpen); }
/// <summary> /// Initializes a new instance of the <see cref="PullRequestReviewViewModel"/> class. /// </summary> /// <param name="editorService">The pull request editor service.</param> /// <param name="session">The pull request session.</param> /// <param name="model">The pull request review model.</param> public PullRequestReviewViewModel( IPullRequestEditorService editorService, IPullRequestSession session, PullRequestReviewModel model) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(session, nameof(session)); Guard.ArgumentNotNull(model, nameof(model)); Model = model; Body = string.IsNullOrWhiteSpace(Model.Body) ? null : Model.Body; StateDisplay = ToString(Model.State); var comments = new List <IPullRequestReviewFileCommentViewModel>(); var outdated = new List <IPullRequestReviewFileCommentViewModel>(); foreach (var comment in model.Comments) { if (comment.Thread != null) { var vm = new PullRequestReviewCommentViewModel( editorService, session, comment.Thread.Path, comment); if (comment.Thread.Position != null) { comments.Add(vm); } else { outdated.Add(vm); } } } FileComments = comments; OutdatedFileComments = outdated; HasDetails = Body != null || FileComments.Count > 0 || OutdatedFileComments.Count > 0; }
public PullRequestReviewAuthoringViewModel( IPullRequestEditorService editorService, IPullRequestSessionManager sessionManager, IModelServiceFactory modelServiceFactory, IPullRequestFilesViewModel files) { Guard.ArgumentNotNull(editorService, nameof(editorService)); Guard.ArgumentNotNull(sessionManager, nameof(sessionManager)); Guard.ArgumentNotNull(modelServiceFactory, nameof(modelServiceFactory)); Guard.ArgumentNotNull(files, nameof(files)); this.editorService = editorService; this.sessionManager = sessionManager; this.modelServiceFactory = modelServiceFactory; canApproveRequestChanges = this.WhenAnyValue( x => x.Model, x => x.PullRequestModel, (review, pr) => review != null && pr != null && review.User.Login != pr.Author.Login) .ToProperty(this, x => x.CanApproveRequestChanges); Files = files; var hasBodyOrComments = this.WhenAnyValue( x => x.Body, x => x.FileComments.Count, (body, comments) => !string.IsNullOrWhiteSpace(body) || comments > 0); Approve = ReactiveCommand.CreateAsyncTask(_ => DoSubmit(Octokit.PullRequestReviewEvent.Approve)); Comment = ReactiveCommand.CreateAsyncTask( hasBodyOrComments, _ => DoSubmit(Octokit.PullRequestReviewEvent.Comment)); RequestChanges = ReactiveCommand.CreateAsyncTask( hasBodyOrComments, _ => DoSubmit(Octokit.PullRequestReviewEvent.RequestChanges)); Cancel = ReactiveCommand.CreateAsyncTask(DoCancel); NavigateToPullRequest = ReactiveCommand.Create().OnExecuteCompleted(_ => NavigateTo(Invariant($"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestModel.Number}"))); }