internal static async Task <string> RenderRecordsHTMLAsync(YHtmlHelper htmlHelper, TreeDefinition treeModel, List <object> records) { HtmlBuilder hb = new HtmlBuilder(); if (records.Count > 0) { TreeSetup setup = GetTreeSetup(treeModel); hb.Append("<ul class='t_sub'>"); foreach (TreeEntry record in records) { hb.Append(await RenderRecordHTMLAsync(htmlHelper, treeModel, setup, record)); } hb.Append("</ul>"); } return(hb.ToString()); }
internal static TreeSetup GetTreeSetup(TreeDefinition treeModel) { TreeSetup setup = new TreeSetup() { DragDrop = treeModel.DragDrop, HoverCss = treeModel.UseSkinFormatting ? "ui-state-hover" : "tg_hover", HighlightCss = treeModel.UseSkinFormatting ? "ui-state-highlight" : "tg_highlight", DisabledCss = treeModel.UseSkinFormatting ? "ui-state-disabled" : "tg_disabled", RowHighlightCss = treeModel.UseSkinFormatting ? "ui-state-highlight" : "tg_highlight", RowDragDropHighlightCss = treeModel.UseSkinFormatting ? "ui-state-active" : "tg_dragdrophighlight", SelectedCss = treeModel.UseSkinFormatting ? "ui-state-active" : "t_select", ContentTargetId = treeModel.ContentTargetPane, ContentTargetPane = treeModel.ContentTargetPane, AjaxUrl = treeModel.AjaxUrl, }; return(setup); }
/// <summary> /// Called by the framework when the component needs to be rendered as HTML. /// </summary> /// <param name="model">The model being rendered by the component.</param> /// <returns>The component rendered as HTML.</returns> public async Task <string> RenderAsync(object model) { HtmlBuilder hb = new HtmlBuilder(); TreeDefinition treeModel = GetSiblingProperty <TreeDefinition>($"{FieldName}_TreeDefinition"); IEnumerable <object> ienum = model as IEnumerable <object>; List <TreeEntry> data = (from t in ienum select(TreeEntry)(object) t).ToList(); //IEnumerator<object> ienumerator = ienum.GetEnumerator(); string idEmpty = UniqueId(); TreeSetup setup = GetTreeSetup(treeModel); // Headers string headerHTML = await GetHeaderAsync(treeModel, data, setup); string html = await RenderHTML(HtmlHelper, treeModel, data, setup); string dd = ""; if (treeModel.DragDrop) { dd = " ondragstart='YetaWF_ComponentsHTML.TreeComponent.onDragStart(event)' ondrop='YetaWF_ComponentsHTML.TreeComponent.onDrop(event)' ondragend='YetaWF_ComponentsHTML.TreeComponent.onDragEnd(event)' ondragover='YetaWF_ComponentsHTML.TreeComponent.onDragOver(event)'"; } hb.Append($@" <div id='{treeModel.Id}' class='yt_tree t_display {(treeModel.UseSkinFormatting ? "tg_skin ui-corner-top ui-widget ui-widget-content" : "tg_noskin")}'{dd}> {headerHTML} {html} </div>"); Manager.ScriptManager.AddLast($"new YetaWF_ComponentsHTML.TreeComponent('{treeModel.Id}', {JsonConvert.SerializeObject(setup, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml })});"); return(hb.ToString()); }
internal static async Task <string> RenderRecordHTMLAsync(YHtmlHelper htmlHelper, TreeDefinition treeModel, TreeSetup setup, TreeEntry record) { HtmlBuilder hb = new HtmlBuilder(); //bool highlight; //ObjectSupport.TryGetPropertyValue<bool>(record, "__highlight", out highlight, false); //bool lowlight; //ObjectSupport.TryGetPropertyValue<bool>(record, "__lowlight", out lowlight, false); //string lightCss = ""; //if (highlight) // lightCss = "tg_highlight"; //else if (lowlight) // lightCss = "tg_lowlight"; // check for SubEntriesProperty bool collapsed = record.Collapsed; bool dynSubs = false; List <TreeEntry> items = record.SubEntries; if (items == null || items.Count == 0) { items = null; if (record.DynamicSubEntries) { dynSubs = record.DynamicSubEntries; } else { collapsed = false; } } string urlNew = record.UrlNew; string urlContent = record.UrlContent; // selected bool selected = record.Selected; string selectedCss = "", selectedLICss = ""; if (selected) { selectedCss = $" {setup.SelectedCss}"; selectedLICss = " class='t_select'"; } string extraCss = ""; if (record.ExtraCss != null) { extraCss = $" {record.ExtraCss}"; } string caret; string icon; if (dynSubs || items != null) { if (collapsed) { caret = "<i class='t_icright'> </i>"; } else { caret = "<i class='t_icdown'> </i>"; } if (string.IsNullOrWhiteSpace(urlNew) && string.IsNullOrWhiteSpace(urlContent)) { icon = "<i class='t_icfolder'> </i>"; } else { icon = "<i class='t_icfile'> </i>"; } } else { caret = "<i class='t_icempty'> </i>"; icon = "<i class='t_icfile'> </i>"; } string dd = ""; if (treeModel.DragDrop) { dd = " draggable='true'"; } // entry string text = await htmlHelper.ForDisplayAsync(record, nameof(TreeEntry.Text)); string beforeText = null; if (record.BeforeText != null) { beforeText = await htmlHelper.ForDisplayAsync(record, nameof(TreeEntry.BeforeText)); } string afterText = null; if (record.AfterText != null) { afterText = await htmlHelper.ForDisplayAsync(record, nameof(TreeEntry.AfterText)); } if (!string.IsNullOrWhiteSpace(text)) { text = text.Trim(new char[] { '\r', '\n' }); // templates can generate a lot of extra \r\n which breaks filtering } if (string.IsNullOrWhiteSpace(text)) { text = " "; } string output; if (!string.IsNullOrWhiteSpace(urlNew)) { output = $"<a class='t_entry{selectedCss}{extraCss} yaction-link' target='_blank' href='{HAE(urlNew)}'{dd}>{text}</a>"; } else if (!string.IsNullOrWhiteSpace(urlContent)) { output = $"<a class='t_entry{selectedCss}{extraCss} yaction-link' data-contenttarget='{treeModel.ContentTargetId}' data-contentpane='{treeModel.ContentTargetPane}' href='{HAE(urlContent)}'{dd}>{text}</a>"; } else { output = $"<a class='t_entry{selectedCss}{extraCss}' data-nohref='true' href='#'{dd}>{text}</a>"; } string recData = ""; if (treeModel.JSONData) { string json = JsonConvert.SerializeObject(record, JsonSettings); recData = $" data-record='{HAE(json)}'"; } hb.Append($@" <li {recData}{selectedLICss}> {caret} {icon}{beforeText}{output}{afterText}"); // sub entries if (items != null) { string collapsedStyle = ""; if (collapsed) { collapsedStyle = " style='display:none'"; } hb.Append($@" <ul{collapsedStyle} class='t_sub'>"); foreach (TreeEntry item in items) { hb.Append(await RenderRecordHTMLAsync(htmlHelper, treeModel, setup, item)); } hb.Append($@" </ul>"); } hb.Append($@" </li>"); return(hb.ToString()); }
internal async Task <string> RenderHTML(YHtmlHelper htmlHelper, TreeDefinition treeModel, List <TreeEntry> data, TreeSetup setup) { HtmlBuilder hb = new HtmlBuilder(); string styleCss = ""; if (data != null && data.Count > 0) { styleCss = " style='display:none'"; } hb.Append($@" <div class='tg_emptytr'{styleCss}> <div class='tg_emptydiv'> {HE(treeModel.NoRecordsText)} </div> </div>"); if (data != null && data.Count > 0) { hb.Append($@" <ul class='tg_root t_sub'>"); foreach (TreeEntry record in data) { hb.Append(await RenderRecordHTMLAsync(htmlHelper, treeModel, setup, record)); } hb.Append($@" </ul>"); } else { // when initially rendering a tree with 0 records, we have to prepare for all templates await YetaWFComponentExtender.AddComponentForType(treeModel.RecordType); } return(hb.ToString()); }
private Task <string> GetHeaderAsync(TreeDefinition treeModel, List <TreeEntry> data, TreeSetup setup) { HtmlBuilder hb = new HtmlBuilder(); if (treeModel.ShowHeader) { PropertyData prop = ObjectSupport.GetPropertyData(treeModel.RecordType, nameof(TreeEntry.Text)); // Caption string caption = treeModel.Header.ToString(); if (string.IsNullOrWhiteSpace(caption)) { caption = prop.GetCaption(null); } // Description string description = treeModel.HeaderTooltip.ToString(); if (string.IsNullOrWhiteSpace(description)) { description = prop.GetDescription(null); } string alignCss = "tg_left"; // Render column header hb.Append($@" <div class='{alignCss} tg_header{(treeModel.UseSkinFormatting ? " ui-state-default" : "")}' {Basics.CssTooltip}='{HAE(description ?? "")}'> <span>{HE(caption)}</span> </div>"); } return(Task.FromResult(hb.ToString())); }