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();
                }
            };
        }
Esempio n. 2
0
        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());
        }
Esempio n. 4
0
 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
 };
Esempio n. 5
0
        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));
        }
Esempio n. 7
0
        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
            });
        }
Esempio n. 8
0
        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
            });
        }
Esempio n. 9
0
        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));
            }
        }