import 'package:fis_lib_report/converts/event_type.dart'; import 'package:fis_lib_report/report/element_tag.dart'; import 'package:fis_lib_report/report/element_type.dart'; import 'package:fis_lib_report/report/inputImageList.dart'; import 'package:fis_lib_report/report/interfaces/block_element.dart'; import 'package:fis_lib_report/report/interfaces/element.dart'; import 'package:fis_lib_report/report/paragraph.dart'; import 'package:fis_lib_report/report/report_template_document.dart'; import 'package:fis_lib_report/report/rt_page_size.dart'; import 'package:fis_lib_report/report/rt_table.dart'; import 'package:fis_lib_report/report_info/block_element_info_interface.dart'; import 'package:fis_lib_report/report_info/element_info.dart'; import 'package:fis_lib_report/report_info/input_image_info.dart'; import 'package:fis_lib_report/report_info/input_image_list_info.dart'; import 'package:fis_lib_report/report_info/paragraph_info.dart'; import 'package:fis_lib_report/report_info/rt_table_info.dart'; class ReportInfo { static ReportInfo? _reportInfo; List blocks = []; List headers = []; List footers = []; /// Gets the author of the report template. String? author; /// Gets or sets the value to indicate whether the report template is created by user. bool? isCustom; /// Gets the report template name. String? name; /// Gets the custom input element tags of the report template. Map? tags; /// Gets or sets the update time. DateTime? updateTime; ///version String? version; /// Gets the id. String? id; ReportInfo._internal(); RTPageSize? pageSize; double currentHeight = 0; String? reporter; DateTime? reportDate; ReportTemplateDocument? reportTemplate; FEventHandler onReload = FEventHandler(); static ReportInfo get instance { _reportInfo ??= ReportInfo._internal(); return _reportInfo!; } void init(ReportTemplateDocument reportTemplate, DateTime reportDate, String reporter) { try { this.reportTemplate = reportTemplate; this.reportDate = reportDate; this.reporter = reporter; isCustom = reportTemplate.isCustom; name = reportTemplate.name; updateTime = reportTemplate.updateTime; version = reportTemplate.version; id = reportTemplate.id; for (var element in reportTemplate.header!) { headers.add(_initBlockElement(element)); } for (var element in reportTemplate.blocks!) { blocks.add(_initBlockElement(element)); } for (var element in reportTemplate.footer!) { footers.add(_initBlockElement(element)); } pageSize = reportTemplate.pageSize; } catch (e) { print(e); } } ///重新渲染UI&重构reportInfo void reload(String reporter, DateTime reportDate, String jsonStr, FEventHandler onSelect) { _reportInfo = null; onReload.emit( this, ReportEventArgs(reportDate, reporter, jsonStr, onSelect)); } IBlockElementInfo? getBlockElement(IBlockElement block) { final id = block.id; for (var element in headers) { if (element.id == id) { return element; } } for (var element in blocks) { if (element.id == id) { return element; } } for (var element in footers) { if (element.id == id) { return element; } } } IBlockElementInfo _initBlockElement(IBlockElement element) { final _type = element.elementType!; if (_type.name == ElementType.rtTable!.name) { final table = element as RTTable; return RTTableInfo.fromElement(table); } else if (_type.name == ElementType.paragraph!.name) { final paragraph = element as Paragraph; return ParagraphInfo.fromElement(paragraph); } else { final inputImageList = element as InputImageList; return InputImageListInfo.fromElement(inputImageList); } } void selectedInputImage(String imageUrl) { for (var element in headers) { if (_checkImageisSelected(element, imageUrl)) { return; } } for (var element in blocks) { if (_checkImageisSelected(element, imageUrl)) { return; } } for (var element in footers) { if (_checkImageisSelected(element, imageUrl)) { return; } } } ElementInfo? getElementInfo(IElement element) { try { for (var e in headers) { final elementInfo = _getBaseElementInfo(e, element); if (elementInfo != null) { return elementInfo; } } for (var e in blocks) { final elementInfo = _getBaseElementInfo(e, element); if (elementInfo != null) { return elementInfo; } } for (var e in footers) { final elementInfo = _getBaseElementInfo(e, element); if (elementInfo != null) { return elementInfo; } } } catch (e) { print(e); } return null; } bool _checkImageisSelected(IBlockElementInfo block, String url) { if (block is InputImageListInfo) { final inputImage = block; if (inputImage.isSelected ?? false) { inputImage.addImage(url); return true; } } else if (block is ParagraphInfo) { for (var el in block.elementInfos!) { if (el is InputImageInfo) { final image = el; if (image.isSelected!) { image.addImage(url); return true; } } } } return false; } ElementInfo? _getBaseElementInfo(IBlockElementInfo block, IElement element) { ElementInfo? result; final type = block.elementType; if (type!.name == ElementType.paragraph!.name) { final paragraph = block as ParagraphInfo; for (var el in paragraph.elementInfos!) { if (el.id == element.id) { result = el; break; } } } if (result == null) { if (type.name == ElementType.rtTable!.name) { final table = block as RTTableInfo; final cells = table.cells!; for (var cell in cells.values) { for (var b in cell.blocks!) { final info = _getBaseElementInfo(b, element); if (info != null) { result = info; break; } } } } } return result; } } class ReportEventArgs { final FEventHandler onSelect; final String jsonStr; final String reporter; final DateTime reportDate; ReportEventArgs(this.reportDate, this.reporter, this.jsonStr, this.onSelect); }