private static RenderFragment <EditContext> RenderFormContents(RenderContext context, CrudeButton <EditContext>?onSubmit) => ctx => builder => { var items = ViewModelParser.ParseProperties(context.ViewModel); var seq = 0; builder.OpenElement(seq++, "crude-tree"); builder.OpenElement(seq++, "crude-tree-header"); builder.OpenComponent <DataAnnotationsValidator>(seq++); builder.CloseComponent(); builder.OpenComponent <ValidationSummary>(seq++); builder.CloseComponent(); builder.CloseElement(); foreach (var item in items) { if (item.Type == CrudePropertyType.Field) { var fragment = CreateFieldFragment(item); builder.AddContent(seq++, fragment.Render(context)); } if (item.Type == CrudePropertyType.Table) { var fragment = CreateTableFragment(item); if (fragment == null) { continue; } builder.AddContent(seq++, fragment.Render(context)); } } builder.OpenElement(seq++, "crude-tree-footer"); if (onSubmit != null) { builder.OpenElement(seq++, "button"); builder.AddAttribute(seq++, "type", "submit"); builder.AddContent(seq++, onSubmit.Name); builder.CloseElement(); } foreach (var onButtonClick in GetOnClickButtons(context)) { var button = new ButtonFragment(onButtonClick.Name, onButtonClick.Callback, string.Empty, false); builder.AddContent(seq++, button.Render(context)); } builder.CloseElement(); builder.CloseElement(); };
public RenderFragment Render(RenderContext context) => builder => { var seq = 0; builder.OpenElement(seq++, "crude-table-fragment"); if (_table.IsSearchable) { builder.OpenElement(seq++, "crude-table-fragment-header"); BuildSearchBox(ref seq, context, builder); builder.CloseElement(); } builder.OpenElement(seq++, "table"); builder.OpenElement(seq++, "thead"); builder.OpenElement(seq++, "tr"); var headerInstance = Activator.CreateInstance(typeof(T)); if (headerInstance == null) { throw new ArgumentException($"Failed to construct table headers for type {typeof(T)}. Make sure you have an empty constructor"); } var items = ViewModelParser.ParseProperties(headerInstance); foreach (var item in items) { builder.OpenElement(seq++, "th"); CrudeEvent?sortEvent = null; if (_table.IsSortable) { sortEvent = new CrudeEvent(() => { if (_table.SortColumn == item.Info.Name) { _table.SortDescending = !_table.SortDescending; } else { _table.SortColumn = item.Info.Name; _table.SortDescending = false; } }); } var header = new ActionDecoratorFragment(item.Name, sortEvent); builder.AddContent(seq++, header.Render(context)); if (item.Info.Name == _table.SortColumn) { builder.OpenElement(seq++, "crude-table-sort-icon"); builder.AddAttribute(seq++, "class", _table.SortDescending ? "sort-desc" : "sort-asc"); builder.CloseElement(); } builder.CloseElement(); } builder.CloseElement(); builder.CloseElement(); builder.OpenElement(seq++, "tbody"); var elements = _table.GetElements(); foreach (var element in elements) { builder.OpenElement(seq++, "tr"); var rowItems = ViewModelParser.ParseProperties(element); foreach (var item in rowItems) { builder.OpenElement(seq++, "td"); builder.AddContent(seq++, GetValue(item, context)); builder.CloseElement(); } builder.CloseElement(); } builder.CloseElement(); builder.CloseElement(); var elementCount = _table.GetTotalElementCount(); if (elementCount > _table.TablePageSize) { builder.OpenElement(seq++, "crude-table-fragment-footer"); BuildPaginationButtons(ref seq, elementCount, context, builder); builder.CloseElement(); } builder.CloseElement(); };