/// <summary>
        /// Calculates the client report from cached result.
        /// </summary>
        /// <returns></returns>
        public string CalcClientReportFromCachedResult()
        {
            int      count        = this.ClientReports.Count;
            string   xslString    = string.Empty;
            TimeSpan timeInterval = DateExtensions.TimeIntervalSinceReferenceDate(DateTime.UtcNow);

            if (!string.IsNullOrEmpty(this.XslName))
            {
                //string xslFileName = ServerSession.CurrentSession.FileStore.ImagePathForName(this.XslName);
                //xslFileName = xslFileName.StringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding);
                //xslString = $"<?xml-stylesheet type=\"text/xsl\" href=\"{xslFileName}?time={timeInterval}\"?>";
            }

            UPXmlMemoryWriter writer = new UPXmlMemoryWriter();

            if (!string.IsNullOrEmpty(this.RootXmlName))
            {
                writer.WriteElementStart(this.RootXmlName);
            }
            else
            {
                writer.WriteElementStart("Results");
            }

            for (int i = 0; i < count; i++)
            {
                object result = this.resultsForClientReports[i];
                if (result != null)
                {
                    UPWebContentClientReport clientReport = this.ClientReports[i];
                    ((UPCRMResult)result).SerializeRootElementName(writer, clientReport.RootNodeName);
                }
            }

            //for (int j = 0; j < signatureImageTagNames.Count && j < signaturePathNames.Count; j++)
            //{
            //    writer.WriteElementValue(signatureImageTagNames[j], $"{signaturePathNames[j]}?time={timeInterval}");
            //}

            writer.WriteLocaleSettingsElement();
            writer.WriteElementEnd();
            return($"<?xml version=\"1.0\" encoding=\"UTF-8\"?>{xslString}{writer.XmlContentStringAmpDecoded()}");
        }
        private bool ComputeNextReport()
        {
            if (this.ClientReports.Count <= this.nextClientReport)
            {
                this.BuildXml();
                this.blockStart = false;
                return(true);
            }

            IConfigurationUnitStore  configStore     = ConfigurationUnitStore.DefaultStore;
            UPWebContentClientReport report          = this.ClientReports[this.nextClientReport];
            SearchAndList            searchAndList   = configStore.SearchAndListByName(report.ConfigName);
            FieldControl             tmpFieldControl = searchAndList == null
                ? configStore.FieldControlByNameFromGroup("List", report.ConfigName)
                : configStore.FieldControlByNameFromGroup("List", searchAndList.FieldGroupName);

            if (tmpFieldControl == null)
            {
                this.nextClientReport++;
                return(this.ComputeNextReport());
            }

            this.crmQuery = new UPContainerMetaInfo(tmpFieldControl);
            if (!string.IsNullOrEmpty(this.recordIdentification))
            {
                int _linkId = this.linkId;
                if (report.ExplicitLinkId)
                {
                    _linkId = report.LinkId;
                }

                if (string.IsNullOrEmpty(report.ParentLinkConfig))
                {
                    this.crmQuery.SetLinkRecordIdentification(this.recordIdentification, _linkId);
                }
                else if (report.ParentLinkConfig != "nolink")
                {
                    string linkRecordIdentification = this.parentLinkDictionary.ValueOrDefault(report.ParentLinkConfig);
                    if (linkRecordIdentification == null)
                    {
                        this.linkReader = new UPCRMLinkReader(this.recordIdentification, report.ParentLinkConfig, this);
                        this.linkReader.Start();
                        return(true);
                    }

                    if (!string.IsNullOrEmpty(linkRecordIdentification))
                    {
                        this.crmQuery.SetLinkRecordIdentification(linkRecordIdentification, _linkId);
                    }
                }
            }

            if (!string.IsNullOrEmpty(searchAndList?.FilterName))
            {
                UPConfigFilter filter = configStore.FilterByName(searchAndList.FilterName);
                filter = filter?.FilterByApplyingValueDictionaryDefaults(this.filterParameters, true);
                if (filter != null)
                {
                    this.crmQuery.ApplyFilter(filter);
                }
            }

            this.crmQuery.Find(this.RequestOption, this);
            return(true);
        }
        /// <summary>
        /// Updates the metadata with view reference.
        /// </summary>
        /// <param name="viewReference">The view reference.</param>
        public override void UpdateMetadataWithViewReference(ViewReference viewReference)
        {
            base.UpdateMetadataWithViewReference(viewReference);
            string jsonString = viewReference.ContextValueForKey("SigningConfig");

            if (!string.IsNullOrEmpty(jsonString))
            {
                Dictionary <string, object> defaultConfigDict = "{\"sign\": true, \"upload\": true, \"emptySignatureName\": \"Button:PleaseSign\", \"signatureImageTagName\": \"SignatureImage\", \"signatureImageId\": \"img-signature\", \"signedReportFileName\": \"SampleReport.pdf\", \"signedReportFileNameDateFormat\": \"yyyy-MM-dd\"}".JsonDictionaryFromString();
                Dictionary <string, object> tempDict          = new Dictionary <string, object>(defaultConfigDict);

                foreach (var entry in jsonString.JsonDictionaryFromString())
                {
                    tempDict[entry.Key] = entry.Value;
                }

                this.SigningConfig = new Dictionary <string, object>(tempDict);
            }
            else
            {
                this.SigningConfig = null;
            }

            if (this.SigningConfig != null)
            {
                this.PdfFileName            = this.SigningConfig.ValueOrDefault("signedReportFileName") as string;
                this.PdfFileNameDateFormat  = this.SigningConfig.ValueOrDefault("signedReportFileNameDateFormat") as string;
                this.SignatureImageId       = this.SigningConfig.ValueOrDefault("signatureImageId") as string;
                this.SignatureTitle         = this.SigningConfig.ValueOrDefault("signatureTitle") as string;
                this.signatureImageTagNames = ((string)this.SigningConfig["signatureImageTagName"]).Split(';').ToList();
                //this.WithSignature = this.SigningConfig.BoolValueForKeyTheDefault("sign", true);
                //this.UploadReport = this.SigningConfig.BoolValueForKeyTheDefault("upload", true);

                this.signaturePathNames = new List <string>();
                IFileStorage fileStore           = ServerSession.CurrentSession.FileStore;
                var          emptySignatureNames = ((string)this.SigningConfig["emptySignatureName"]).Split(';');
                for (int i = 0; i < emptySignatureNames.Length; i++)
                {
                    string emptySignatureName         = emptySignatureNames[i];
                    string languageEmptySignatureName = $"{emptySignatureName}_{ServerSession.CurrentSession.LanguageKey}";
                    //string languageEmptySignaturePathName = fileStore.ImagePathForName(languageEmptySignatureName);
                    //string emptySignaturePathName = languageEmptySignaturePathName ?? fileStore.ImagePathForName(emptySignatureName);
                    //string signatureFileName = NSString.StringWithFormat("signature-%lu.%@", i, emptySignaturePathName.PathExtension());
                    //string signaturePathName = fileStore.BaseDirectoryPath().StringByAppendingPathComponent(signatureFileName);
                    //if (!string.IsNullOrEmpty(emptySignaturePathName))
                    //{
                    //    NSFileManager.DefaultManager().RemoveItemAtPathError(signaturePathName, null);
                    //    NSFileManager.DefaultManager().CopyItemAtPathToPathError(emptySignaturePathName, signaturePathName, null);
                    //}

                    //signaturePathNames.AddObject(signaturePathName);
                }
            }

            string configParentLink = viewReference.ContextValueForKey("ConfigParentLink");
            UPWebContentClientReport clientReport = new UPWebContentClientReport(viewReference.ContextValueForKey("ConfigName"), viewReference.ContextValueForKey("RootName"), configParentLink);
            string additionalConfigNames          = viewReference.ContextValueForKey("AdditionalConfigNames");
            string additionalRootNames            = viewReference.ContextValueForKey("AdditionalRootNames");

            if (!string.IsNullOrEmpty(additionalConfigNames))
            {
                string   additionalConfigParentLinkString = viewReference.ContextValueForKey("AdditionalConfigParentLinks");
                string[] additionalConfigParentLinks      = null;
                var      configNameParts = additionalConfigNames.Split(';');
                if (!string.IsNullOrEmpty(additionalConfigParentLinkString))
                {
                    additionalConfigParentLinks = additionalConfigParentLinkString.Split(';');
                }

                string[] rootNameParts = null;
                if (!string.IsNullOrEmpty(additionalRootNames))
                {
                    rootNameParts = additionalRootNames.Split(';');
                }

                int count = configNameParts.Length;
                List <UPWebContentClientReport> clientReportArray = new List <UPWebContentClientReport>(count + 1);
                clientReportArray.Add(clientReport);
                for (int i = 0; i < count; i++)
                {
                    string parentLinkConfig = null;
                    if (additionalConfigParentLinks?.Length > i)
                    {
                        parentLinkConfig = additionalConfigParentLinks[i];
                    }

                    clientReport = new UPWebContentClientReport(configNameParts[i], rootNameParts?.Length > i ? rootNameParts[i] : null, parentLinkConfig);
                    clientReportArray.Add(clientReport);
                }

                this.ClientReports = clientReportArray;
            }
            else
            {
                this.ClientReports = new List <UPWebContentClientReport> {
                    clientReport
                };
            }

            this.RootXmlName   = viewReference.ContextValueForKey("XmlRootElementName");
            this.XslName       = viewReference.ContextValueForKey("Xsl");
            this.RequestOption = UPCRMDataStore.RequestOptionFromString(viewReference.ContextValueForKey("RequestOption"), UPRequestOption.FastestAvailable);
            this.RequestOptionDependentOnRoot = viewReference.ContextValueIsSet("RequestOptionDependentOnRoot");
            if (this.RequestOptionDependentOnRoot && this.TheDelegate.IsOnline)
            {
                this.RequestOption = UPRequestOption.Online;
            }
        }