SelectionRuleClientFunctions.cs 4.56 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.Container.SelectionRule;

namespace DirRX.Container.Client
{
  partial class SelectionRuleFunctions
  {

    /// <summary>
    /// Отобразить диалог для выбора типа контейнера.
    /// </summary>
    public void SelectArchiveDocsTypeFunctionDialog()
    {
      // Создать диалог для выбора функции.
      try
      {
        var dialog = Dialogs.CreateInputDialog(SelectionRules.Resources.SelectArchiveTypeTitle);
        var typeList = PublicFunctions.Module.GetArchiveDocsTypes();
        var selection = dialog.AddSelect(SelectionRules.Resources.ArchiveTypeLabel, true).From(typeList.ToArray());
        if (dialog.Show() == DialogButtons.Ok)
        {
          _obj.ArchiveDocumentType = selection.Value;
          _obj.ProcessingFunction = "Process" + selection.Value;
        }
      }
      catch (Exception e)
      {
        Dialogs.ShowMessage(e.Message, MessageType.Error);
      }
    }
    
    /// <summary>
    /// Отобразить диалог для выбора функции фильтрации.
    /// </summary>
    public void SelectFilteringFunctionDialog()
    {
      // Получить функции всех модулей с параметром "Выборка официальных документов".
      var functionList = new List<string>();
      var allData = new Dictionary<string, List<string>>();
      
      foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains(".Server,")))
      {
        var moduleName = assembly.GetName().Name;
        moduleName = moduleName.Substring(0, moduleName.LastIndexOf(".Server"));
        
        var functionType = string.Format("{0}.Functions.Module", moduleName);
        var modulesFunctions = assembly.GetTypes().FirstOrDefault(a => a.FullName == functionType);
        if (modulesFunctions != null)
        {
          var functionNames = modulesFunctions.GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)
            .Where(m => m.GetParameters().Any(p => p.ParameterType.FullName.Contains("IQueryable`1[[Sungero.Docflow.IOfficialDocument")))
            .Select(f => f.Name.Trim())
            .ToList();
          
          if (functionNames.Any())
            allData.Add(moduleName, functionNames);
        }
      }
      
      // Создать диалог для выбора функции.
      var dialog = Dialogs.CreateInputDialog(SelectionRules.Resources.SelectFilteringFunctionTitle);
      
      var moduleSelection = dialog.AddSelect(SelectionRules.Resources.ModuleNameLabel, false).From(allData.Select(x => x.Key).Distinct().ToArray());
      var functionSelection = dialog.AddSelect(SelectionRules.Resources.FunctionNameLabel, false).From(functionList.ToArray());
      
      // При смене модуля переопределить список доступных функций.
      moduleSelection.SetOnValueChanged((m) =>
                                        {
                                          if (m.NewValue != m.OldValue)
                                          {
                                            functionSelection.Value = null;
                                            functionList.Clear();
                                            if (m.NewValue != null)
                                            {
                                              functionList.AddRange(allData[m.NewValue]);
                                              functionSelection.From(functionList.ToArray());
                                            }
                                          }
                                        });
      
      // Если функция единственная, сразу заполнить ее имя.
      if (allData.Count == 1)
      {
        moduleSelection.Value = allData.Keys.First();
        functionSelection.Value = allData.First().Value.First();
      }
      else if (_obj.FilteringModule != null)
      {
        if (allData.ContainsKey(_obj.FilteringModule))
        {
          moduleSelection.Value = _obj.FilteringModule;
          if (allData[_obj.FilteringModule].Contains(_obj.FilteringFunction))
            functionSelection.Value = _obj.FilteringFunction;
        }
      }

      if (dialog.Show() == DialogButtons.Ok)
      {
        _obj.FilteringModule = moduleSelection.Value;
        _obj.FilteringFunction = functionSelection.Value;
      }
    }
    
  }
}