/// <inheritdoc/>
        public override UPMSearchPage CreatePageInstance()
        {
            UPMGridPage page = new UPMGridPage(StringIdentifier.IdentifierWithStringId("Analysis"))
            {
                ViewType               = SearchPageViewType.List,
                AvailableFilters       = null,
                AvailableOnlineSearch  = false,
                HideSearchBar          = true,
                FixedFirstColumn       = true,
                SumRowAtEnd            = true,
                EmptyCategoryText      = string.Empty,
                IsUnsortedStateAllowed = true
            };

            object val = this.Options.ValueOrDefault("FixedSumRow");

            if (val != null)
            {
                if (val is int)
                {
                    page.FixedSumRow = (int)val > 0;
                }
                else if (val is string)
                {
                    page.FixedSumRow = ((string)val).ToLower() != "false";
                }
            }
            else
            {
                page.FixedSumRow = false;
            }

            return(page);
        }
        private static List <UPMField> CreateFieldArray(UPMGridPage searchPage, List <object> columnInfoArray)
        {
            var fieldArray = new List <UPMField>();
            var i          = 0;

            foreach (AnalysisDrillThruColumn col in columnInfoArray)
            {
                var fieldType = col.SourceField.CrmFieldInfo.FieldType;
                if (fieldType == "F" || fieldType == "L" || fieldType == "S")
                {
                    searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(i, UPMColumnDataType.Numeric, false);
                }
                else if (fieldType == "D")
                {
                    searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(i, UPMColumnDataType.Date, false);
                }

                var field = new UPMStringField(StringIdentifier.IdentifierWithStringId($"col {++i}"))
                {
                    StringValue = col.DataSourceField.Label
                };
                fieldArray.Add(field);
            }

            return(fieldArray);
        }
        /// <inheritdoc/>
        public override void BuildPage()
        {
            UPMGridPage sp = (UPMGridPage)this.CreatePageInstance();

            sp.Invalid           = true;
            this.TopLevelElement = sp;
        }
        private void ProcessResultRows(
            AnalysisResult result,
            UPMGridPage searchPage,
            IReadOnlyList <object> xColumnArray,
            bool keyAsRawString,
            int columnCount,
            UPMResultSection section)
        {
            var i          = 0;
            var resultRows = CreateResultRows(result);
            var sumRow     = result.SumLine;

            foreach (AnalysisRow row in resultRows)
            {
                var identifier = StringIdentifier.IdentifierWithStringId($"row {i}");
                var listRow    = new UPMResultRow(identifier)
                {
                    Context = row
                };
                i++;
                var fieldArray = CreateFieldArray(row, xColumnArray, keyAsRawString, columnCount, i);

                listRow.Fields = fieldArray;
                if (searchPage.FixedSumRow && sumRow != null && i == resultRows.Count && resultRows.Count > 12)
                {
                    searchPage.SumResultRow = listRow;
                    searchPage.SumRowAtEnd  = false;
                }
                else
                {
                    section.AddResultRow(listRow);
                }

                if (row.HasDetails)
                {
                    var detailGroupCol1 = new UPMAnalysisResultRowGroup(StringIdentifier.IdentifierWithStringId("det1"))
                    {
                        Invalid = true,
                        Left    = true,
                        Row     = row
                    };
                    listRow.AddDetailGroup(detailGroupCol1);
                    var detailGroupCol2 = new UPMAnalysisResultRowGroup(StringIdentifier.IdentifierWithStringId("det2"))
                    {
                        Invalid = true,
                        Left    = false,
                        Row     = row
                    };
                    listRow.AddDetailGroup(detailGroupCol2);
                }

                this.AddDrilldownActionsFromRowToListRow(row, listRow);
                this.AddDetailsActionFromRowToListRow(row, listRow);
            }
        }
        private static UPMResultSection CreateSection(List <object> columnInfoArray, UPMGridPage searchPage)
        {
            var identifier          = StringIdentifier.IdentifierWithStringId("columnHeader");
            var section             = new UPMResultSection(identifier);
            var columnHeaderListRow = new UPMResultRow(identifier);

            var fieldArray = CreateFieldArray(searchPage, columnInfoArray);

            columnHeaderListRow.Fields = fieldArray;
            section.AddResultRow(columnHeaderListRow);

            return(section);
        }
        private void ProcessSearchPage(UPMGridPage searchPage, IReadOnlyList <string> contextMenuOptions, ICrmDataSourceRow crmRow, UPMResultRow listRow, AnalysisResult analysisResult, Page oldPage, int i)
        {
            var dataSource = analysisResult.DataSource;

            for (var j = 0; j < dataSource.NumberOfResultTables; j++)
            {
                var label = contextMenuOptions[j];
                if (string.IsNullOrEmpty(label))
                {
                    continue;
                }

                var recordIdentification = crmRow.RecordIdentificationAtIndex(j);
                if (recordIdentification?.Length > 0)
                {
                    var showRecordAction = new UPMOrganizerAnalysisShowRecordAction(StringIdentifier.IdentifierWithStringId($"action.row {i} record {j}"))
                    {
                        RecordIdentification = recordIdentification
                    };

                    showRecordAction.SetTargetAction(this, this.PerformShowRecordAction);
                    showRecordAction.LabelText = label;
                    listRow.AddDetailAction(showRecordAction);
                }

                var backAction = new UPMOrganizerAnalysisBackAction(StringIdentifier.IdentifierWithStringId("action.back"))
                {
                    AnalysisResult = analysisResult
                };

                backAction.SetTargetAction(this, this.PerformBackToAnalysis);
                backAction.LabelText = LocalizedString.TextAnalysesBackToAnalysis;
                searchPage.AddHeadOption(new UPMGridHeadOption(backAction.LabelText, backAction));
                searchPage.FixedFirstColumn = false;
                searchPage.SumRowAtEnd      = false;
                var hasOnlyEmptyLabels = true;
                foreach (var lbl in contextMenuOptions)
                {
                    if (lbl.Length > 0)
                    {
                        hasOnlyEmptyLabels = false;
                        break;
                    }
                }

                searchPage.ShowMenu  = !hasOnlyEmptyLabels;
                this.TopLevelElement = searchPage;
                this.InformAboutDidChangeTopLevelElement(oldPage, searchPage, null, null);
            }
        }
        private void AddCategoriesFromResultToPage(AnalysisResult result, UPMGridPage gridPage)
        {
            AnalysisCategory currentCategory = result.Settings.Category;

            gridPage.AddCategory(new UPMGridCategory(currentCategory.Label, null, true));
            foreach (AnalysisCategory category in result.CategoryOptions)
            {
                UPMOrganizerAction action = new UPMOrganizerAction(StringIdentifier.IdentifierWithStringId($"action.{category.Key}"));
                action.SetTargetAction(this, this.PerformAnalysisWithCategory);
                action.ViewReference = new ViewReference(new Dictionary <string, object> {
                    { "Category", category.Key }
                }, "PerformAnalysis");
                action.LabelText = category.Label;
                gridPage.AddCategory(new UPMGridCategory(category.Label, action, false));
            }
        }
 private void UpdateResetHeadOption(UPMGridPage searchPage, bool reset, AnalysisResult result)
 {
     if (reset && searchPage.ResetHeadOption == null)
     {
         var resetAction = new UPMOrganizerAnalysisBackAction(StringIdentifier.IdentifierWithStringId("action.reset"))
         {
             AnalysisResult = result
         };
         resetAction.SetTargetAction(this, this.PerformResetAnalysis);
         resetAction.LabelText = LocalizedString.TextAnalysesReset;
         var option = new UPMGridHeadOption(resetAction.LabelText, resetAction)
         {
             IsReset = true
         };
         searchPage.ResetHeadOption = option;
     }
 }
        private void AddDrillupActionsFromResultToPage(AnalysisResult result, UPMGridPage gridPage)
        {
            if (result.DrillupOptions != null)
            {
                foreach (AnalysisDrillupOption drillupOption in result.DrillupOptions)
                {
                    string label = drillupOption.IsBack ? LocalizedString.TextBack : drillupOption.DrillupDisplayString();

                    UPMOrganizerDrillupAction action = new UPMOrganizerDrillupAction(StringIdentifier.IdentifierWithStringId($"action.{drillupOption.Key}"))
                    {
                        DrillupOption = drillupOption
                    };

                    action.SetTargetAction(this, this.PerformDrillUp);
                    gridPage.AddHeadOption(new UPMGridHeadOption(label, action));
                }
            }
        }
        private static void ProcessColumns(
            IEnumerable <object> resultColumns,
            UPMGridPage searchPage,
            ICollection <UPMField> fieldArray,
            ICollection <object> xColumnArray)
        {
            var i = 0;
            var k = 0;

            foreach (AnalysisColumn col in resultColumns)
            {
                var colDataType = col.IsTextColumn ? UPMColumnDataType.String : UPMColumnDataType.Numeric;
                searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(++k, colDataType, false);

                var field = new UPMGridColumnHeaderStringField(StringIdentifier.IdentifierWithStringId($"col {++i}"))
                {
                    StringValue = col.Label
                };
                fieldArray.Add(field);

                field.NumberOfChildColumns = col.XCategoryValues?.Count ?? 0;
                xColumnArray.Add(field.NumberOfChildColumns);
                var j = 0;

                if (col.XCategoryValues != null)
                {
                    foreach (var xCol in col.XCategoryValues)
                    {
                        searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(++k, colDataType, false);

                        var xField = new UPMGridColumnHeaderStringField(StringIdentifier.IdentifierWithStringId($"col {i}-x {++j}"))
                        {
                            NumberOfChildColumns = 0,
                            IsSubField           = true,
                            StringValue          = xCol.Label
                        };
                        fieldArray.Add(xField);
                    }
                }
            }
        }
        private void ProcessResultRows(
            AnalysisRow row,
            List <object> columnInfoArray,
            UPMResultSection section,
            UPMGridPage searchPage,
            AnalysisResult analysisResult,
            Page oldPage)
        {
            var dataSource         = analysisResult.DataSource;
            var contextMenuOptions = GetContextMenuOptions(dataSource);
            var i = 0;

            foreach (ICrmDataSourceRow crmRow in row.ResultRows)
            {
                var identifier = StringIdentifier.IdentifierWithStringId($"row {i}");
                var listRow    = new UPMResultRow(identifier)
                {
                    Context = row
                };
                var fieldArray = new List <UPMField>();
                foreach (AnalysisDrillThruColumn col in columnInfoArray)
                {
                    var field = new UPMStringField(StringIdentifier.IdentifierWithStringId($"row {++i}"))
                    {
                        StringValue    = crmRow.ValueAtIndex(col.SourceField.QueryResultFieldIndex),
                        RawStringValue = crmRow.RawValueAtIndex(col.SourceField.QueryResultFieldIndex)
                    };
                    fieldArray.Add(field);
                }

                listRow.Fields = fieldArray;
                section.AddResultRow(listRow);
                ++i;
                this.ProcessSearchPage(searchPage, contextMenuOptions, crmRow, listRow, analysisResult, oldPage, i);
            }
        }
        private void UpdatePageFromQueryResult(UPCRMResult result)
        {
            this.QueryResult = result;
            UPMGridPage      searchPage = (UPMGridPage)this.CreatePageInstance();
            Page             oldPage = this.Page;
            int              i, j;
            int              columnCount         = result.ColumnCount;
            StringIdentifier identifier          = StringIdentifier.IdentifierWithStringId("columnHeader");
            UPMResultSection section             = new UPMResultSection(identifier);
            UPMResultRow     columnHeaderListRow = new UPMResultRow(identifier);
            var              fieldArray          = new List <UPMField>();

            searchPage.FixedFirstColumn = false;
            searchPage.ShowMenu         = true;
            searchPage.SumRowAtEnd      = false;
            for (i = 0; i < columnCount; i++)
            {
                UPContainerFieldMetaInfo fieldMetaInfo = result.ColumnFieldMetaInfoAtIndex(i);
                string fieldType = fieldMetaInfo.CrmFieldInfo.FieldType;
                if (fieldType == "F" || fieldType == "L" || fieldType == "S")
                {
                    searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(i, UPMColumnDataType.Numeric, false);
                }
                else if (fieldType == "D")
                {
                    searchPage.SetColumnInfoAtIndexDataTypeSpecialSort(i, UPMColumnDataType.Date, true);
                }

                UPMGridColumnHeaderStringField field = new UPMGridColumnHeaderStringField(StringIdentifier.IdentifierWithStringId($"col {i}"))
                {
                    StringValue = result.ColumnNameAtIndex(i)
                };
                fieldArray.Add(field);
            }

            columnHeaderListRow.Fields = fieldArray;
            section.AddResultRow(columnHeaderListRow);
            searchPage.AddResultSection(section);
            int           numberOfResultTables = result.NumberOfResultTables;
            List <object> contextMenuOptions   = new List <object>(numberOfResultTables);
            var           configStore          = ConfigurationUnitStore.DefaultStore;

            for (j = 0; j < numberOfResultTables; j++)
            {
                string infoAreaId    = result.ResultTableAtIndex(j).InfoAreaId;
                string infoAreaLabel = string.Empty;
                if (infoAreaId?.Length > 0)
                {
                    InfoArea       configInfoArea = configStore.InfoAreaConfigById(infoAreaId);
                    UPConfigExpand expand         = configStore.ExpandByName(infoAreaId);
                    FieldControl   fieldControl   = configStore.FieldControlByNameFromGroup("Details", expand.FieldGroupName);
                    if (configInfoArea != null && expand != null && fieldControl != null)
                    {
                        infoAreaLabel = LocalizedString.TextAnalysesShowParam.Replace("%@", configInfoArea.SingularName);
                    }
                }

                contextMenuOptions.Add(infoAreaLabel);
            }

            for (i = 0; i < result.RowCount; i++)
            {
                identifier = StringIdentifier.IdentifierWithStringId($"row {i}");
                var listRow = new UPMResultRow(identifier);
                var crmRow  = result.ResultRowAtIndex(i) as UPCRMResultRow;
                fieldArray = new List <UPMField>();
                var v = crmRow.Values();
                for (j = 0; j < v.Count; j++)
                {
                    UPMStringField field2 = new UPMStringField(StringIdentifier.IdentifierWithStringId($"cell{i}_{j}"))
                    {
                        StringValue    = v[j],
                        RawStringValue = crmRow.RawValueAtIndex(j)
                    };
                    fieldArray.Add(field2);
                }

                listRow.Fields = fieldArray;
                section.AddResultRow(listRow);
                for (j = 0; j < numberOfResultTables; j++)
                {
                    var label = contextMenuOptions[j] as string;
                    if (label.Length == 0)
                    {
                        continue;
                    }

                    string recordIdentification = crmRow.RecordIdentificationAtIndex(j);
                    if (recordIdentification?.Length > 0)
                    {
                        UPMOrganizerAnalysisShowRecordAction showRecordAction = new UPMOrganizerAnalysisShowRecordAction(StringIdentifier.IdentifierWithStringId($"action.row {i} record {j}"))
                        {
                            RecordIdentification = recordIdentification
                        };
                        showRecordAction.SetTargetAction(this, this.PerformShowRecordAction);
                        showRecordAction.LabelText = label;
                        listRow.AddDetailAction(showRecordAction);
                    }
                }
            }

            this.TopLevelElement = searchPage;
            this.InformAboutDidChangeTopLevelElement(oldPage, searchPage, null, null);
        }