/// <summary> /// Get the view component for the specified object /// </summary> internal static IBiViewComponent GetViewComponent(XName elementName) { IBiViewComponent retVal = null; if (!m_componentCache.TryGetValue(elementName, out retVal) && !m_componentCache.TryGetValue(elementName.Namespace + "any", out retVal)) { return(null); } return(retVal); }
/// <summary> /// Write the specified object to the screen /// </summary> internal static void Write(XmlWriter writer, XNode nd, IRenderContext context) { if (nd is XElement el) { // TODO get helper here IBiViewComponent component = ReportViewUtil.GetViewComponent(el.Name); if (component == null) { writer.WriteComment($"WARNING: No component for {el.Name} is registered"); } else if (component.Validate(el, context)) { component.Render(el, writer, context); } else { #if DEBUG throw new ViewValidationException(el, $"Component {component?.ComponentName} failed validation"); #else writer.WriteStartElement("em", BiConstants.HtmlNamespace); writer.WriteAttributeString("style", "color: #f00"); StringBuilder path = new StringBuilder($"/{el.Name}"); var p = el.Parent; while (p != el.Document.Root && p != null) { path.Insert(0, $"/{p.Name}"); p = p.Parent; } writer.WriteString($"Component {component.ComponentName} failed validation at {path}"); writer.WriteEndElement(); // em #endif } } else if (nd is XText xt) { writer.WriteString(xt.Value.Trim()); } }