using FastReport.Export.Html; using FastReport.Preview; using FastReport.Table; using System; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using FastReport.Web.Blazor.Export; namespace FastReport.Web { public partial class WebReport { #region Internal Methods internal bool ProcessClick(object sender, OnClickEventArgs args) { bool needUpdate = true; var clickType = args.Type; if(args.Report != null) { args.Object.SetReport(args.Report); } switch (clickType) { case ClickType.Click: Report.FindClickedObject(args.Object, args.PageNumber, Click); break; case ClickType.CheckboxClick: Report.FindEditableObject(args.Object, args.PageNumber, CheckboxClick); break; case ClickType.TextEdit: needUpdate = false; if(args.Object is TextObject textObject) { string text = textObject.Text; Report.FindEditableObject(textObject, args.PageNumber, (obj, reportPage, _pageN) => { obj.Text = text; Refresh(_pageN, reportPage); }); } break; case ClickType.DetailedReport: DoDetailedReport(args.Object, string.Empty); break; case ClickType.DetailedPage: DoDetailedPage(args.Object); break; case ClickType.Bookmark: Bookmark(args.Object); break; case ClickType.PageNumber: string value = args.Object.Hyperlink.Value; if(!string.IsNullOrWhiteSpace(value)) GoToPageNumber(value); break; case ClickType.AdvancedMatrixClick: if (args.Object is AdvMatrix.MatrixButton advMatrix) { DoClickAdvancedMatrixByParamID(advMatrix.Name, args.PageNumber, advMatrix.Index); } break; } return needUpdate; } #endregion #region Private Methods private void Bookmark(ReportComponentBase obj) { int i = PageNByBookmark(obj.Hyperlink.Value); if (i != -1) GotoPage(i); } private void DoDetailedPage(ReportComponentBase obj) { Report currentReport = CurrentTab.NeedParent ? Tabs[0].Report : Report; if (obj != null) { ReportPage? reportPage = currentReport.FindObject(obj.Hyperlink.DetailPageName) as ReportPage; if (reportPage != null) { string paramName = obj.Hyperlink.ReportParameter; string paramValue = obj.Hyperlink.Value; Data.Parameter param = currentReport.Parameters.FindByName(paramName); if (param != null && param.ChildObjects.Count > 0) { string[] paramValues = paramValue.Split(obj.Hyperlink.ValuesSeparator[0]); if (paramValues.Length > 0) { int i = 0; foreach (Data.Parameter childParam in param.ChildObjects) { childParam.Value = paramValues[i++]; if (i >= paramValues.Length) break; } } } else currentReport.SetParameterValue(paramName, paramValue); PreparedPages oldPreparedPages = currentReport.PreparedPages; PreparedPages pages = new PreparedPages(currentReport); currentReport.SetPreparedPages(pages); currentReport.PreparePage(reportPage, true); Report tabReport = new Report(); tabReport.SetPreparedPages(currentReport.PreparedPages); Tabs.Add(new ReportTab() { Name = paramValue, Report = tabReport, Closeable = true, NeedParent = true }); currentReport.SetPreparedPages(oldPreparedPages); CurrentTabIndex = Tabs.Count - 1; } } } internal void CacheHtmlPictures(BlazorExport export, int pageN) { //WebReportCache cache = new WebReportCache(this.Context); for (int i = 0; export.PreparedPages.Count > pageN && i < export.PreparedPages[pageN].Pictures.Count; i++) { try { Stream picStream = export.PreparedPages[pageN].Pictures[i]; byte[] image = new byte[picStream.Length]; picStream.Position = 0; int n = picStream.Read(image, 0, (int)picStream.Length); string guid = export.PreparedPages[pageN].Guids[i]; //cache.PutObject(guid, image); PictureCache[guid] = image; } catch { //Log.AppendFormat("Error with picture: {0}\n", i.ToString()); } } } #endregion } }