diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md deleted file mode 100644 index 1acc6b602b..0000000000 --- a/.github/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,93 +0,0 @@ -# Umbraco Code of Conduct - -## Preamble - -We are the friendly CMS. And our friendliness stems from our values. That's why we have set for ourselves, Umbraco HQ, and the community, five values to guide us in everything we do: - -* Trust - We believe in and empower people -* Respect - We treat others as we would like to be treated -* Open - We share our thoughts and knowledge -* Hungry - We want to do things better, best is next -* Friendly - We want to build long-lasting relationships - -With these values in mind, we want to offer the Umbraco community a code of conduct that specifies a baseline standard of behavior so that people with different social values and communication styles can work together. - -This code of conduct is based on the widely used Contributor Covenant, as described in [https://www.contributor-covenant.org/](https://www.contributor-covenant.org/) - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. - -## Our Standards -Examples of behavior that contributes to a positive environment for our community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Enforcement Responsibilities - -Community leaders (e.g. Meetup & festival organizers, moderators, maintainers, ...) are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. - -Specific enforcement steps are listed in the [Code of Conduct Enforcement Guidelines](https://github.com/umbraco/Umbraco-CMS/blob/v8/contrib/.github/CODE_OF_CONDUCT_ENFORCEMENT.md) document which is an appendix of this document, updated and maintained by the Code of Conduct Team. - -## Scope -This Code of Conduct applies within all community spaces and events supported by Umbraco HQ or using the Umbraco name. It also applies when an individual is officially representing the community in public spaces. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior, may be reported at [conduct@umbraco.com](mailto:conduct@umbraco.com). All complaints will be reviewed and investigated promptly and fairly. - -Or alternatively, you can reach out directly to any of the team members behind the address above: - -* Sebastiaan Janssen (He, Him - Languages spoken: English, Dutch, Danish(Read)) [sebastiaan@umbraco.com](mailto:sebastiaan@umbraco.com) -* Ilham Boulghallat (She, Her - Languages spoken: English, French, Arabic) [ilham@umbraco.com](mailto:ilham@umbraco.com) -* Arnold Visser (He, Him - Languages spoken: English, Dutch) [arnold@umbraco.com](mailto:arnold@umbraco.com) -* Emma Burstow (She, Her - Languages spoken: English) [ema@umbraco.com](mailto:ema@umbraco.com) - -The review process is done with full respect for the privacy and security of the reporter of any incident. - -People with a conflict of interest should exclude themselves or if necessary be excluded by the other team members. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: - -**1. Correction** -Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. - -Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. - -**2. Warning** -Community Impact: A violation through a single incident or series of actions. - -Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. - -**3. Temporary Ban** -Community Impact: A serious violation of community standards, including sustained inappropriate behavior. - -Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. - -**4. Permanent Ban** -Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. - -Consequence: A permanent ban from any sort of public interaction within the community. - -## Attribution -This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html). - -This Code of Conduct will be maintained and reviewed by the team listed above. diff --git a/.github/CODE_OF_CONDUCT_ENFORCEMENT.md b/.github/CODE_OF_CONDUCT_ENFORCEMENT.md deleted file mode 100644 index 2bb45644c2..0000000000 --- a/.github/CODE_OF_CONDUCT_ENFORCEMENT.md +++ /dev/null @@ -1,57 +0,0 @@ -# Umbraco Code of Conduct Enforcement guidelines - Consequence Ladder - -These are the steps followed by the [Umbraco Code of Conduct Team](https://github.com/umbraco/Umbraco-CMS/blob/v8/contrib/.github/CODE_OF_CONDUCT.md) when we respond to an issue or incident brought to our attention by a community member. - -This is an appendix to the Code of Conduct and is updated and maintained by the Code of Conduct Team. - -To make sure that all reports will be reviewed and investigated promptly and fairly, as highlighted in the Umbraco Code of Conduct, we are following [Mozilla’s Consequence Ladder approach](https://github.com/mozilla/inclusion/blob/master/code-of-conduct-enforcement/consequence-ladder.md). - -This approach helps the Team enforce the Code of Conduct in a structured manner and can be used as a way of communicating escalation. Each time the Team takes an action (warning, ban) the individual is made aware of future consequences. The Team can either follow the order of the levels in the ladder or decide to jump levels. When needed, the team can go directly to a permanent ban. - -**Level 0: No Action** -Recommendations do not indicate a violation of the Code of Conduct. - -**Level 1: Simple Warning Issued** -A private, written warning from the Code of Conduct Team, with clarity of violation, consequences of continued behavior. - -**Level 2: Warning** -A private, written warning from the Code of Conduct Team, with clarity of violation, consequences of continued behavior. Additionally: - -* Communication of next-level consequences if behaviors are repeated (according to this ladder). - -**Level 3: Warning + Mandatory Cooling Off Period (Access Retained)** -A private warning from the Code of Conduct Team, with clarity of violation, consequences of continued behavior. Additionally: - -* Request to avoid interaction on community messaging platforms (public forums, Our, commenting on issues). - * This includes avoiding any interactions in any Umbraco channels, spaces/offices, as well as external channels like social media (e.g. Twitter, Facebook, LinkedIn). For example, 'following/liking/retweeting' would be considered a violation of these terms, and consequence would escalate according to this ladder. -* Require they do not interact with others in the report, or those who they suspect are involved in the report. -* Suggestions for 'out of office' type of message on platforms, to reduce curiosity, or suspicion among those not involved. - -**Level 4: Temporary Ban (Access Revoked)** -Private communication of ban from the Code of Conduct Team, with clarity of violation, consequences of continued behavior. Additionally: - -* 3-6 months imposed break. -* All accounts deactivated, or blocked during this time (Our, HQ Slack if applicable). -* Require to avoid interaction on community messaging platforms (public forums, Our, commenting on issues). - * This includes avoiding any interactions in any Umbraco channels, spaces/offices, as well as external channels like social media (e.g. Twitter, Facebook, LinkedIn). For example, 'following/liking/retweeting' would be considered a violation of these terms, and consequence would escalate according to this ladder. -* All community leadership roles (e.g. Community Teams, Meetup/festival organizer, Commit right on Github..) suspended. (onboarding/reapplication required outside of this process) -* No attendance at Umbraco events during the ban period. -* Not allowed to enter Umbraco HQ offices during the ban period. -* Permission to use the MVP title, if applicable, is revoked during this ban period. -* The community leaders running events and other initiatives are informed of the ban. - -**Level 5: Permanent Ban** -Private communication of ban from the Code of Conduct Team, with clarity of violation, consequences of continued behavior. Additionally: - -* All accounts deactivated permanently. -* No attendance at Umbraco events going forward. -* Not allowed to enter Umbraco HQ offices permanently. -* All community leadership roles (e.g. Community Teams, Meetup/festival organizer, Commit right on Github..) permanently suspended. -* Permission to use the MVP title, if applicable, revoked. -* The community leaders running events and other initiatives are informed of the ban. - - -Sources: -* [Mozilla Code of Conduct - Enforcement Consequence Ladder](https://github.com/mozilla/inclusion/blob/master/code-of-conduct-enforcement/consequence-ladder.md) -* [Drupal Conflict Resolution Policy and Process](https://www.drupal.org/conflict-resolution) -* [Django Code of Conduct - Enforcement Manual](https://www.djangoproject.com/conduct/enforcement-manual/) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4cb593a39b..e8b378fb15 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,7 +10,7 @@ Remember, we're a friendly bunch and are happy with whatever contribution you mi **Code of conduct** -This project and everyone participating in it, is governed by the [our Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [Sebastiaan Janssen - sj@umbraco.dk](mailto:sj@umbraco.dk). +This project and everyone participating in it, is governed by the [our Code of Conduct](https://github.com/umbraco/.github/blob/main/.github/CODE_OF_CONDUCT.md). **Table of contents** diff --git a/.github/README.md b/.github/README.md index d4565a8cb5..5fa412cae4 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,4 +1,4 @@ -# [Umbraco CMS](https://umbraco.com) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](../LICENSE.md) [![Build status](https://umbraco.visualstudio.com/Umbraco%20Cms/_apis/build/status/Cms%208%20Continuous?branchName=v8/contrib)](https://umbraco.visualstudio.com/Umbraco%20Cms/_build?definitionId=75) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) [![Twitter](https://img.shields.io/twitter/follow/umbraco.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=umbraco) +# [Umbraco CMS](https://umbraco.com) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](../LICENSE.md) [![Build status](https://umbraco.visualstudio.com/Umbraco%20Cms/_apis/build/status/Cms%208%20Continuous?branchName=v8/contrib)](https://umbraco.visualstudio.com/Umbraco%20Cms/_build?definitionId=75) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) [![Twitter](https://img.shields.io/twitter/follow/umbraco.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=umbraco) [![Discord](https://img.shields.io/discord/869656431308189746)](https://discord.gg/umbraco) Umbraco is the friendliest, most flexible and fastest growing ASP.NET CMS, and used by more than 500,000 websites worldwide. Our mission is to help you deliver delightful digital experiences by making Umbraco friendly, simpler and social. @@ -15,7 +15,7 @@ See the official [Umbraco website](https://umbraco.com) for an introduction, cor - [Community](#join-the-umbraco-community) - [Contributing](#contributing) -Please also see our [Code of Conduct](CODE_OF_CONDUCT.md). +Please also see our [Code of Conduct](https://github.com/umbraco/.github/blob/main/.github/CODE_OF_CONDUCT.md). ## Getting Started diff --git a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets b/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets index b67f6f1c34..2ef0a44a9c 100644 --- a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets +++ b/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets @@ -29,6 +29,7 @@ @@ -55,6 +56,7 @@ @@ -82,7 +84,7 @@ - + diff --git a/src/Umbraco.Core/Composing/TypeFinder.cs b/src/Umbraco.Core/Composing/TypeFinder.cs index 07a2eb72c9..0ce78b5b84 100644 --- a/src/Umbraco.Core/Composing/TypeFinder.cs +++ b/src/Umbraco.Core/Composing/TypeFinder.cs @@ -198,7 +198,7 @@ namespace Umbraco.Cms.Core.Composing IEnumerable assemblies = null, bool onlyConcreteClasses = true) { - var assemblyList = (assemblies ?? AssembliesToScan).ToList(); + var assemblyList = assemblies ?? AssembliesToScan; return GetClassesWithBaseType(assignTypeFrom, assemblyList, onlyConcreteClasses, //the additional filter will ensure that any found types also have the attribute applied. @@ -214,7 +214,7 @@ namespace Umbraco.Cms.Core.Composing /// public IEnumerable FindClassesOfType(Type assignTypeFrom, IEnumerable assemblies = null, bool onlyConcreteClasses = true) { - var assemblyList = (assemblies ?? AssembliesToScan).ToList(); + var assemblyList = assemblies ?? AssembliesToScan; return GetClassesWithBaseType(assignTypeFrom, assemblyList, onlyConcreteClasses); } @@ -231,7 +231,7 @@ namespace Umbraco.Cms.Core.Composing IEnumerable assemblies = null, bool onlyConcreteClasses = true) { - var assemblyList = (assemblies ?? AssembliesToScan).ToList(); + var assemblyList = assemblies ?? AssembliesToScan; return GetClassesWithAttribute(attributeType, assemblyList, onlyConcreteClasses); } diff --git a/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs b/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs index 305df2be8c..297e1dff87 100644 --- a/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs @@ -12,6 +12,7 @@ namespace Umbraco.Cms.Core.Configuration.Models public class KeepAliveSettings { internal const bool StaticDisableKeepAliveTask = false; + internal const string StaticKeepAlivePingUrl = "~/api/keepalive/ping"; /// /// Gets or sets a value indicating whether the keep alive task is disabled. @@ -20,8 +21,9 @@ namespace Umbraco.Cms.Core.Configuration.Models public bool DisableKeepAliveTask { get; set; } = StaticDisableKeepAliveTask; /// - /// Gets a value for the keep alive ping URL. + /// Gets or sets a value for the keep alive ping URL. /// - public string KeepAlivePingUrl => "~/api/keepalive/ping"; + [DefaultValue(StaticKeepAlivePingUrl)] + public string KeepAlivePingUrl { get; set; } = StaticKeepAlivePingUrl; } } diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Collections.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Collections.cs index a0ff6104a7..578498de42 100644 --- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Collections.cs +++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Collections.cs @@ -118,7 +118,8 @@ namespace Umbraco.Cms.Core.DependencyInjection .Append() .Append() .Append() - .Append(); + .Append() + .Append(); builder.SearchableTrees().Add(() => builder.TypeLoader.GetTypes()); builder.BackOfficeAssets(); } diff --git a/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs b/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs index 197f6f6d63..1731907be6 100644 --- a/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs +++ b/src/Umbraco.Core/Extensions/PublishedContentExtensions.cs @@ -1082,7 +1082,7 @@ namespace Umbraco.Extensions { return content.Parent != null ? content.Parent.Children(variationContextAccessor, culture) - : publishedSnapshot.Content.GetAtRoot().WhereIsInvariantOrHasCulture(variationContextAccessor, culture); + : publishedSnapshot.Content.GetAtRoot(culture).WhereIsInvariantOrHasCulture(variationContextAccessor, culture); } /// @@ -1098,7 +1098,7 @@ namespace Umbraco.Extensions { return content.Parent != null ? content.Parent.ChildrenOfType(variationContextAccessor, contentTypeAlias, culture) - : publishedSnapshot.Content.GetAtRoot().OfTypes(contentTypeAlias).WhereIsInvariantOrHasCulture(variationContextAccessor, culture); + : publishedSnapshot.Content.GetAtRoot(culture).OfTypes(contentTypeAlias).WhereIsInvariantOrHasCulture(variationContextAccessor, culture); } /// @@ -1115,7 +1115,7 @@ namespace Umbraco.Extensions { return content.Parent != null ? content.Parent.Children(variationContextAccessor, culture) - : publishedSnapshot.Content.GetAtRoot().OfType().WhereIsInvariantOrHasCulture(variationContextAccessor, culture); + : publishedSnapshot.Content.GetAtRoot(culture).OfType().WhereIsInvariantOrHasCulture(variationContextAccessor, culture); } #endregion diff --git a/src/Umbraco.Core/Media/EmbedProviders/LottieFiles.cs b/src/Umbraco.Core/Media/EmbedProviders/LottieFiles.cs new file mode 100644 index 0000000000..938d22d37d --- /dev/null +++ b/src/Umbraco.Core/Media/EmbedProviders/LottieFiles.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Umbraco.Cms.Core.Serialization; + +namespace Umbraco.Cms.Core.Media.EmbedProviders +{ + /// + /// Embed Provider for lottiefiles.com the popular opensource JSON-based animation format platform. + /// + public class LottieFiles : OEmbedProviderBase + { + public LottieFiles(IJsonSerializer jsonSerializer) : base(jsonSerializer) + { + + } + + public override string ApiEndpoint => "https://embed.lottiefiles.com/oembed"; + + public override string[] UrlSchemeRegex => new string[] + { + @"lottiefiles\.com/*" + }; + public override Dictionary RequestParams => new Dictionary(); + + public override string GetMarkup(string url, int maxWidth = 0, int maxHeight = 0) + { + var requestUrl = base.GetEmbedProviderUrl(url, maxWidth, maxHeight); + OEmbedResponse oembed = base.GetJsonResponse(requestUrl); + var html = oembed.GetHtml(); + //LottieFiles doesn't seem to support maxwidth and maxheight via oembed + // this is therefore a hack... with regexes.. is that ok? HtmlAgility etc etc + // otherwise it always defaults to 300... + if (maxWidth > 0 && maxHeight > 0) + { + + html = Regex.Replace(html, "width=\"([0-9]{1,4})\"", "width=\"" + maxWidth + "\""); + html = Regex.Replace(html, "height=\"([0-9]{1,4})\"", "height=\"" + maxHeight + "\""); + + } + else + { + //if set to 0, let's default to 100% as an easter egg + html = Regex.Replace(html, "width=\"([0-9]{1,4})\"", "width=\"100%\""); + html = Regex.Replace(html, "height=\"([0-9]{1,4})\"", "height=\"100%\""); + } + return html; + } + + } +} diff --git a/src/Umbraco.Core/Notifications/SendingAllowedChildrenNotification.cs b/src/Umbraco.Core/Notifications/SendingAllowedChildrenNotification.cs new file mode 100644 index 0000000000..07ab3c3626 --- /dev/null +++ b/src/Umbraco.Core/Notifications/SendingAllowedChildrenNotification.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Core.Notifications +{ + public class SendingAllowedChildrenNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public IEnumerable Children { get; set; } + + public SendingAllowedChildrenNotification(IEnumerable children, IUmbracoContext umbracoContext) + { + UmbracoContext = umbracoContext; + Children = children; + } + } +} diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs index 3d8f15f6d0..8b9093c1ca 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs @@ -41,7 +41,7 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters public override PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType) => PropertyCacheLevel.Snapshot; - public override bool? IsValue(object value, PropertyValueLevel level) => value?.ToString() != "[]"; + public override bool? IsValue(object value, PropertyValueLevel level) => value != null && value.ToString() != "[]"; public override object ConvertSourceToIntermediate(IPublishedElement owner, IPublishedPropertyType propertyType, object source, bool preview) => source?.ToString(); @@ -51,7 +51,7 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters { var maxNumber = propertyType.DataType.ConfigurationAs().MaxNumber; - if (inter == null) + if (string.IsNullOrWhiteSpace(inter?.ToString())) { return maxNumber == 1 ? null : Enumerable.Empty(); } diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs index 99d22de939..8c9beb931c 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs @@ -22,6 +22,7 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Packaging; +using Umbraco.Cms.Web.BackOffice.Filters; using Umbraco.Cms.Web.Common.ActionsResults; using Umbraco.Cms.Web.Common.Attributes; using Umbraco.Cms.Web.Common.Authorization; @@ -452,6 +453,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// /// [Authorize(Policy = AuthorizationPolicies.TreeAccessDocumentsOrDocumentTypes)] + [OutgoingEditorModelEvent] public IEnumerable GetAllowedChildren(int contentId) { if (contentId == Constants.System.RecycleBinContent) diff --git a/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs b/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs index 4d0e2cfe14..6710d61d14 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Http; +using System.Net.Mime; +using System.Text; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; @@ -191,6 +193,39 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return _umbracoMapper.Map(dictionary); } + /// + /// Changes the structure for dictionary items + /// + /// + /// + public IActionResult PostMove(MoveOrCopy move) + { + var dictionaryItem = _localizationService.GetDictionaryItemById(move.Id); + if (dictionaryItem == null) + return ValidationProblem(_localizedTextService.Localize("dictionary", "itemDoesNotExists")); + + var parent = _localizationService.GetDictionaryItemById(move.ParentId); + if (parent == null) + { + if (move.ParentId == Constants.System.Root) + dictionaryItem.ParentId = null; + else + return ValidationProblem(_localizedTextService.Localize("dictionary", "parentDoesNotExists")); + } + else + { + dictionaryItem.ParentId = parent.Key; + if (dictionaryItem.Key == parent.ParentId) + return ValidationProblem(_localizedTextService.Localize("moveOrCopy", "notAllowedByPath")); + } + + _localizationService.Save(dictionaryItem); + + var model = _umbracoMapper.Map(dictionaryItem); + + return Content(model.Path, MediaTypeNames.Text.Plain, Encoding.UTF8); + } + /// /// Saves a dictionary item /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs index cd1e9037ec..66efc37f47 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs @@ -12,6 +12,7 @@ using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Web.BackOffice.Filters; using Umbraco.Cms.Web.Common.ActionsResults; using Umbraco.Cms.Web.Common.Attributes; using Umbraco.Cms.Web.Common.Authorization; @@ -339,6 +340,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// /// [Authorize(Policy = AuthorizationPolicies.TreeAccessMediaOrMediaTypes)] + [OutgoingEditorModelEvent] public IEnumerable GetAllowedChildren(int contentId) { if (contentId == Constants.System.RecycleBinContent) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs index 7c1f6f4187..724e17adb1 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs @@ -252,5 +252,19 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return display; } + + /// + /// Copy the member type + /// + /// + /// + [Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] + public IActionResult PostCopy(MoveOrCopy copy) + { + return PerformCopy( + copy, + i => _memberTypeService.Get(i), + (type, i) => _memberTypeService.Copy(type, i)); + } } } diff --git a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs index 8899499887..ed086f7ed5 100644 --- a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs +++ b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs @@ -84,6 +84,12 @@ namespace Umbraco.Cms.Web.BackOffice.Filters case IEnumerable> dashboards: _eventAggregator.Publish(new SendingDashboardsNotification(dashboards, umbracoContext)); break; + case IEnumerable allowedChildren: + // Changing the Enumerable will generate a new instance, so we need to update the context result with the new content + var notification = new SendingAllowedChildrenNotification(allowedChildren, umbracoContext); + _eventAggregator.Publish(notification); + context.Result = new ObjectResult(notification.Children); + break; } } } diff --git a/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs index c61fabfa7b..bd7db36ba1 100644 --- a/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs @@ -126,7 +126,11 @@ namespace Umbraco.Cms.Web.BackOffice.Trees menu.Items.Add(LocalizedTextService, opensDialog: true); if (id != Constants.System.RootString) + { menu.Items.Add(LocalizedTextService, true, opensDialog: true); + menu.Items.Add(LocalizedTextService, true, opensDialog: true); + } + menu.Items.Add(new RefreshNode(LocalizedTextService, true)); diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs index 0559a17a53..858a1c8184 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs @@ -26,8 +26,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, IMemberGroupService memberGroupService, - IEventAggregator eventAggregator) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) + IEventAggregator eventAggregator, + IMemberTypeService memberTypeService) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator, memberTypeService) => _memberGroupService = memberGroupService; protected override IEnumerable GetTreeNodesFromService(string id, FormCollection queryStrings) diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 94c84accab..64e8081dec 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; using Umbraco.Cms.Core.Events; @@ -8,6 +10,8 @@ using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; +using Umbraco.Cms.Web.Common.DependencyInjection; +using Umbraco.Extensions; using Constants = Umbraco.Cms.Core.Constants; namespace Umbraco.Cms.Web.BackOffice.Trees @@ -16,21 +20,46 @@ namespace Umbraco.Cms.Web.BackOffice.Trees [CoreTree] public abstract class MemberTypeAndGroupTreeControllerBase : TreeController { + private readonly IMemberTypeService _memberTypeService; + public IMenuItemCollectionFactory MenuItemCollectionFactory { get; } protected MemberTypeAndGroupTreeControllerBase( ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IEventAggregator eventAggregator) + IEventAggregator eventAggregator, + IMemberTypeService memberTypeService) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { MenuItemCollectionFactory = menuItemCollectionFactory; + + _memberTypeService = memberTypeService; + } + + [Obsolete("Use ctor injecting IMemberTypeService")] + protected MemberTypeAndGroupTreeControllerBase( + ILocalizedTextService localizedTextService, + UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, + IMenuItemCollectionFactory menuItemCollectionFactory, + IEventAggregator eventAggregator) + : this( + localizedTextService, + umbracoApiControllerTypeCollection, + menuItemCollectionFactory, + eventAggregator, + StaticServiceProvider.Instance.GetRequiredService()) + { } protected override ActionResult GetTreeNodes(string id, FormCollection queryStrings) { var nodes = new TreeNodeCollection(); + + // if the request is for folders only then just return + if (queryStrings["foldersonly"].ToString().IsNullOrWhiteSpace() == false && queryStrings["foldersonly"].ToString() == "1") + return nodes; + nodes.AddRange(GetTreeNodesFromService(id, queryStrings)); return nodes; } @@ -48,7 +77,13 @@ namespace Umbraco.Cms.Web.BackOffice.Trees } else { - //delete member type/group + var memberType = _memberTypeService.Get(int.Parse(id)); + if (memberType != null) + { + menu.Items.Add(LocalizedTextService, opensDialog: true); + } + + // delete member type/group menu.Items.Add(LocalizedTextService, opensDialog: true); } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs index 5595365e2b..318cce629d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs @@ -32,13 +32,12 @@ namespace Umbraco.Cms.Web.BackOffice.Trees UmbracoTreeSearcher treeSearcher, IMemberTypeService memberTypeService, IEventAggregator eventAggregator) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator, memberTypeService) { _treeSearcher = treeSearcher; _memberTypeService = memberTypeService; } - protected override ActionResult CreateRootNode(FormCollection queryStrings) { var rootResult = base.CreateRootNode(queryStrings); diff --git a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs index 58f66a6fb8..a62f00c54f 100644 --- a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs +++ b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs @@ -92,8 +92,6 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder { UseUmbracoCoreMiddleware(); - AppBuilder.UseStatusCodePages(); - // Important we handle image manipulations before the static files, otherwise the querystring is just ignored. AppBuilder.UseImageSharp(); diff --git a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryModelFactory.cs b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryModelFactory.cs index 44e08f0af1..419352c56c 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryModelFactory.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryModelFactory.cs @@ -799,8 +799,12 @@ namespace Umbraco.Cms.Web.Common.ModelsBuilder { if (disposing) { - _watcher.EnableRaisingEvents = false; - _watcher.Dispose(); + if (_watcher != null) + { + _watcher.EnableRaisingEvents = false; + _watcher.Dispose(); + } + _locker.Dispose(); } diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/dictionary.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/dictionary.resource.js index 3bb01fbe92..38a96fbcda 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/dictionary.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/dictionary.resource.js @@ -1,4 +1,4 @@ -/** +/** * @ngdoc service * @name umbraco.resources.dictionaryResource * @description Loads in data for dictionary items @@ -96,6 +96,48 @@ function dictionaryResource($q, $http, $location, umbRequestHelper, umbDataForma "Failed to get item " + id); } + /** + * @ngdoc method + * @name umbraco.resources.dictionaryResource#move + * @methodOf umbraco.resources.dictionaryResource + * + * @description + * Moves a dictionary item underneath a new parentId + * + * ##usage + *
+      * dictionaryResource.move({ parentId: 1244, id: 123 })
+      *    .then(function() {
+      *        alert("node was moved");
+      *    }, function(err){
+      *      alert("node didnt move:" + err.data.Message);
+      *    });
+      * 
+ * @param {Object} args arguments object + * @param {int} args.id the int of the dictionary item to move + * @param {int} args.parentId the int of the parent dictionary item to move to + * @returns {Promise} resourcePromise object. + * + */ + function move (args) { + if (!args) { + throw "args cannot be null"; + } + if (!args.parentId) { + throw "args.parentId cannot be null"; + } + if (!args.id) { + throw "args.id cannot be null"; + } + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("dictionaryApiBaseUrl", "PostMove"), + { + parentId: args.parentId, + id: args.id + }, { responseType: 'text' })); + } + /** * @ngdoc method * @name umbraco.resources.dictionaryResource#save @@ -151,6 +193,7 @@ function dictionaryResource($q, $http, $location, umbRequestHelper, umbDataForma create: create, getById: getById, save: save, + move: move, getList : getList }; diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 98543a7c68..3273b8a2fb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -1599,6 +1599,11 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s syncContent(); }); + // When the element is removed from the DOM, we need to terminate + // any active watchers to ensure scopes are disposed and do not leak. + // No need to sync content as that has already happened. + args.editor.on('remove', () => stopWatch()); + args.editor.on('ObjectResized', function (e) { var srcAttr = $(e.target).attr("src"); var path = srcAttr.split("?")[0]; diff --git a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html index a6df878997..f50722d421 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html @@ -1,20 +1,17 @@ -
+
+ ng-required="vm.required && !vm.files.length" />
+ ng-hide="vm.files.length > 0">

Click to upload

- + +
@@ -25,38 +22,31 @@ source="file.fileSrc" name="file.fileName" client-side="file.isClientSide" - client-side-data="file.fileData" - > + client-side-data="file.fileData"> +
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/move.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/move.controller.js new file mode 100644 index 0000000000..a99f09af21 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/move.controller.js @@ -0,0 +1,66 @@ +angular.module("umbraco") + .controller("Umbraco.Editors.Dictionary.MoveController", + function ($scope, dictionaryResource, treeService, navigationService, notificationsService, appState, eventsService) { + + $scope.dialogTreeApi = {}; + $scope.source = _.clone($scope.currentNode); + + function nodeSelectHandler(args) { + args.event.preventDefault(); + args.event.stopPropagation(); + + if ($scope.target) { + //un-select if there's a current one selected + $scope.target.selected = false; + } + $scope.target = args.node; + $scope.target.selected = true; + } + + $scope.move = function () { + + $scope.busy = true; + $scope.error = false; + + dictionaryResource.move({ parentId: $scope.target.id, id: $scope.source.id }) + .then(function (path) { + $scope.error = false; + $scope.success = true; + $scope.busy = false; + + //first we need to remove the node that launched the dialog + treeService.removeNode($scope.currentNode); + + //get the currently edited node (if any) + var activeNode = appState.getTreeState("selectedNode"); + + //we need to do a double sync here: first sync to the moved content - but don't activate the node, + //then sync to the currenlty edited content (note: this might not be the content that was moved!!) + + navigationService.syncTree({ tree: "dictionary", path: path, forceReload: true, activate: false }).then(function (args) { + if (activeNode) { + var activeNodePath = treeService.getPath(activeNode).join(); + //sync to this node now - depending on what was copied this might already be synced but might not be + navigationService.syncTree({ tree: "dictionary", path: activeNodePath, forceReload: false, activate: true }); + } + }); + + eventsService.emit('app.refreshEditor'); + + }, function (err) { + $scope.success = false; + $scope.error = err; + $scope.busy = false; + + }); + }; + + $scope.onTreeInit = function () { + $scope.dialogTreeApi.callbacks.treeNodeSelect(nodeSelectHandler); + }; + + $scope.close = function() { + navigationService.hideDialog(); + }; + + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/move.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/move.html new file mode 100644 index 0000000000..d8accbb5d5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/move.html @@ -0,0 +1,53 @@ +
+ +
+
+ +

+ Choose where to move {{source.name}} to in the tree structure below +

+ + + +
+
+
{{error.errorMsg}}
+
{{error.data.message}}
+
+
+ +
+
+ {{source.name}} was moved underneath {{target.name}} +
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html index 7dc3e499fe..f7e976de1e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html @@ -300,9 +300,9 @@
External sources
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js index 4b81e7c11c..f7e1590da8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js @@ -26,7 +26,7 @@ userService.getCurrentUser().then(function(user) { currentUser = user; // Get usergroups - userGroupsResource.getUserGroups({ onlyCurrentUserGroups: false }).then(function (userGroups) { + userGroupsResource.getUserGroups().then(function (userGroups) { // only allow editing and selection if user is member of the group or admin vm.userGroups = _.map(userGroups, function (ug) { diff --git a/src/Umbraco.Web.UI/appsettings.template.json b/src/Umbraco.Web.UI/appsettings.template.json index cef926fad2..2a291c5bc6 100644 --- a/src/Umbraco.Web.UI/appsettings.template.json +++ b/src/Umbraco.Web.UI/appsettings.template.json @@ -33,7 +33,7 @@ }, "KeepAlive": { "DisableKeepAliveTask": false, - "KeepAlivePingUrl": "{umbracoApplicationUrl}/api/keepalive/ping" + "KeepAlivePingUrl": "~/api/keepalive/ping" }, "RequestHandler": { "ConvertUrlsToAscii": "try" diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index bf2de30f2e..23277ee296 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -569,6 +569,8 @@ Modifying layout will result in loss of data for any existing content that is based on this configuration. + Dictionary item does not exist. + Parent item does not exist. There are no dictionary items. Create dictionary item @@ -2675,7 +2677,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create new Element Type Custom stylesheet Add stylesheet - Editor apperance + Editor appearance Data models Catalogue appearance Background color diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 873361169a..5e2935b395 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -579,6 +579,8 @@ Modifying layout will result in loss of data for any existing content that is based on this configuration. + Dictionary item does not exist. + Parent item does not exist. There are no dictionary items. Create dictionary item @@ -2760,7 +2762,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create new Element Type Custom stylesheet Add stylesheet - Editor apperance + Editor appearance Data models Catalogue appearance Background color diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml index d9ecc89673..8f94e8694d 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml @@ -82,6 +82,7 @@ Toegang toestaan om een node te vertalen Toegang toestaan om een node op te slaan Toegang toestaan om Inhoudssjabloon aan te maken + Toegang toestaan om meldingen voor content nodes aan te maken Inhoud @@ -256,6 +257,7 @@ Statistieken Titel (optioneel) Alternatieve tekst (optioneel) + Bijschrift (optioneel) Type Depubliceren Concept @@ -694,6 +696,7 @@ Wissen Sluiten Sluit venster + Sluit paneel Comment Bevestig Beperken @@ -2219,6 +2222,9 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Geen relaties voor dit relatietype. Relatietype Relaties + Is Afhankelijkheid + Ja + Nee Aan de slag diff --git a/templates/UmbracoProject/UmbracoProject.csproj b/templates/UmbracoProject/UmbracoProject.csproj index 2459c071de..30ef92a1da 100644 --- a/templates/UmbracoProject/UmbracoProject.csproj +++ b/templates/UmbracoProject/UmbracoProject.csproj @@ -26,7 +26,7 @@ true - + false false diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index fb622bbffb..478f3cc53e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -1194,9 +1194,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "ms": { diff --git a/umbraco-netcore-only.sln b/umbraco-netcore-only.sln index 80a688bde5..c34dd9e11d 100644 --- a/umbraco-netcore-only.sln +++ b/umbraco-netcore-only.sln @@ -16,7 +16,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{FD962632-1 ProjectSection(SolutionItems) = preProject .github\BUILD.md = .github\BUILD.md .github\CLEAR.md = .github\CLEAR.md - .github\CODE_OF_CONDUCT.md = .github\CODE_OF_CONDUCT.md .github\CONTRIBUTING.md = .github\CONTRIBUTING.md .github\CONTRIBUTING_DETAILED.md = .github\CONTRIBUTING_DETAILED.md .github\CONTRIBUTION_GUIDELINES.md = .github\CONTRIBUTION_GUIDELINES.md diff --git a/umbraco.sln b/umbraco.sln index 497258c699..7a6c7a04e8 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -15,7 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{FD962632-1 ProjectSection(SolutionItems) = preProject .github\BUILD.md = .github\BUILD.md .github\CLEAR.md = .github\CLEAR.md - .github\CODE_OF_CONDUCT.md = .github\CODE_OF_CONDUCT.md .github\CONTRIBUTING.md = .github\CONTRIBUTING.md .github\CONTRIBUTING_DETAILED.md = .github\CONTRIBUTING_DETAILED.md .github\CONTRIBUTION_GUIDELINES.md = .github\CONTRIBUTION_GUIDELINES.md