public dynamic GetDatumShaped(object datum, DatumType datumType, ProtoCmsRuntimeContext cmsContext, ContentListShape shape) { var finder = datumType.FinderBase(); var datumId = finder.GetDatumIdBase(datum); switch (shape) { case ContentListShape.TableRowVue: var cdt = finder.AsTableRowVueBase(datum); cdt.Add(DatumListApiResult.DATUM_TABLE_ACTION_KEY, new[] { new VueComponentDefinition { Name = "cms-widget-dropdown-button", Props = new { label = "Opt", size = "xs", type = "warning", iconCssClass = "fa fa-angle-down", items = finder.TableActionsForSingleContent(datumId, cmsContext) } } }); return(cdt); case ContentListShape.Summary: return(new { DatumId = datumId, DatumTypeId = datumType?.Id, Summary = finder.AsSummarizedValueBase(datum) }); case ContentListShape.FullPreview: return(finder.AsFullPreviewBase(datum)); default: return(datum); } }
public DatumListApiResult(ProtoCmsRuntimeContext cmsContext, DatumType contentType, string search, string sortColumn, bool?isDescending, int offset, int limit, ContentListShape?shape, IDatumFinder finder = null) { finder = finder ?? contentType.FinderBase(); var contentShape = shape ?? ContentListShape.Normal; if (!string.IsNullOrWhiteSpace(search)) { finder = finder.SearchBase(search.Trim()); } if (!string.IsNullOrWhiteSpace(sortColumn)) { SortColumn = sortColumn; if (isDescending.HasValue) { SortIsDescending = isDescending.Value; finder = finder.SortBase(sortColumn, isDescending.Value); } else { SortIsDescending = contentType.DefaultSortDescending; finder = finder.SortBase(sortColumn, contentType.DefaultSortDescending); } } else { SortColumn = contentType.DefaultSortFieldName; if (isDescending.HasValue) { SortIsDescending = isDescending.Value; finder = finder.SortBase(contentType.DefaultSortFieldName, isDescending.Value); } else { SortIsDescending = contentType.DefaultSortDescending; finder = finder.SortBase(contentType.DefaultSortFieldName, contentType.DefaultSortDescending); } } if (offset < 0) { offset = 0; } if (limit < 1) { limit = 100; } var currentPage = offset / limit + 1; var paginated = finder.PaginatedBase(currentPage, limit); var rawData = paginated.CurrentPageQueryableBase.DirectCastTo <IQueryable <object> >().ToArray(); CurrentPage = paginated.CurrentPage; TotalPage = paginated.TotalPage; StartNumbering = paginated.StartNumbering; GlobalCount = paginated.Count; CurrentCount = rawData.Length; Offset = paginated.Offset; Limit = paginated.Limit; SearchKeywords = search; ResultShape = $"{contentShape.ToString()} ({(int) contentShape})"; var data = new List <dynamic>(); var getter = new DatumShapedApiModelBuilder(); foreach (var rd in rawData) { data.Add(getter.GetDatumShaped(rd, contentType, cmsContext, contentShape)); } Data = data.ToArray(); }