public IssueBrowserViewModel() { Projects = new ObservableCollection<ShortProject>(); Issues = new ObservableCollection<ShortIssue>(); DisplayIssueCommand = new DelegateCommand<string>(id => { var page = new IssueView(); page.ViewModel.Initialize(Proxy, Issues.FirstOrDefault(i => i.ID == id)); var window = new Window(); window.Title = string.Format("View Issue {0}", id); window.Content = page; window.Width = 500; window.Height = 500; window.Show(); }); // Refresh issue list when project changed PropertyChanged += (sender, args) => { if (args.PropertyName == "CurrentProjectShortName" || args.PropertyName == "CurrentQuery") { QueryForIssues(); } }; }
public IssueBrowserViewModel() { Projects = new ObservableCollection <ShortProject>(); Issues = new ObservableCollection <ShortIssue>(); DisplayIssueCommand = new DelegateCommand <string>(id => { var page = new IssueView(); page.ViewModel.Initialize(Proxy, Issues.FirstOrDefault(i => i.ID == id)); var window = new Window(); window.Title = string.Format("View Issue {0}", id); window.Content = page; window.Width = 500; window.Height = 500; window.Show(); }); // Refresh issue list when project changed PropertyChanged += (sender, args) => { if (args.PropertyName == "CurrentProjectShortName" || args.PropertyName == "CurrentQuery") { QueryForIssues(); } }; }
public async Task <IActionResult> PutIssueView(int?id, IssueView issueView) { if (id != issueView.UniqueId) { return(BadRequest()); } _context.Entry(issueView).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!IssueViewExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }
public static IssueModel Map(this IssueView source) => source == null ? null : new IssueModel { Id = source.Id, PeriodicalId = source.PeriodicalId, VolumeNumber = source.VolumeNumber, IssueNumber = source.IssueNumber, IssueDate = source.IssueDate };
public static string StateIcon(this IssueView issue) { switch (issue.state.ToLowerInvariant().Replace(" ", "").Replace("'", "")) { case "submitted": return("icon-Checkbox-dotted"); case "open": return("icon-Checkbox-empty"); case "review": return("icon-Paper-plane-alt"); case "inprogress": return("icon-Paper-plane-alt"); case "fixed": return("icon-Check"); case "duplicate": return("icon-Multiple-windows"); case "cantreproduce": return("icon-Enter"); case "obsolete": return("icon-Scull"); case "closed": return("icon-Stop-alt"); case "reopened": return("icon-Undo"); case "workaroundposted": return("icon-Redo"); case "resolved": return("icon-Check"); default: return(""); } }
public async Task <ActionResult <IssueView> > PostIssueView(IssueView issueView) { _context.IssueView.Add(issueView); try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { if (IssueViewExists(issueView.UniqueId)) { return(Conflict()); } else { throw; } } return(CreatedAtAction("GetIssueView", new { id = issueView.UniqueId }, issueView)); }
public JsonResult Aggregate(string ids) { var idArray = new ArrayList(); idArray.AddRange(ids.Replace("all", "").TrimEnd(',').Split(',')); idArray.Remove(""); var gotBundle = GetVersionBundle(); // For each version in the bundle, go get the issues var toReturn = new List <AggregateView>(); Version[] orderedVersions; if (idArray.Count > 0) { //get version specific data orderedVersions = gotBundle.Data.Versions .Where(x => idArray.Contains(x.Value)) .OrderBy(x => x.Value.AsFullVersion()) .ToArray(); } else { //get all versions with projectID orderedVersions = gotBundle.Data.Versions .OrderBy(x => x.Value.AsFullVersion()) .ToArray(); } var currentReleases = new List <Version>(); var plannedReleases = new List <Version>(); var inProgressReleases = new List <Version>(); var releasesNode = new Node(int.Parse(ReleasesPageNodeId)); foreach (Node release in releasesNode.Children) { if (release.GetProperty("recommendedRelease") != null && release.GetProperty("recommendedRelease").Value == "1") { var version = orderedVersions.FirstOrDefault(x => x.Value.ToString(CultureInfo.InvariantCulture) == release.Name); if (version != null) { currentReleases.Add(version); } } if (release.GetProperty("releaseStatus") != null && release.GetProperty("releaseStatus").Value == "Planning") { var version = orderedVersions.FirstOrDefault(x => x.Value.ToString(CultureInfo.InvariantCulture) == release.Name); if (version != null) { plannedReleases.Add(version); } } if (release.GetProperty("releaseStatus") != null && release.GetProperty("releaseStatus").Value == "Unreleased") { var version = orderedVersions.FirstOrDefault(x => x.Value.ToString(CultureInfo.InvariantCulture) == release.Name); if (version != null) { inProgressReleases.Add(version); } } } // Just used to make sure we don't make repeated API requests for keys var versionCache = new ConcurrentDictionary <string, RestResponse <IssuesWrapper> >(); foreach (var version in orderedVersions) { var item = new AggregateView { inProgressRelease = inProgressReleases.FirstOrDefault(x => x.Value == version.Value) != null, version = version.Value, isPatch = version.Value.AsFullVersion().Build != 0, releaseDescription = version.Description ?? string.Empty, released = version.Released, releaseDate = version.ReleaseDate == 0 ? "" : ConvertDate(version.ReleaseDate).ToString(CultureInfo.InvariantCulture), currentRelease = currentReleases.FirstOrDefault(x => x.Value == version.Value) != null, plannedRelease = plannedReleases.FirstOrDefault(x => x.Value == version.Value) != null }; // /rest/issue/byproject/{project}?{filter} var issues = versionCache.GetOrAdd(version.Value, key => GetRestResponse <IssuesWrapper>(string.Format(IssuesUrl, ProjectId, "Due+in+version%3A+" + key))); var issueView = new List <IssueView>(); var activityView = new List <ActivityView>(); Parallel.ForEach( issues.Data.Issues, issue => { var view = new IssueView { id = issue.Id, state = GetFieldFromIssue(issue, "State"), title = GetFieldFromIssue(issue, "summary"), type = GetFieldFromIssue(issue, "Type"), breaking = (GetFieldFromIssue(issue, "Backwards compatible?") == "No") }; issueView.Add(view); }); var activitiesDateDesc = activityView.Where(x => x.changes.Any()).OrderByDescending(x => x.date); var issueIdsFromActivities = activitiesDateDesc.Select(x => x.id).Distinct() .Concat(issueView.Where(y => y != null && activitiesDateDesc.Select(z => z.id).Contains(y.id) == false).Select(y => y.id)); // Add issues for which there is no activity item.issues = issueIdsFromActivities.Select(x => issueView.Single(y => y != null && y.id == x)).OrderBy(x => x.id); item.activities = activitiesDateDesc.Take(5); toReturn.Add(item); } return(new JsonResult { Data = toReturn, JsonRequestBehavior = JsonRequestBehavior.AllowGet }); }
public JsonResult VersionBundle(string ids, bool cached) { var idArray = new ArrayList(); idArray.AddRange(ids.Replace("all", "").TrimEnd(',').Split(',')); idArray.Remove(""); // For each version in the bundle, go get the issues var toReturn = new List <AggregateView>(); Models.Version[] orderedVersions; if (cached == false) { var gotBundle = GetVersionBundle(); orderedVersions = idArray.Count > 0 ? gotBundle.Data.Versions.Where(x => idArray.Contains(x.Value)).OrderBy(x => x.Value.AsFullVersion()).ToArray() : gotBundle.Data.Versions.OrderBy(x => x.Value.AsFullVersion()).ToArray(); } else { orderedVersions = ids.Split(',').Select(versionId => new Models.Version { Value = versionId }).ToArray(); } var currentReleases = new List <Models.Version>(); var plannedReleases = new List <Models.Version>(); var inProgressReleases = new List <Models.Version>(); var releasesNode = new Node(_releasesPageNodeId); foreach (Node release in releasesNode.Children) { var version = orderedVersions.SingleOrDefault(x => x.Value == release.Name); if (version != null) { if (release.GetPropertyValue("recommendedRelease") == "1") { var status = release.GetProperty("releaseStatus"); if (status != null && status.Value != "Released") { version.ReleaseStatus = status.Value; } currentReleases.Add(version); } if (release.GetPropertyValue("releaseStatus") == "Planning") { plannedReleases.Add(version); } if (release.GetPropertyValue("releaseStatus") != "Released") { inProgressReleases.Add(version); } } } // Just used to make sure we don't make repeated API requests for keys var versionCache = new ConcurrentDictionary <string, RestResponse <IssuesWrapper> >(); foreach (var version in orderedVersions) { var issueView = new List <IssueView>(); var activityView = new List <ActivityView>(); var item = new AggregateView(); if (cached == false) { item = new AggregateView { inProgressRelease = inProgressReleases.FirstOrDefault(x => x.Value == version.Value) != null, version = version.Value, isPatch = version.Value.AsFullVersion().Build != 0, releaseDescription = version.Description ?? string.Empty, releaseStatus = version.ReleaseStatus, released = version.Released, releaseDate = version.ReleaseDate == 0 ? "" : version.ReleaseDate.ConvertFromUnixDate().ToString(CultureInfo.InvariantCulture), currentRelease = currentReleases.FirstOrDefault(x => x.Value == version.Value) != null, plannedRelease = plannedReleases.FirstOrDefault(x => x.Value == version.Value) != null }; var issuesList = new List <YouTrackIssue>(); var issuesRest = versionCache.GetOrAdd(version.Value, key => GetRestResponse <IssuesWrapper>(string.Format(IssuesUrl, _projectId, "Due+in+version%3A+" + key), true)); var issues = JsonConvert.DeserializeObject <List <YouTrackIssue> >(issuesRest.Content); if (issues.Any()) { issuesList.AddRange(issues); } foreach (var issue in issuesList) { var view = new IssueView { id = issue.Id, state = issue.GetFieldValue("State"), title = issue.GetFieldValue("summary"), type = issue.GetFieldValue("Type"), breaking = (issue.GetFieldValue("Backwards compatible?") == "No") }; issueView.Add(view); } } else { var cache = (List <AggregateView>)GetVersionsFromFile().Data; var cachedVersion = cache.FirstOrDefault(x => x.version == version.Value); if (cachedVersion != null) { item = cachedVersion; issueView = cachedVersion.issues.ToList(); } } var activitiesDateDesc = activityView.Where(x => x.changes.Any()).OrderByDescending(x => x.date); var issueIdsFromActivities = activitiesDateDesc.Select(x => x.id).Distinct() .Concat(issueView.Where(y => y != null && activitiesDateDesc.Select(z => z.id).Contains(y.id) == false) .Select(y => y.id)); // Add issues for which there is no activity item.issues = new List <IssueView>(issueIdsFromActivities.Select(x => issueView.Single(y => y != null && y.id == x)).OrderBy(x => x.id)); item.activities = activitiesDateDesc.Take(5).ToList(); toReturn.Add(item); } return(new JsonResult { Data = toReturn, JsonRequestBehavior = JsonRequestBehavior.AllowGet }); }
public async Task <IActionResult> UpdateIssue(int libraryId, int periodicalId, int volumeNumber, int issueNumber, [FromBody] IssueView issue, CancellationToken token = default(CancellationToken)) { if (!ModelState.IsValid) { return(new BadRequestObjectResult(ModelState)); } var request = new UpdateIssueRequest(libraryId, periodicalId, volumeNumber, issueNumber, issue.Map()); await _commandProcessor.SendAsync(request, cancellationToken : token); var renderResult = _issueRenderer.Render(request.Result.Issue, libraryId); if (request.Result.HasAddedNew) { return(new CreatedResult(renderResult.Links.Self(), renderResult)); } else { return(new OkObjectResult(renderResult)); } }