Move features
- Introduced IUmbracoFeature Move Install Move Tree Items - Introduced IMenuItemCollectionFactory - to insure injection of ActionCollection
This commit is contained in:
@@ -6,5 +6,7 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
void RemoveConnectionString(string umbracoConnectionName);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-4
@@ -1,5 +1,4 @@
|
||||
using Umbraco.Core.Collections;
|
||||
using Umbraco.Web.WebApi;
|
||||
|
||||
namespace Umbraco.Web.Features
|
||||
{
|
||||
@@ -13,19 +12,19 @@ namespace Umbraco.Web.Features
|
||||
/// </summary>
|
||||
public DisabledFeatures()
|
||||
{
|
||||
Controllers = new TypeList<UmbracoApiControllerBase>();
|
||||
Controllers = new TypeList<IUmbracoFeature>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the disabled controllers.
|
||||
/// </summary>
|
||||
public TypeList<UmbracoApiControllerBase> Controllers { get; }
|
||||
public TypeList<IUmbracoFeature> Controllers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Disables the device preview feature of previewing.
|
||||
/// </summary>
|
||||
public bool DisableDevicePreview { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// If true, all references to templates will be removed in the back office and routing
|
||||
/// </summary>
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Umbraco.Web.Features
|
||||
{
|
||||
public interface IUmbracoFeature
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
+2
-3
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using Umbraco.Web.WebApi;
|
||||
|
||||
namespace Umbraco.Web.Features
|
||||
{
|
||||
@@ -16,7 +15,7 @@ namespace Umbraco.Web.Features
|
||||
Disabled = new DisabledFeatures();
|
||||
Enabled = new EnabledFeatures();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the disabled features.
|
||||
/// </summary>
|
||||
@@ -32,7 +31,7 @@ namespace Umbraco.Web.Features
|
||||
/// </summary>
|
||||
internal bool IsControllerEnabled(Type feature)
|
||||
{
|
||||
if (typeof(UmbracoApiControllerBase).IsAssignableFrom(feature))
|
||||
if (typeof(IUmbracoFeature).IsAssignableFrom(feature))
|
||||
return Disabled.Controllers.Contains(feature) == false;
|
||||
|
||||
throw new NotSupportedException("Not a supported feature type.");
|
||||
+27
-19
@@ -2,10 +2,10 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Collections;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Serialization;
|
||||
using Umbraco.Web.Install.Models;
|
||||
|
||||
namespace Umbraco.Web.Install
|
||||
@@ -13,29 +13,37 @@ namespace Umbraco.Web.Install
|
||||
/// <summary>
|
||||
/// An internal in-memory status tracker for the current installation
|
||||
/// </summary>
|
||||
internal static class InstallStatusTracker
|
||||
public class InstallStatusTracker
|
||||
{
|
||||
private readonly IIOHelper _ioHelper;
|
||||
private readonly IJsonSerializer _jsonSerializer;
|
||||
|
||||
public InstallStatusTracker(IIOHelper ioHelper, IJsonSerializer jsonSerializer)
|
||||
{
|
||||
_ioHelper = ioHelper;
|
||||
_jsonSerializer = jsonSerializer;
|
||||
}
|
||||
|
||||
private static ConcurrentHashSet<InstallTrackingItem> _steps = new ConcurrentHashSet<InstallTrackingItem>();
|
||||
|
||||
private static string GetFile(Guid installId)
|
||||
private string GetFile(Guid installId)
|
||||
{
|
||||
var file = Current.IOHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/"
|
||||
+ "install_"
|
||||
+ installId.ToString("N")
|
||||
+ ".txt");
|
||||
var file = _ioHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/"
|
||||
+ "install_"
|
||||
+ installId.ToString("N")
|
||||
+ ".txt");
|
||||
return file;
|
||||
}
|
||||
|
||||
public static void Reset()
|
||||
public void Reset()
|
||||
{
|
||||
_steps = new ConcurrentHashSet<InstallTrackingItem>();
|
||||
ClearFiles();
|
||||
}
|
||||
|
||||
public static void ClearFiles()
|
||||
public void ClearFiles()
|
||||
{
|
||||
var dir = Current.IOHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/");
|
||||
var dir = _ioHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/");
|
||||
if (Directory.Exists(dir))
|
||||
{
|
||||
var files = Directory.GetFiles(dir);
|
||||
@@ -50,13 +58,13 @@ namespace Umbraco.Web.Install
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<InstallTrackingItem> InitializeFromFile(Guid installId)
|
||||
public IEnumerable<InstallTrackingItem> InitializeFromFile(Guid installId)
|
||||
{
|
||||
//check if we have our persisted file and read it
|
||||
var file = GetFile(installId);
|
||||
if (File.Exists(file))
|
||||
{
|
||||
var deserialized = JsonConvert.DeserializeObject<IEnumerable<InstallTrackingItem>>(
|
||||
var deserialized = _jsonSerializer.Deserialize<IEnumerable<InstallTrackingItem>>(
|
||||
File.ReadAllText(file));
|
||||
foreach (var item in deserialized)
|
||||
{
|
||||
@@ -70,7 +78,7 @@ namespace Umbraco.Web.Install
|
||||
return new List<InstallTrackingItem>(_steps);
|
||||
}
|
||||
|
||||
public static IEnumerable<InstallTrackingItem> Initialize(Guid installId, IEnumerable<InstallSetupStep> steps)
|
||||
public IEnumerable<InstallTrackingItem> Initialize(Guid installId, IEnumerable<InstallSetupStep> steps)
|
||||
{
|
||||
//if there are no steps in memory
|
||||
if (_steps.Count == 0)
|
||||
@@ -79,7 +87,7 @@ namespace Umbraco.Web.Install
|
||||
var file = GetFile(installId);
|
||||
if (File.Exists(file))
|
||||
{
|
||||
var deserialized = JsonConvert.DeserializeObject<IEnumerable<InstallTrackingItem>>(
|
||||
var deserialized = _jsonSerializer.Deserialize<IEnumerable<InstallTrackingItem>>(
|
||||
File.ReadAllText(file));
|
||||
foreach (var item in deserialized)
|
||||
{
|
||||
@@ -96,7 +104,7 @@ namespace Umbraco.Web.Install
|
||||
_steps.Add(new InstallTrackingItem(step.Name, step.ServerOrder));
|
||||
}
|
||||
//save the file
|
||||
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
|
||||
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(file));
|
||||
File.WriteAllText(file, serialized);
|
||||
}
|
||||
@@ -110,7 +118,7 @@ namespace Umbraco.Web.Install
|
||||
ClearFiles();
|
||||
|
||||
//save the correct file
|
||||
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
|
||||
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(file));
|
||||
File.WriteAllText(file, serialized);
|
||||
}
|
||||
@@ -119,7 +127,7 @@ namespace Umbraco.Web.Install
|
||||
return new List<InstallTrackingItem>(_steps);
|
||||
}
|
||||
|
||||
public static void SetComplete(Guid installId, string name, IDictionary<string, object> additionalData = null)
|
||||
public void SetComplete(Guid installId, string name, IDictionary<string, object> additionalData = null)
|
||||
{
|
||||
var trackingItem = _steps.Single(x => x.Name == name);
|
||||
if (additionalData != null)
|
||||
@@ -130,7 +138,7 @@ namespace Umbraco.Web.Install
|
||||
|
||||
//save the file
|
||||
var file = GetFile(installId);
|
||||
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
|
||||
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
|
||||
File.WriteAllText(file, serialized);
|
||||
}
|
||||
|
||||
-1
@@ -4,7 +4,6 @@ using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Install;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Web.Install.Models;
|
||||
|
||||
namespace Umbraco.Web.Install.InstallSteps
|
||||
+7
-5
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Web.Install.Models;
|
||||
|
||||
@@ -14,10 +14,12 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
{
|
||||
public override bool RequiresExecution(object model) => true;
|
||||
private readonly IUmbracoVersion _umbracoVersion;
|
||||
private readonly IRuntimeState _runtimeState;
|
||||
|
||||
public UpgradeStep(IUmbracoVersion umbracoVersion)
|
||||
public UpgradeStep(IUmbracoVersion umbracoVersion, IRuntimeState runtimeState)
|
||||
{
|
||||
_umbracoVersion = umbracoVersion;
|
||||
_runtimeState = runtimeState;
|
||||
}
|
||||
|
||||
public override Task<InstallSetupResult> ExecuteAsync(object model) => Task.FromResult<InstallSetupResult>(null);
|
||||
@@ -43,9 +45,9 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
return value;
|
||||
}
|
||||
|
||||
var state = Current.RuntimeState; // TODO: inject
|
||||
var currentState = FormatGuidState(state.CurrentMigrationState);
|
||||
var newState = FormatGuidState(state.FinalMigrationState);
|
||||
|
||||
var currentState = FormatGuidState(_runtimeState.CurrentMigrationState);
|
||||
var newState = FormatGuidState(_runtimeState.FinalMigrationState);
|
||||
|
||||
var reportUrl = $"https://our.umbraco.com/contribute/releases/compare?from={currentVersion}&to={newVersion}¬es=1";
|
||||
|
||||
+1
-2
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace Umbraco.Web.Install.Models
|
||||
{
|
||||
@@ -9,7 +8,7 @@ namespace Umbraco.Web.Install.Models
|
||||
public class InstallInstructions
|
||||
{
|
||||
[DataMember(Name = "instructions")]
|
||||
public IDictionary<string, JToken> Instructions { get; set; }
|
||||
public IDictionary<string, object> Instructions { get; set; }
|
||||
|
||||
[DataMember(Name = "installId")]
|
||||
public Guid InstallId { get; set; }
|
||||
+1
-1
@@ -3,7 +3,7 @@ using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Install.Models
|
||||
{
|
||||
internal class InstallTrackingItem
|
||||
public class InstallTrackingItem
|
||||
{
|
||||
public InstallTrackingItem(string name, int serverOrder)
|
||||
{
|
||||
@@ -0,0 +1,9 @@
|
||||
using Umbraco.Web.Models.Trees;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
{
|
||||
public interface IMenuItemCollectionFactory
|
||||
{
|
||||
MenuItemCollection Create();
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Web.Actions;
|
||||
|
||||
namespace Umbraco.Web.Models.Trees
|
||||
{
|
||||
@@ -9,17 +10,16 @@ namespace Umbraco.Web.Models.Trees
|
||||
[DataContract(Name = "menuItems", Namespace = "")]
|
||||
public class MenuItemCollection
|
||||
{
|
||||
public static MenuItemCollection Empty => new MenuItemCollection();
|
||||
private readonly MenuItemList _menuItems;
|
||||
|
||||
private readonly MenuItemList _menuItems = new MenuItemList();
|
||||
|
||||
public MenuItemCollection()
|
||||
public MenuItemCollection(ActionCollection actionCollection)
|
||||
{
|
||||
_menuItems = new MenuItemList(actionCollection);
|
||||
}
|
||||
|
||||
public MenuItemCollection(IEnumerable<MenuItem> items)
|
||||
public MenuItemCollection(ActionCollection actionCollection, IEnumerable<MenuItem> items)
|
||||
{
|
||||
_menuItems = new MenuItemList(items);
|
||||
_menuItems = new MenuItemList(actionCollection, items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -0,0 +1,21 @@
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
{
|
||||
public class MenuItemCollectionFactory: IMenuItemCollectionFactory
|
||||
{
|
||||
private readonly ActionCollection _actionCollection;
|
||||
|
||||
public MenuItemCollectionFactory(ActionCollection actionCollection)
|
||||
{
|
||||
_actionCollection = actionCollection;
|
||||
}
|
||||
|
||||
public MenuItemCollection Create()
|
||||
{
|
||||
return new MenuItemCollection(_actionCollection);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+7
-4
@@ -1,7 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Composing;
|
||||
|
||||
namespace Umbraco.Web.Models.Trees
|
||||
{
|
||||
@@ -13,13 +12,17 @@ namespace Umbraco.Web.Models.Trees
|
||||
/// </remarks>
|
||||
public class MenuItemList : List<MenuItem>
|
||||
{
|
||||
public MenuItemList()
|
||||
private readonly ActionCollection _actionCollection;
|
||||
|
||||
public MenuItemList(ActionCollection actionCollection)
|
||||
{
|
||||
_actionCollection = actionCollection;
|
||||
}
|
||||
|
||||
public MenuItemList( IEnumerable<MenuItem> items)
|
||||
public MenuItemList(ActionCollection actionCollection, IEnumerable<MenuItem> items)
|
||||
: base(items)
|
||||
{
|
||||
_actionCollection = actionCollection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -44,7 +47,7 @@ namespace Umbraco.Web.Models.Trees
|
||||
private MenuItem CreateMenuItem<T>(ILocalizedTextService textService, bool hasSeparator = false, bool opensDialog = false)
|
||||
where T : IAction
|
||||
{
|
||||
var item = Current.Actions.GetAction<T>();
|
||||
var item = _actionCollection.GetAction<T>();
|
||||
if (item == null) return null;
|
||||
|
||||
var menuItem = new MenuItem(item, textService.Localize($"actions/{item.Alias}"))
|
||||
@@ -7,11 +7,6 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class ConfigsFactory : IConfigsFactory
|
||||
{
|
||||
|
||||
public ConfigsFactory()
|
||||
{
|
||||
}
|
||||
|
||||
public IHostingSettings HostingSettings { get; } = new HostingSettings();
|
||||
|
||||
public ICoreDebug CoreDebug { get; } = new CoreDebug();
|
||||
@@ -32,7 +27,7 @@ namespace Umbraco.Core.Configuration
|
||||
configs.AddPasswordConfigurations();
|
||||
|
||||
configs.Add(() => CoreDebug);
|
||||
configs.Add<IConnectionStrings>(() => new ConnectionStrings());
|
||||
configs.Add<IConnectionStrings>(() => new ConnectionStrings(ioHelper));
|
||||
configs.AddCoreConfigs(ioHelper);
|
||||
return configs;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,13 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class ConnectionStrings : IConnectionStrings
|
||||
{
|
||||
private readonly IIOHelper _ioHelper;
|
||||
|
||||
public ConnectionStrings(IIOHelper ioHelper)
|
||||
{
|
||||
_ioHelper = ioHelper;
|
||||
}
|
||||
|
||||
public ConfigConnectionString this[string key]
|
||||
{
|
||||
get
|
||||
@@ -17,5 +24,22 @@ namespace Umbraco.Core.Configuration
|
||||
return new ConfigConnectionString(settings.ConnectionString, settings.ProviderName, settings.Name);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveConnectionString(string key)
|
||||
{
|
||||
var fileName = _ioHelper.MapPath(string.Format("{0}/web.config", _ioHelper.Root));
|
||||
var xml = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
|
||||
|
||||
var appSettings = xml.Root.DescendantsAndSelf("appSettings").Single();
|
||||
var setting = appSettings.Descendants("add").FirstOrDefault(s => s.Attribute("key").Value == key);
|
||||
|
||||
if (setting != null)
|
||||
{
|
||||
setting.Remove();
|
||||
xml.Save(fileName, SaveOptions.DisableFormatting);
|
||||
ConfigurationManager.RefreshSection("appSettings");
|
||||
}
|
||||
var settings = ConfigurationManager.ConnectionStrings[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,27 +254,7 @@ namespace Umbraco.Core.Configuration
|
||||
ConfigurationManager.RefreshSection("appSettings");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes a setting from the configuration file.
|
||||
/// </summary>
|
||||
/// <param name="key">Key of the setting to be removed.</param>
|
||||
public static void RemoveSetting(string key, IIOHelper ioHelper)
|
||||
{
|
||||
var fileName = ioHelper.MapPath(string.Format("{0}/web.config", ioHelper.Root));
|
||||
var xml = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
|
||||
|
||||
var appSettings = xml.Root.DescendantsAndSelf("appSettings").Single();
|
||||
var setting = appSettings.Descendants("add").FirstOrDefault(s => s.Attribute("key").Value == key);
|
||||
|
||||
if (setting != null)
|
||||
{
|
||||
setting.Remove();
|
||||
xml.Save(fileName, SaveOptions.DisableFormatting);
|
||||
ConfigurationManager.RefreshSection("appSettings");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the time out in minutes.
|
||||
/// </summary>
|
||||
|
||||
-2
@@ -4,10 +4,8 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Events;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Cache
|
||||
{
|
||||
-2
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Events;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models;
|
||||
@@ -9,7 +8,6 @@ using Umbraco.Core.Models.Membership;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Services.Changes;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.Web.Services;
|
||||
|
||||
namespace Umbraco.Web.Cache
|
||||
{
|
||||
+1
-1
@@ -11,7 +11,7 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
[InstallSetupStep(InstallationType.NewInstall,
|
||||
"DatabaseConfigure", "database", 10, "Setting up a database, so Umbraco has a place to store your website",
|
||||
PerformsAppRestart = true)]
|
||||
internal class DatabaseConfigureStep : InstallSetupStep<DatabaseModel>
|
||||
public class DatabaseConfigureStep : InstallSetupStep<DatabaseModel>
|
||||
{
|
||||
private readonly DatabaseBuilder _databaseBuilder;
|
||||
private readonly ILogger _logger;
|
||||
+14
-7
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Threading.Tasks;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
@@ -13,19 +12,21 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
{
|
||||
[InstallSetupStep(InstallationType.NewInstall | InstallationType.Upgrade,
|
||||
"DatabaseInstall", 11, "")]
|
||||
internal class DatabaseInstallStep : InstallSetupStep<object>
|
||||
public class DatabaseInstallStep : InstallSetupStep<object>
|
||||
{
|
||||
private readonly DatabaseBuilder _databaseBuilder;
|
||||
private readonly IRuntimeState _runtime;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IIOHelper _ioHelper;
|
||||
private readonly IConnectionStrings _connectionStrings;
|
||||
|
||||
public DatabaseInstallStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IIOHelper ioHelper)
|
||||
public DatabaseInstallStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IIOHelper ioHelper, IConnectionStrings connectionStrings)
|
||||
{
|
||||
_databaseBuilder = databaseBuilder;
|
||||
_runtime = runtime;
|
||||
_logger = logger;
|
||||
_ioHelper = ioHelper;
|
||||
_connectionStrings = connectionStrings;
|
||||
}
|
||||
|
||||
public override Task<InstallSetupResult> ExecuteAsync(object model)
|
||||
@@ -42,7 +43,7 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
|
||||
if (result.RequiresUpgrade == false)
|
||||
{
|
||||
HandleConnectionStrings(_logger, _ioHelper);
|
||||
HandleConnectionStrings(_logger, _ioHelper, _connectionStrings);
|
||||
return Task.FromResult<InstallSetupResult>(null);
|
||||
}
|
||||
|
||||
@@ -53,12 +54,18 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
}));
|
||||
}
|
||||
|
||||
internal static void HandleConnectionStrings(ILogger logger, IIOHelper ioHelper)
|
||||
internal static void HandleConnectionStrings(ILogger logger, IIOHelper ioHelper, IConnectionStrings connectionStrings)
|
||||
{
|
||||
|
||||
|
||||
var databaseSettings = connectionStrings[Constants.System.UmbracoConnectionName];
|
||||
|
||||
|
||||
|
||||
// Remove legacy umbracoDbDsn configuration setting if it exists and connectionstring also exists
|
||||
if (ConfigurationManager.ConnectionStrings[Constants.System.UmbracoConnectionName] != null)
|
||||
if (databaseSettings != null)
|
||||
{
|
||||
GlobalSettings.RemoveSetting(Constants.System.UmbracoConnectionName, ioHelper);
|
||||
connectionStrings.RemoveConnectionString(Constants.System.UmbracoConnectionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
+2
-3
@@ -7,7 +7,6 @@ using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Migrations.Install;
|
||||
using Umbraco.Core.Migrations.Upgrade;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.Install.Models;
|
||||
using Umbraco.Web.Migrations.PostMigrations;
|
||||
|
||||
@@ -15,7 +14,7 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
{
|
||||
[InstallSetupStep(InstallationType.Upgrade | InstallationType.NewInstall,
|
||||
"DatabaseUpgrade", 12, "")]
|
||||
internal class DatabaseUpgradeStep : InstallSetupStep<object>
|
||||
public class DatabaseUpgradeStep : InstallSetupStep<object>
|
||||
{
|
||||
private readonly DatabaseBuilder _databaseBuilder;
|
||||
private readonly IRuntimeState _runtime;
|
||||
@@ -56,7 +55,7 @@ namespace Umbraco.Web.Install.InstallSteps
|
||||
throw new InstallException("The database failed to upgrade. ERROR: " + result.Message);
|
||||
}
|
||||
|
||||
DatabaseInstallStep.HandleConnectionStrings(_logger, _ioHelper);
|
||||
DatabaseInstallStep.HandleConnectionStrings(_logger, _ioHelper, _connectionStrings);
|
||||
}
|
||||
|
||||
return Task.FromResult<InstallSetupResult>(null);
|
||||
@@ -23,6 +23,8 @@ using Umbraco.Core.Sync;
|
||||
using Umbraco.Web.Models.PublishedContent;
|
||||
using Umbraco.Web.PublishedCache;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.Install;
|
||||
using Umbraco.Web.Trees;
|
||||
using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidator;
|
||||
|
||||
namespace Umbraco.Core.Runtime
|
||||
@@ -54,6 +56,8 @@ namespace Umbraco.Core.Runtime
|
||||
composition.RegisterUnique<IScopeAccessor>(f => f.GetInstance<ScopeProvider>());
|
||||
|
||||
composition.RegisterUnique<IJsonSerializer, JsonNetSerializer>();
|
||||
composition.RegisterUnique<IMenuItemCollectionFactory, MenuItemCollectionFactory>();
|
||||
composition.RegisterUnique<InstallStatusTracker>();
|
||||
|
||||
// register database builder
|
||||
// *not* a singleton, don't want to keep it around
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Composing;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
|
||||
namespace Umbraco.Web.Models.Trees
|
||||
@@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Trees
|
||||
/// <param name="parentId">The parent id for the current node</param>
|
||||
/// <param name="getChildNodesUrl"></param>
|
||||
/// <param name="menuUrl"></param>
|
||||
internal TreeNode(string nodeId, string parentId, string getChildNodesUrl, string menuUrl)
|
||||
public TreeNode(string nodeId, string parentId, string getChildNodesUrl, string menuUrl)
|
||||
{
|
||||
if (nodeId == null) throw new ArgumentNullException(nameof(nodeId));
|
||||
if (string.IsNullOrWhiteSpace(nodeId)) throw new ArgumentException("Value can't be empty or consist only of white-space characters.", nameof(nodeId));
|
||||
@@ -55,7 +55,9 @@ using Umbraco.Core.Models.Identity;
|
||||
using Umbraco.Core.Security;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Net;
|
||||
using Umbraco.Web.Install;
|
||||
using Umbraco.Web.Security;
|
||||
using Umbraco.Web.Trees;
|
||||
using Current = Umbraco.Web.Composing.Current;
|
||||
namespace Umbraco.Tests.Testing
|
||||
{
|
||||
@@ -412,6 +414,8 @@ namespace Umbraco.Tests.Testing
|
||||
Composition.RegisterUnique<IExamineManager, ExamineManager>();
|
||||
|
||||
Composition.RegisterUnique<IJsonSerializer, JsonNetSerializer>();
|
||||
Composition.RegisterUnique<IMenuItemCollectionFactory, MenuItemCollectionFactory>();
|
||||
Composition.RegisterUnique<InstallStatusTracker>();
|
||||
|
||||
// register filesystems
|
||||
Composition.RegisterUnique(factory => TestObjects.GetFileSystemsMock());
|
||||
|
||||
@@ -27,6 +27,7 @@ using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.PublishedCache;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.Services;
|
||||
using Umbraco.Web.Trees;
|
||||
using Umbraco.Web.WebApi;
|
||||
|
||||
namespace Umbraco.Web.Composing
|
||||
@@ -260,6 +261,7 @@ namespace Umbraco.Web.Composing
|
||||
public static IIpResolver IpResolver => Factory.GetInstance<IIpResolver>();
|
||||
public static IUmbracoVersion UmbracoVersion => Factory.GetInstance<IUmbracoVersion>();
|
||||
public static IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance<IPublishedUrlProvider>();
|
||||
public static IMenuItemCollectionFactory MenuItemCollectionFactory => Factory.GetInstance<IMenuItemCollectionFactory>();
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -20,13 +20,15 @@ namespace Umbraco.Web.Install.Controllers
|
||||
private readonly DatabaseBuilder _databaseBuilder;
|
||||
private readonly IProfilingLogger _proflog;
|
||||
private readonly InstallStepCollection _installSteps;
|
||||
private readonly InstallStatusTracker _installStatusTracker;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public InstallApiController(DatabaseBuilder databaseBuilder, IProfilingLogger proflog, InstallHelper installHelper, InstallStepCollection installSteps)
|
||||
public InstallApiController(DatabaseBuilder databaseBuilder, IProfilingLogger proflog, InstallHelper installHelper, InstallStepCollection installSteps, InstallStatusTracker installStatusTracker)
|
||||
{
|
||||
_databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder));
|
||||
_proflog = proflog ?? throw new ArgumentNullException(nameof(proflog));
|
||||
_installSteps = installSteps;
|
||||
_installStatusTracker = installStatusTracker;
|
||||
InstallHelper = installHelper;
|
||||
_logger = _proflog;
|
||||
}
|
||||
@@ -56,7 +58,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
steps.AddRange(installSteps);
|
||||
setup.Steps = steps;
|
||||
|
||||
InstallStatusTracker.Initialize(setup.InstallId, installSteps);
|
||||
_installStatusTracker.Initialize(setup.InstallId, installSteps);
|
||||
|
||||
return setup;
|
||||
}
|
||||
@@ -78,7 +80,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
//there won't be any statuses returned if the app pool has restarted so we need to re-read from file.
|
||||
if (status.Any() == false)
|
||||
{
|
||||
status = InstallStatusTracker.InitializeFromFile(installModel.InstallId).ToArray();
|
||||
status = _installStatusTracker.InitializeFromFile(installModel.InstallId).ToArray();
|
||||
}
|
||||
|
||||
//create a new queue of the non-finished ones
|
||||
@@ -95,7 +97,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
if (StepRequiresExecution(step, instruction) == false)
|
||||
{
|
||||
// set this as complete and continue
|
||||
InstallStatusTracker.SetComplete(installModel.InstallId, item.Name);
|
||||
_installStatusTracker.SetComplete(installModel.InstallId, item.Name);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -104,7 +106,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
var setupData = await ExecuteStepAsync(step, instruction);
|
||||
|
||||
// update the status
|
||||
InstallStatusTracker.SetComplete(installModel.InstallId, step.Name, setupData?.SavedStepData);
|
||||
_installStatusTracker.SetComplete(installModel.InstallId, step.Name, setupData?.SavedStepData);
|
||||
|
||||
// determine's the next step in the queue and dequeue's any items that don't need to execute
|
||||
var nextStep = IterateSteps(step, queue, installModel.InstallId, installModel);
|
||||
@@ -147,7 +149,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
InstallStatusTracker.Reset();
|
||||
_installStatusTracker.Reset();
|
||||
return new InstallProgressResultModel(true, "", "");
|
||||
}
|
||||
|
||||
@@ -175,7 +177,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
var step = _installSteps.GetAllSteps().Single(x => x.Name == item.Name);
|
||||
|
||||
// if this step has any instructions then extract them
|
||||
JToken instruction;
|
||||
object instruction;
|
||||
installModel.Instructions.TryGetValue(item.Name, out instruction); // else null
|
||||
|
||||
// if the step requires execution then return its name
|
||||
@@ -187,7 +189,7 @@ namespace Umbraco.Web.Install.Controllers
|
||||
queue.Dequeue();
|
||||
|
||||
// complete
|
||||
InstallStatusTracker.SetComplete(installId, step.Name);
|
||||
_installStatusTracker.SetComplete(installId, step.Name);
|
||||
|
||||
// and continue
|
||||
current = step;
|
||||
@@ -197,9 +199,9 @@ namespace Umbraco.Web.Install.Controllers
|
||||
}
|
||||
|
||||
// determines whether the step requires execution
|
||||
internal bool StepRequiresExecution(InstallSetupStep step, JToken instruction)
|
||||
internal bool StepRequiresExecution(InstallSetupStep step, object instruction)
|
||||
{
|
||||
var model = instruction?.ToObject(step.StepType);
|
||||
var model = Convert.ChangeType(instruction, step.StepType);
|
||||
var genericStepType = typeof(InstallSetupStep<>);
|
||||
Type[] typeArgs = { step.StepType };
|
||||
var typedStepType = genericStepType.MakeGenericType(typeArgs);
|
||||
@@ -216,11 +218,11 @@ namespace Umbraco.Web.Install.Controllers
|
||||
}
|
||||
|
||||
// executes the step
|
||||
internal async Task<InstallSetupResult> ExecuteStepAsync(InstallSetupStep step, JToken instruction)
|
||||
internal async Task<InstallSetupResult> ExecuteStepAsync(InstallSetupStep step, object instruction)
|
||||
{
|
||||
using (_proflog.TraceDuration<InstallApiController>($"Executing installation step: '{step.Name}'.", "Step completed"))
|
||||
{
|
||||
var model = instruction?.ToObject(step.StepType);
|
||||
var model = Convert.ChangeType(instruction, step.StepType);
|
||||
var genericStepType = typeof(InstallSetupStep<>);
|
||||
Type[] typeArgs = { step.StepType };
|
||||
var typedStepType = genericStepType.MakeGenericType(typeArgs);
|
||||
|
||||
@@ -7,7 +7,7 @@ using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Install;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.PublishedCache;
|
||||
|
||||
namespace Umbraco.Web.Install
|
||||
{
|
||||
@@ -21,11 +21,13 @@ namespace Umbraco.Web.Install
|
||||
private readonly string[] _permissionFiles = { };
|
||||
private readonly IGlobalSettings _globalSettings;
|
||||
private readonly IIOHelper _ioHelper;
|
||||
private readonly IPublishedSnapshotService _publishedSnapshotService;
|
||||
|
||||
public FilePermissionHelper(IGlobalSettings globalSettings, IIOHelper ioHelper)
|
||||
public FilePermissionHelper(IGlobalSettings globalSettings, IIOHelper ioHelper, IPublishedSnapshotService publishedSnapshotService)
|
||||
{
|
||||
_globalSettings = globalSettings;
|
||||
_ioHelper = ioHelper;
|
||||
_publishedSnapshotService = publishedSnapshotService;
|
||||
_permissionDirs = new[] { _globalSettings.UmbracoCssPath, Constants.SystemDirectories.Config, Constants.SystemDirectories.Data, _globalSettings.UmbracoMediaPath, Constants.SystemDirectories.Preview };
|
||||
_packagesPermissionsDirs = new[] { Constants.SystemDirectories.Bin, _globalSettings.UmbracoPath, Constants.SystemDirectories.Packages };
|
||||
}
|
||||
@@ -48,7 +50,7 @@ namespace Umbraco.Web.Install
|
||||
if (TestPublishedSnapshotService(out errors) == false)
|
||||
report["Published snapshot environment check failed"] = errors.ToList();
|
||||
|
||||
if (EnsureCanCreateSubDirectory(Current.Configs.Global().UmbracoMediaPath, out errors) == false)
|
||||
if (EnsureCanCreateSubDirectory(_globalSettings.UmbracoMediaPath, out errors) == false)
|
||||
report["Media folder creation failed"] = errors.ToList();
|
||||
}
|
||||
|
||||
@@ -129,8 +131,7 @@ namespace Umbraco.Web.Install
|
||||
|
||||
public bool TestPublishedSnapshotService(out IEnumerable<string> errors)
|
||||
{
|
||||
var publishedSnapshotService = Current.PublishedSnapshotService;
|
||||
return publishedSnapshotService.EnsureEnvironment(out errors);
|
||||
return _publishedSnapshotService.EnsureEnvironment(out errors);
|
||||
}
|
||||
|
||||
// tries to create a sub-directory
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Web.Install
|
||||
{
|
||||
private static HttpClient _httpClient;
|
||||
private readonly DatabaseBuilder _databaseBuilder;
|
||||
private readonly HttpContextBase _httpContext;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IGlobalSettings _globalSettings;
|
||||
private readonly IUmbracoVersion _umbracoVersion;
|
||||
@@ -29,7 +29,7 @@ namespace Umbraco.Web.Install
|
||||
DatabaseBuilder databaseBuilder,
|
||||
ILogger logger, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion, IConnectionStrings connectionStrings)
|
||||
{
|
||||
_httpContext = httpContextAccessor.HttpContext;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_logger = logger;
|
||||
_globalSettings = globalSettings;
|
||||
_umbracoVersion = umbracoVersion;
|
||||
@@ -42,16 +42,18 @@ namespace Umbraco.Web.Install
|
||||
return _installationType ?? (_installationType = IsBrandNewInstall ? InstallationType.NewInstall : InstallationType.Upgrade).Value;
|
||||
}
|
||||
|
||||
internal void InstallStatus(bool isCompleted, string errorMsg)
|
||||
public void InstallStatus(bool isCompleted, string errorMsg)
|
||||
{
|
||||
|
||||
var httpContext = _httpContextAccessor.HttpContext;
|
||||
try
|
||||
{
|
||||
var userAgent = _httpContext.Request.UserAgent;
|
||||
var userAgent = httpContext.Request.UserAgent;
|
||||
|
||||
// Check for current install Id
|
||||
var installId = Guid.NewGuid();
|
||||
|
||||
var installCookie = _httpContext.Request.GetCookieValue(Constants.Web.InstallerCookieName);
|
||||
var installCookie = httpContext.Request.GetCookieValue(Constants.Web.InstallerCookieName);
|
||||
if (string.IsNullOrEmpty(installCookie) == false)
|
||||
{
|
||||
if (Guid.TryParse(installCookie, out installId))
|
||||
@@ -61,7 +63,7 @@ namespace Umbraco.Web.Install
|
||||
installId = Guid.NewGuid();
|
||||
}
|
||||
}
|
||||
_httpContext.Response.Cookies.Set(new HttpCookie(Constants.Web.InstallerCookieName, "1"));
|
||||
httpContext.Response.Cookies.Set(new HttpCookie(Constants.Web.InstallerCookieName, "1"));
|
||||
|
||||
var dbProvider = string.Empty;
|
||||
if (IsBrandNewInstall == false)
|
||||
@@ -134,7 +136,7 @@ namespace Umbraco.Web.Install
|
||||
}
|
||||
}
|
||||
|
||||
internal IEnumerable<Package> GetStarterKits()
|
||||
public IEnumerable<Package> GetStarterKits()
|
||||
{
|
||||
if (_httpClient == null)
|
||||
_httpClient = new HttpClient();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using Umbraco.Core.Security;
|
||||
|
||||
|
||||
namespace Umbraco.Web.Security
|
||||
{
|
||||
|
||||
@@ -1,11 +1,18 @@
|
||||
using System.Linq;
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.Entities;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
|
||||
@@ -23,6 +30,24 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public class ContentBlueprintTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public ContentBlueprintTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
|
||||
{
|
||||
@@ -89,7 +114,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace Umbraco.Web.Trees
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly ActionCollection _actions;
|
||||
private readonly IGlobalSettings _globalSettings;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
protected override int RecycleBinId => Constants.System.RecycleBinContent;
|
||||
|
||||
@@ -64,12 +65,14 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider, menuItemCollectionFactory)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_actions = actions;
|
||||
_globalSettings = globalSettings;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -133,7 +136,7 @@ namespace Umbraco.Web.Trees
|
||||
{
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
// if the user's start node is not the root then the only menu item to display is refresh
|
||||
if (UserStartNodes.Contains(Constants.System.Root) == false)
|
||||
@@ -184,7 +187,7 @@ namespace Umbraco.Web.Trees
|
||||
//if the user has no path access for this node, all they can do is refresh
|
||||
if (!Security.CurrentUser.HasContentPathAccess(item, Services.EntityService))
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
menu.Items.Add(new RefreshNode(Services.TextService, true));
|
||||
return menu;
|
||||
}
|
||||
@@ -246,7 +249,7 @@ namespace Umbraco.Web.Trees
|
||||
/// <returns></returns>
|
||||
protected MenuItemCollection GetAllNodeMenuItems(IUmbracoEntity item)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
AddActionNode<ActionNew>(item, menu, opensDialog: true);
|
||||
AddActionNode<ActionDelete>(item, menu, opensDialog: true);
|
||||
AddActionNode<ActionCreateBlueprintFromContent>(item, menu, opensDialog: true);
|
||||
@@ -282,7 +285,7 @@ namespace Umbraco.Web.Trees
|
||||
/// <returns></returns>
|
||||
protected MenuItemCollection GetNodeMenuItemsForDeletedContent(IUmbracoEntity item)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
menu.Items.Add<ActionRestore>(Services.TextService, opensDialog: true);
|
||||
menu.Items.Add<ActionMove>(Services.TextService, opensDialog: true);
|
||||
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
|
||||
|
||||
@@ -28,6 +28,8 @@ namespace Umbraco.Web.Trees
|
||||
{
|
||||
public abstract class ContentTreeControllerBase : TreeController
|
||||
{
|
||||
public IMenuItemCollectionFactory MenuItemCollectionFactory { get; }
|
||||
|
||||
|
||||
protected ContentTreeControllerBase(
|
||||
IGlobalSettings globalSettings,
|
||||
@@ -39,9 +41,11 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
MenuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected ContentTreeControllerBase()
|
||||
@@ -430,7 +434,7 @@ namespace Umbraco.Web.Trees
|
||||
deleteAllowed = perms.FirstOrDefault(x => x.Contains(deleteAction.Letter)) != null;
|
||||
}
|
||||
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = MenuItemCollectionFactory.Create();
|
||||
// only add empty recycle bin if the current user is allowed to delete by default
|
||||
if (deleteAllowed)
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@ namespace Umbraco.Web.Trees
|
||||
public class ContentTypeTreeController : TreeController, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public ContentTypeTreeController(
|
||||
UmbracoTreeSearcher treeSearcher,
|
||||
@@ -39,10 +40,12 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
|
||||
@@ -103,7 +106,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace Umbraco.Web.Trees
|
||||
public class DataTypeTreeController : TreeController, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public DataTypeTreeController(
|
||||
UmbracoTreeSearcher treeSearcher,
|
||||
@@ -41,10 +42,12 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
|
||||
@@ -128,7 +131,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -2,9 +2,16 @@
|
||||
using System.Linq;
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
@@ -21,6 +28,25 @@ namespace Umbraco.Web.Trees
|
||||
[Tree(Constants.Applications.Translation, Constants.Trees.Dictionary, TreeGroup = Constants.Trees.Groups.Settings)]
|
||||
public class DictionaryTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public DictionaryTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
|
||||
{
|
||||
var root = base.CreateRootNode(queryStrings);
|
||||
@@ -100,7 +126,7 @@ namespace Umbraco.Web.Trees
|
||||
/// <returns></returns>
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
menu.Items.Add<ActionNew>(Services.TextService, opensDialog: true);
|
||||
|
||||
|
||||
@@ -4,14 +4,46 @@ using System.Linq;
|
||||
using System.Net.Http.Formatting;
|
||||
using System.Web;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Routing;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
{
|
||||
public abstract class FileSystemTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
protected FileSystemTreeController()
|
||||
{
|
||||
_menuItemCollectionFactory = Current.MenuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected FileSystemTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected abstract IFileSystem FileSystem { get; }
|
||||
protected abstract string[] Extensions { get; }
|
||||
protected abstract string FileIcon { get; }
|
||||
@@ -88,7 +120,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected virtual MenuItemCollection GetMenuForRootNode(FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
//set the default to create
|
||||
menu.DefaultMenuAlias = ActionNew.ActionAlias;
|
||||
@@ -102,7 +134,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected virtual MenuItemCollection GetMenuForFolder(string path, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
//set the default to create
|
||||
menu.DefaultMenuAlias = ActionNew.ActionAlias;
|
||||
@@ -126,7 +158,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected virtual MenuItemCollection GetMenuForFile(string path, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
//if it's not a directory then we only allow to delete the item
|
||||
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
|
||||
@@ -142,7 +174,7 @@ namespace Umbraco.Web.Trees
|
||||
return GetMenuForRootNode(queryStrings);
|
||||
}
|
||||
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
var path = string.IsNullOrEmpty(id) == false && id != Constants.System.RootString
|
||||
? HttpUtility.UrlDecode(id).TrimStart("/")
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
using System.Linq;
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Routing;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
@@ -15,6 +22,25 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public class MacrosTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public MacrosTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
|
||||
{
|
||||
var root = base.CreateRootNode(queryStrings);
|
||||
@@ -46,7 +72,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
@@ -60,7 +86,7 @@ namespace Umbraco.Web.Trees
|
||||
}
|
||||
|
||||
var macro = Services.MacroService.GetById(int.Parse(id));
|
||||
if (macro == null) return new MenuItemCollection();
|
||||
if (macro == null) return menu;
|
||||
|
||||
//add delete option for all macros
|
||||
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
|
||||
|
||||
@@ -52,8 +52,9 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider, menuItemCollectionFactory)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
}
|
||||
@@ -99,7 +100,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection PerformGetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = MenuItemCollectionFactory.Create();
|
||||
|
||||
//set the default
|
||||
menu.DefaultMenuAlias = ActionNew.ActionAlias;
|
||||
|
||||
@@ -27,6 +27,7 @@ namespace Umbraco.Web.Trees
|
||||
public class MediaTypeTreeController : TreeController, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public MediaTypeTreeController(
|
||||
UmbracoTreeSearcher treeSearcher,
|
||||
@@ -39,10 +40,12 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
|
||||
@@ -87,7 +90,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,12 @@ using System.Net.Http.Formatting;
|
||||
using System.Web.Http;
|
||||
using System.Web.Http.ModelBinding;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Security;
|
||||
using Umbraco.Web.Actions;
|
||||
@@ -15,6 +20,7 @@ using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.Search;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
using Umbraco.Web.Security;
|
||||
@@ -33,12 +39,29 @@ namespace Umbraco.Web.Trees
|
||||
[SearchableTree("searchResultFormatter", "configureMemberResult")]
|
||||
public class MemberTreeController : TreeController, ISearchableTree
|
||||
{
|
||||
public MemberTreeController(UmbracoTreeSearcher treeSearcher)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
}
|
||||
|
||||
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public MemberTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
UmbracoTreeSearcher treeSearcher,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets an individual tree node
|
||||
@@ -111,7 +134,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Routing;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
{
|
||||
@@ -10,6 +18,30 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public abstract class MemberTypeAndGroupTreeControllerBase : TreeController
|
||||
{
|
||||
public IMenuItemCollectionFactory MenuItemCollectionFactory { get; }
|
||||
|
||||
protected MemberTypeAndGroupTreeControllerBase()
|
||||
{
|
||||
MenuItemCollectionFactory = Current.MenuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected MemberTypeAndGroupTreeControllerBase(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
MenuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var nodes = new TreeNodeCollection();
|
||||
@@ -19,7 +51,7 @@ namespace Umbraco.Web.Trees
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = MenuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
|
||||
@@ -13,6 +20,25 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public class PackagesTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public PackagesTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a root model for a tree
|
||||
/// </summary>
|
||||
@@ -39,7 +65,7 @@ namespace Umbraco.Web.Trees
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
//doesn't have a menu, this is a full screen app without tree nodes
|
||||
return MenuItemCollection.Empty;
|
||||
return _menuItemCollectionFactory.Create();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
|
||||
@@ -3,8 +3,14 @@ using System.Net.Http.Formatting;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Actions;
|
||||
using Umbraco.Web.Routing;
|
||||
|
||||
namespace Umbraco.Web.Trees
|
||||
{
|
||||
@@ -14,11 +20,30 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public class RelationTypeTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public RelationTypeTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
//TODO: Do not allow deleting built in types
|
||||
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
if (id == Constants.System.RootString)
|
||||
{
|
||||
@@ -32,7 +57,7 @@ namespace Umbraco.Web.Trees
|
||||
}
|
||||
|
||||
var relationType = Services.RelationService.GetRelationTypeById(int.Parse(id));
|
||||
if (relationType == null) return new MenuItemCollection();
|
||||
if (relationType == null) return menu;
|
||||
|
||||
menu.Items.Add<ActionDelete>(Services.TextService);
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace Umbraco.Web.Trees
|
||||
public class TemplatesTreeController : TreeController, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public TemplatesTreeController(
|
||||
UmbracoTreeSearcher treeSearcher,
|
||||
@@ -41,10 +42,12 @@ namespace Umbraco.Web.Trees
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider)
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_treeSearcher = treeSearcher;
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
|
||||
@@ -97,7 +100,7 @@ namespace Umbraco.Web.Trees
|
||||
/// <returns></returns>
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
var menu = new MenuItemCollection();
|
||||
var menu = _menuItemCollectionFactory.Create();
|
||||
|
||||
//Create the normal create action
|
||||
var item = menu.Items.Add<ActionNew>(Services.TextService, opensDialog: true);
|
||||
@@ -112,7 +115,7 @@ namespace Umbraco.Web.Trees
|
||||
}
|
||||
|
||||
var template = Services.FileService.GetTemplate(int.Parse(id));
|
||||
if (template == null) return new MenuItemCollection();
|
||||
if (template == null) return menu;
|
||||
var entity = FromTemplate(template);
|
||||
|
||||
//don't allow delete if it has child layouts
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
using System.Net.Http.Formatting;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Models.Trees;
|
||||
using Umbraco.Web.Mvc;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
using Constants = Umbraco.Core.Constants;
|
||||
|
||||
@@ -13,6 +20,25 @@ namespace Umbraco.Web.Trees
|
||||
[CoreTree]
|
||||
public class UserTreeController : TreeController
|
||||
{
|
||||
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
|
||||
|
||||
public UserTreeController(
|
||||
IGlobalSettings globalSettings,
|
||||
IUmbracoContextAccessor umbracoContextAccessor,
|
||||
ISqlContext sqlContext,
|
||||
ServiceContext services,
|
||||
AppCaches appCaches,
|
||||
IProfilingLogger logger,
|
||||
IRuntimeState runtimeState,
|
||||
UmbracoHelper umbracoHelper,
|
||||
UmbracoMapper umbracoMapper,
|
||||
IPublishedUrlProvider publishedUrlProvider,
|
||||
IMenuItemCollectionFactory menuItemCollectionFactory)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
|
||||
{
|
||||
_menuItemCollectionFactory = menuItemCollectionFactory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a root model for a tree
|
||||
/// </summary>
|
||||
@@ -38,7 +64,7 @@ namespace Umbraco.Web.Trees
|
||||
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
|
||||
{
|
||||
//doesn't have a menu, this is a full screen app without tree nodes
|
||||
return MenuItemCollection.Empty;
|
||||
return _menuItemCollectionFactory.Create();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,17 +134,16 @@
|
||||
</Compile>
|
||||
<Compile Include="AppBuilderExtensions.cs" />
|
||||
<Compile Include="AreaRegistrationContextExtensions.cs" />
|
||||
<Compile Include="Cache\DistributedCacheBinder.cs" />
|
||||
<Compile Include="Cache\DistributedCacheBinderComposer.cs" />
|
||||
<Compile Include="Cache\DistributedCacheBinder_Handlers.cs" />
|
||||
<Compile Include="AspNet\AspNetHostingEnvironment.cs" />
|
||||
<Compile Include="AspNet\FrameworkMarchal.cs" />
|
||||
<Compile Include="Cache\WebCachingAppCache.cs" />
|
||||
<Compile Include="Compose\AuditEventsComponent.cs" />
|
||||
<Compile Include="Compose\AuditEventsComposer.cs" />
|
||||
<Compile Include="Compose\BackOfficeUserAuditEventsComponent.cs" />
|
||||
<Compile Include="Compose\BackOfficeUserAuditEventsComposer.cs" />
|
||||
<Compile Include="Composing\BuildManagerTypeFinder.cs" />
|
||||
<Compile Include="Composing\CompositionExtensions\Installer.cs" />
|
||||
<Compile Include="Composing\LightInject\LightInjectContainer.cs" />
|
||||
<Compile Include="Compose\BackOfficeUserAuditEventsComponent.cs" />
|
||||
<Compile Include="Editors\BackOfficePreviewModel.cs" />
|
||||
<Compile Include="Editors\Filters\ContentSaveModelValidator.cs" />
|
||||
<Compile Include="Editors\Filters\MediaSaveModelValidator.cs" />
|
||||
@@ -154,12 +153,11 @@
|
||||
<Compile Include="Editors\MacrosController.cs" />
|
||||
<Compile Include="Editors\RelationTypeController.cs" />
|
||||
<Compile Include="Editors\TinyMceController.cs" />
|
||||
<Compile Include="FrameworkMarchal.cs" />
|
||||
<Compile Include="Hosting\AspNetHostingEnvironment.cs" />
|
||||
<Compile Include="HttpContextExtensions.cs" />
|
||||
<Compile Include="ImageCropperTemplateCoreExtensions.cs" />
|
||||
<Compile Include="IUmbracoContextFactory.cs" />
|
||||
<Compile Include="Install\ChangesMonitor.cs" />
|
||||
<Compile Include="Install\InstallSteps\StarterKitDownloadStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\StarterKitInstallStep.cs" />
|
||||
<Compile Include="Logging\OwinLogger.cs" />
|
||||
<Compile Include="Logging\OwinLoggerFactory.cs" />
|
||||
<Compile Include="Logging\WebProfiler.cs" />
|
||||
@@ -178,22 +176,17 @@
|
||||
<Compile Include="Models\Mapping\MediaMapDefinition.cs" />
|
||||
<Compile Include="Models\Mapping\MemberMapDefinition.cs" />
|
||||
<Compile Include="Models\Membership\UmbracoMembershipMember.cs" />
|
||||
<Compile Include="Models\Trees\MenuItemCollection.cs" />
|
||||
<Compile Include="Models\Trees\MenuItemList.cs" />
|
||||
<Compile Include="Models\Trees\TreeNodeCollection.cs" />
|
||||
<Compile Include="Models\Trees\TreeNodeExtensions.cs" />
|
||||
<Compile Include="Models\Trees\TreeRootNode.cs" />
|
||||
<Compile Include="Mvc\HttpUmbracoFormRouteStringException.cs" />
|
||||
<Compile Include="Mvc\ModelBindingExceptionFilter.cs" />
|
||||
<Compile Include="Mvc\StatusCodeFilterAttribute.cs" />
|
||||
<Compile Include="Mvc\SurfaceControllerTypeCollectionBuilder.cs" />
|
||||
<Compile Include="Mvc\ValidateUmbracoFormRouteStringAttribute.cs" />
|
||||
<Compile Include="Net\AspNetBackOfficeInfo.cs" />
|
||||
<Compile Include="Net\AspNetCookieManager.cs" />
|
||||
<Compile Include="Net\AspNetHttpContextAccessor.cs" />
|
||||
<Compile Include="Net\AspNetIpResolver.cs" />
|
||||
<Compile Include="Net\AspNetPasswordHasher.cs" />
|
||||
<Compile Include="Net\AspNetSessionIdResolver.cs" />
|
||||
<Compile Include="AspNet\AspNetBackOfficeInfo.cs" />
|
||||
<Compile Include="AspNet\AspNetCookieManager.cs" />
|
||||
<Compile Include="AspNet\AspNetHttpContextAccessor.cs" />
|
||||
<Compile Include="AspNet\AspNetIpResolver.cs" />
|
||||
<Compile Include="AspNet\AspNetPasswordHasher.cs" />
|
||||
<Compile Include="AspNet\AspNetSessionIdResolver.cs" />
|
||||
<Compile Include="Profiling\WebProfilingController.cs" />
|
||||
<Compile Include="PropertyEditors\GridPropertyEditor.cs" />
|
||||
<Compile Include="PropertyEditors\RichTextEditorPastedImages.cs" />
|
||||
@@ -222,7 +215,6 @@
|
||||
<Compile Include="Search\UmbracoTreeSearcherFields.cs" />
|
||||
<Compile Include="StringExtensions.cs" />
|
||||
<Compile Include="Trees\TreeCollectionBuilder.cs" />
|
||||
<Compile Include="Trees\TreeNode.cs" />
|
||||
<Compile Include="UmbracoContext.cs" />
|
||||
<Compile Include="UmbracoContextFactory.cs" />
|
||||
<Compile Include="Mvc\UmbracoVirtualNodeByUdiRouteHandler.cs" />
|
||||
@@ -290,9 +282,6 @@
|
||||
<Compile Include="Editors\UserGroupsController.cs" />
|
||||
<Compile Include="Editors\Filters\UserGroupValidateAttribute.cs" />
|
||||
<Compile Include="Editors\UsersController.cs" />
|
||||
<Compile Include="Features\DisabledFeatures.cs" />
|
||||
<Compile Include="Features\EnabledFeatures.cs" />
|
||||
<Compile Include="Features\UmbracoFeatures.cs" />
|
||||
<Compile Include="HybridUmbracoContextAccessor.cs" />
|
||||
<Compile Include="HttpContextUmbracoContextAccessor.cs" />
|
||||
<Compile Include="IHttpContextAccessor.cs" />
|
||||
@@ -399,30 +388,8 @@
|
||||
<Compile Include="Editors\RelationController.cs" />
|
||||
<Compile Include="GridTemplateExtensions.cs" />
|
||||
<Compile Include="Editors\TemplateQueryController.cs" />
|
||||
<Compile Include="Install\InstallException.cs" />
|
||||
<Compile Include="Install\InstallStatusTracker.cs" />
|
||||
<Compile Include="Install\InstallSteps\DatabaseConfigureStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\DatabaseInstallStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\DatabaseUpgradeStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\FilePermissionsStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\SetUmbracoVersionStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\StarterKitCleanupStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\StarterKitDownloadStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\StarterKitInstallStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\UpgradeStep.cs" />
|
||||
<Compile Include="Install\InstallSteps\NewInstallStep.cs" />
|
||||
<Compile Include="Install\Models\DatabaseModel.cs" />
|
||||
<Compile Include="Install\Models\DatabaseType.cs" />
|
||||
<Compile Include="Install\Models\InstallationType.cs" />
|
||||
<Compile Include="Install\Models\InstallInstructions.cs" />
|
||||
<Compile Include="Install\Models\InstallProgressResultModel.cs" />
|
||||
<Compile Include="Install\Models\InstallSetup.cs" />
|
||||
<Compile Include="Install\Models\InstallSetupResult.cs" />
|
||||
<Compile Include="Install\Models\InstallSetupStep.cs" />
|
||||
<Compile Include="Install\Models\InstallSetupStepAttribute.cs" />
|
||||
<Compile Include="Install\Models\InstallTrackingItem.cs" />
|
||||
<Compile Include="Install\Models\Package.cs" />
|
||||
<Compile Include="Install\Models\UserModel.cs" />
|
||||
<Compile Include="Install\UmbracoInstallArea.cs" />
|
||||
<Compile Include="Install\Controllers\InstallApiController.cs" />
|
||||
<Compile Include="Install\Controllers\InstallController.cs" />
|
||||
|
||||
@@ -10,18 +10,21 @@ using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Features;
|
||||
using Umbraco.Web.Routing;
|
||||
using Umbraco.Web.Security;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
|
||||
namespace Umbraco.Web.WebApi
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Provides a base class for Umbraco API controllers.
|
||||
/// </summary>
|
||||
/// <remarks>These controllers are NOT auto-routed.</remarks>
|
||||
[FeatureAuthorize]
|
||||
public abstract class UmbracoApiControllerBase : ApiController
|
||||
public abstract class UmbracoApiControllerBase : ApiController, IUmbracoFeature
|
||||
{
|
||||
|
||||
// note: all Umbraco controllers have two constructors: one with all dependencies, which should be used,
|
||||
|
||||
Reference in New Issue
Block a user