Exemplo n.º 1
0
    /*==========================================================================================================================
    | METHOD: INVOKE
    \-------------------------------------------------------------------------------------------------------------------------*/
    /// <summary>
    ///   Assembles the view model for the <see cref="FileListViewComponent"/>.
    /// </summary>
    public IViewComponentResult Invoke(
      EditingTopicViewModel currentTopic,
      FileListAttributeDescriptorViewModel attribute,
      string htmlFieldPrefix
    ) {

      /*------------------------------------------------------------------------------------------------------------------------
      | Validate parameters
      \-----------------------------------------------------------------------------------------------------------------------*/
      Contract.Requires(currentTopic, nameof(currentTopic));
      Contract.Requires(attribute, nameof(attribute));

      /*------------------------------------------------------------------------------------------------------------------------
      | Set HTML prefix
      \-----------------------------------------------------------------------------------------------------------------------*/
      ViewData.TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix;

      /*------------------------------------------------------------------------------------------------------------------------
      | Establish view model
      \-----------------------------------------------------------------------------------------------------------------------*/
      var model                 = new FileListAttributeViewModel(currentTopic, attribute) {
        AbsolutePath            = _webHostEnvironment.ContentRootPath + attribute.Path
      };

      /*------------------------------------------------------------------------------------------------------------------------
      | Set model values
      \-----------------------------------------------------------------------------------------------------------------------*/
      foreach (var file in GetFiles(model)) {
        model.Files.Add(file);
      };

      /*------------------------------------------------------------------------------------------------------------------------
      | Return view with view model
      \-----------------------------------------------------------------------------------------------------------------------*/
      return View(model);

    }
Exemplo n.º 2
0
    /*==========================================================================================================================
    | METHOD: GET FILES
    \-------------------------------------------------------------------------------------------------------------------------*/
    /// <summary>
    ///   Retrieves a collection of files in a directory, given the provided <see cref="Path"/>.
    /// </summary>
    public static Collection<SelectListItem> GetFiles(FileListAttributeViewModel viewModel) {

      /*------------------------------------------------------------------------------------------------------------------------
      | Validate parameters
      \-----------------------------------------------------------------------------------------------------------------------*/
      Contract.Requires(viewModel, nameof(viewModel));

      /*------------------------------------------------------------------------------------------------------------------------
      | INSTANTIATE OBJECTS
      \-----------------------------------------------------------------------------------------------------------------------*/
      var attribute             = viewModel.AttributeDescriptor;
      var absolutePath          = viewModel.AbsolutePath;
      var files                 = new Collection<SelectListItem>();
      var searchPattern         = "*";
      var searchOption          = attribute.IncludeSubdirectories is true? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;

      /*------------------------------------------------------------------------------------------------------------------------
      | Validate input
      \-----------------------------------------------------------------------------------------------------------------------*/
      if (String.IsNullOrEmpty(attribute.Path)) return files;
      if (!Directory.Exists(absolutePath)) return files;

      /*------------------------------------------------------------------------------------------------------------------------
      | Filter file list based on extension
      \-----------------------------------------------------------------------------------------------------------------------*/
      if (attribute.Extension is not null) {
        searchPattern = searchPattern + "." + attribute.Extension;
      }

      /*------------------------------------------------------------------------------------------------------------------------
      | Filter file list based on filter criteria
      \-----------------------------------------------------------------------------------------------------------------------*/
      if (attribute.Filter is not null) {
        searchPattern = attribute.Filter + searchPattern;
      }

      /*------------------------------------------------------------------------------------------------------------------------
      | GET ALL FILES
      \-----------------------------------------------------------------------------------------------------------------------*/
      var foundFiles = Directory.GetFiles(absolutePath, searchPattern, searchOption);

      /*------------------------------------------------------------------------------------------------------------------------
      | Set label
      \-----------------------------------------------------------------------------------------------------------------------*/
      if (!String.IsNullOrEmpty(viewModel.InheritedValue)) {
        setLabel(viewModel.InheritedValue, "inherited value");
      }
      else if (!String.IsNullOrEmpty(viewModel.AttributeDescriptor.DefaultValue)) {
        setLabel(viewModel.AttributeDescriptor.DefaultValue, "default value");
      }
      else if (!String.IsNullOrEmpty(viewModel.AttributeDescriptor.ImplicitValue)) {
        setLabel(viewModel.AttributeDescriptor.ImplicitValue, "implicit default");
      }
      else {
        setLabel("Select a file…");
      }

      foreach (var foundFile in foundFiles) {
        var fileName = foundFile.Replace(absolutePath, "", StringComparison.OrdinalIgnoreCase);
        var fileNameKey = fileName.Replace("." + attribute.Extension, "", StringComparison.OrdinalIgnoreCase);
        files.Add(new(fileNameKey, fileName));
      }

      /*------------------------------------------------------------------------------------------------------------------------
      | RETURN FILE LIST
      \-----------------------------------------------------------------------------------------------------------------------*/
      return files;

      /*------------------------------------------------------------------------------------------------------------------------
      | Function: Set Label
      \-----------------------------------------------------------------------------------------------------------------------*/
      void setLabel(string value, string? contextualLabel = null) {
        var label = value;
        if (contextualLabel is not null) {
          label += " (" + contextualLabel + ")";
        }
        viewModel.Files.Add(
          new() {
            Value = "",
            Text = label
          }
        );
      }

    }