Files
Umbraco-CMS/src/Umbraco.Web/Models/Trees/ActionMenuItem.cs
2018-10-29 23:23:21 +11:00

57 lines
2.1 KiB
C#

using System;
using System.Diagnostics.CodeAnalysis;
using Umbraco.Core;
using Umbraco.Core.Services;
namespace Umbraco.Web.Models.Trees
{
/// <inheritdoc />
/// <summary>
/// A menu item that represents some JS that needs to execute when the menu item is clicked.
/// </summary>
/// <remarks>
/// These types of menu items are rare but they do exist. Things like refresh node simply execute
/// JS and don't launch a dialog.
/// Each action menu item describes what angular service that it's method exists in and what the method name is.
/// An action menu item must describe the angular service name for which it's method exists. It may also define what the
/// method name is that will be called in this service but if one is not specified then we will assume the method name is the
/// same as the Type name of the current action menu class.
/// </remarks>
public abstract class ActionMenuItem : MenuItem
{
/// <summary>
/// The angular service name containing the <see cref="AngularServiceMethodName"/>
/// </summary>
public abstract string AngularServiceName { get; }
/// <summary>
/// The angular service method name to call for this menu item
/// </summary>
public virtual string AngularServiceMethodName { get; } = null;
protected ActionMenuItem(string alias, string name) : base(alias, name)
{
Initialize();
}
protected ActionMenuItem(string alias, ILocalizedTextService textService) : base(alias, textService)
{
Initialize();
}
private void Initialize()
{
//add the current type to the metadata
if (AngularServiceMethodName.IsNullOrWhiteSpace())
{
//if no method name is supplied we will assume that the menu action is the type name of the current menu class
ExecuteJsMethod($"{AngularServiceName}.{this.GetType().Name}");
}
else
{
ExecuteJsMethod($"{AngularServiceName}.{AngularServiceMethodName}");
}
}
}
}