oqtane.framework/Oqtane.Shared/Models/Module.cs
2024-09-19 09:41:11 -04:00

235 lines
6.8 KiB
C#

using Oqtane.Shared;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Oqtane.Models
{
/// <summary>
/// Describes a Module _Instance_ which will be shown on a page. This is different from a <see cref="ModuleDefinition"/> which describes a Module.
/// </summary>
public class Module : ModelBase
{
/// <summary>
/// The ID of this instance
/// </summary>
public int ModuleId { get; set; }
/// <summary>
/// Reference to the <see cref="Site"/>
/// </summary>
public int SiteId { get; set; }
/// <summary>
/// Reference to the <see cref="ModuleDefinition"/>
/// </summary>
public string ModuleDefinitionName { get; set; }
/// <summary>
/// Determines if this module should be shown on all pages of the current <see cref="Site"/>
/// </summary>
public bool AllPages { get; set; }
/// <summary>
/// Reference to the <see cref="ModuleDefinition"/> used for this module.
/// </summary>
[NotMapped]
public ModuleDefinition ModuleDefinition { get; set; }
#region IDeletable Properties
[NotMapped]
public string DeletedBy { get; set; }
[NotMapped]
public DateTime? DeletedOn { get; set; }
[NotMapped]
public bool IsDeleted { get; set; }
#endregion
/// <summary>
/// list of permissions for this module
/// </summary>
[NotMapped]
public List<Permission> PermissionList { get; set; }
/// <summary>
/// List of settings for this module
/// </summary>
[NotMapped]
public Dictionary<string, string> Settings { get; set; }
#region PageModule properties
/// <summary>
/// The id of the PageModule instance
/// </summary>
[NotMapped]
public int PageModuleId { get; set; }
/// <summary>
/// Reference to the <see cref="Page"/> this module is on.
/// </summary>
[NotMapped]
public int PageId { get; set; }
/// <summary>
/// Title of the pagemodule instance
/// </summary>
[NotMapped]
public string Title { get; set; }
/// <summary>
/// The pane where this pagemodule instance will be injected on the page
/// </summary>
[NotMapped]
public string Pane { get; set; }
/// <summary>
/// The order of the pagemodule instance within the Pane
/// </summary>
[NotMapped]
public int Order { get; set; }
/// <summary>
/// The container for the pagemodule instance
/// </summary>
[NotMapped]
public string ContainerType { get; set; }
/// <summary>
/// Start of when this module is visible. See also <see cref="ExpiryDate"/>
/// </summary>
[NotMapped]
public DateTime? EffectiveDate { get; set; }
/// <summary>
/// End of when this module is visible. See also <see cref="EffectiveDate"/>
/// </summary>
[NotMapped]
public DateTime? ExpiryDate { get; set; }
#endregion
#region SiteRouter properties
/// <summary>
/// Stores the type name for the module component being rendered
/// </summary>
[NotMapped]
public string ModuleType { get; set; }
/// <summary>
/// The position of the module instance in a pane
/// </summary>
[NotMapped]
public int PaneModuleIndex { get; set; }
/// <summary>
/// The number of modules in a pane
/// </summary>
[NotMapped]
public int PaneModuleCount { get; set; }
/// <summary>
/// A unique id to help determine if a component should be rendered
/// </summary>
[NotMapped]
public Guid RenderId { get; set; }
#endregion
#region IModuleControl properties
/// <summary>
/// The minimum access level to view the component being rendered
/// </summary>
[NotMapped]
public SecurityAccessLevel SecurityAccessLevel { get; set; }
/// <summary>
/// An optional title for the component
/// </summary>
[NotMapped]
public string ControlTitle { get; set; }
/// <summary>
/// Optional mapping of Url actions to a component
/// </summary>
[NotMapped]
public string Actions { get; set; }
/// <summary>
/// Optionally indicate if a compoent should not be rendered with the default modal admin container
/// </summary>
[NotMapped]
public bool UseAdminContainer { get; set; }
/// <summary>
/// Optionally specify the render mode for the component (overrides the Site setting)
/// </summary>
[NotMapped]
public string RenderMode { get; set; }
/// <summary>
/// Optionally specify id the component should be prerendered (overrides the Site setting)
/// </summary>
[NotMapped]
public bool? Prerender { get; set; }
#endregion
#region Deprecated Properties
[Obsolete("The Permissions property is deprecated. Use PermissionList instead", false)]
[NotMapped]
[JsonIgnore] // exclude from API payload
public string Permissions
{
get
{
return JsonSerializer.Serialize(PermissionList);
}
set
{
PermissionList = JsonSerializer.Deserialize<List<Permission>>(value);
}
}
#endregion
public Module Clone()
{
return new Module
{
ModuleId = ModuleId,
SiteId = SiteId,
ModuleDefinitionName = ModuleDefinitionName,
AllPages = AllPages,
PageModuleId = PageModuleId,
PageId = PageId,
Title = Title,
Pane = Pane,
Order = Order,
ContainerType = ContainerType,
EffectiveDate = EffectiveDate,
ExpiryDate = ExpiryDate,
CreatedBy = CreatedBy,
CreatedOn = CreatedOn,
ModifiedBy = ModifiedBy,
ModifiedOn = ModifiedOn,
DeletedBy = DeletedBy,
DeletedOn = DeletedOn,
IsDeleted = IsDeleted,
ModuleDefinition = ModuleDefinition,
PermissionList = PermissionList.ConvertAll(permission => permission.Clone()),
Settings = Settings.ToDictionary(setting => setting.Key, setting => setting.Value)
};
}
}
}