using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace RMuseum.Models.Artifact.ViewModels { /// /// Museum Master Item View Model /// public class RArtifactMasterRecordViewModel : RArtifactMasterRecord { /// /// constructor /// /// public RArtifactMasterRecordViewModel(RArtifactMasterRecord src) { Id = src.Id; FriendlyUrl = src.FriendlyUrl; Status = src.Status; Name = src.Name; NameInEnglish = src.NameInEnglish; Description = src.Description; DescriptionInEnglish = src.DescriptionInEnglish; DateTime = src.DateTime; LastModified = src.LastModified; CoverItemIndex = src.CoverItemIndex; CoverImage = src.CoverImage; CoverImageId = src.CoverImageId; ItemCount = src.ItemCount; Tags = null; List items = new List(); List sums = new List(); List contents = new List(); int orderOfContents = 0; if(src.Items != null) foreach(RArtifactItemRecord item in src.Items) { if(item.Tags != null) { var OrderedTags = item.Tags.OrderBy(t => t.RTag.Order).ThenBy(t => t.Order); foreach (RTagValue value in OrderedTags) { if (value.RTag != null) { switch(value.RTag.TagType) { case RTagType.Binary: { RTagSum sum = sums.Where(s => s.TagFriendlyUrl == value.RTag.FriendlyUrl).SingleOrDefault(); if (sum != null) { sum.ItemCount++; } else { sums.Add(new RTagSum() { TagName = value.RTag.Name, TagFriendlyUrl = value.RTag.FriendlyUrl, ItemCount = 1 }); } } break; case RTagType.TitleInContents: { if(!int.TryParse(value.ValueSupplement, out int level)) { level = 1; } if(contents.Where(c => c.Title == value.Value).SingleOrDefault() == null) { contents.Add ( new RTitleInContents() { Title = value.Value, Order = ++orderOfContents, Level = level, ItemFriendlyUrl = item.FriendlyUrl } ); } } break; } } } } item.Tags = null; items.Add(item); } Items = items; RTagSums = sums; Contents = contents; List rArtifactTags = new List(); if(src.Tags != null) { foreach (RTagValue tag in src.Tags) { RArtifactTagViewModel related = rArtifactTags.Where(t => t.Id == tag.RTagId).SingleOrDefault(); List values = (related == null) ? new List() : new List(related.Values); if (related == null) { related = new RArtifactTagViewModel(tag.RTag); rArtifactTags.Add(related); } values.Add(tag); values.Sort((a, b) => a.Order - b.Order); related.Values = values; } rArtifactTags.Sort((a, b) => a.Order - b.Order); } ArtifactTags = rArtifactTags; } /// /// Tags /// public ICollection ArtifactTags { get; set; } /// /// Binary Tagged Items /// public ICollection RTagSums { get; set; } /// /// Titles of Items in Contents /// public ICollection Contents { get; set; } } }