Compare commits

...

60 Commits

Author SHA1 Message Date
Sebastiaan Janssen 0f7de97558 Whoops, fixes previous commit for #2896
(cherry picked from commit b2b9b53af1)
2018-09-02 10:06:24 +02:00
Sebastiaan Janssen 588493e811 Seems there is no need to hide the .small class, fixes #2896
(cherry picked from commit 2dd5010d2c)
2018-09-02 09:58:34 +02:00
Ali.Taheri 87af9b2089 u4-8310 - Added error message to the xml file.
(cherry picked from commit 541e546f7b)
2018-08-31 20:07:10 +02:00
Ali.Taheri ba3cf056fb u4-8310 - Fixed rename content type with the same alias but with different casing.
(cherry picked from commit 26a8d680d4)
2018-08-31 20:07:05 +02:00
Marcel van Helmont 619acb552b added val-email to corrrectly validate emails supporting new TLD
(cherry picked from commit 74ca315197)
2018-08-31 19:53:52 +02:00
Sebastiaan Janssen 50b636e1c6 Add issue templates and updated PR template 2018-08-30 09:55:03 +02:00
Stephan cedf433bb0 U4-11599 - do not abort inst processing on error
(cherry picked from commit f2090e9fc7)
2018-08-27 08:47:11 +02:00
Sebastiaan Janssen 00c19e3830 Fixes U4-11598 Scheduling the content does not reload the page at the same time
(cherry picked from commit 46b0063921)
2018-08-27 06:56:50 +02:00
Steve Fawcett a5742dcd9a Fix: TinyMCE overlay was showing in front of login overlay
(cherry picked from commit 71d3c1112e)
2018-08-26 21:09:54 +02:00
Sebastiaan Janssen 63ee3c72c3 Merge branch 'dev-v7' into patch-v7 2018-08-26 17:53:13 +02:00
Sebastiaan Janssen 16155ea416 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2018-08-26 17:25:18 +02:00
Sebastiaan Janssen f183e27cae Merge branch 'jamescoxhead-U4-11166' into dev-v7 2018-08-26 17:24:18 +02:00
Sebastiaan Janssen a411c9c300 Make sure inactive users get the correct state attached to them 2018-08-26 17:23:52 +02:00
Sebastiaan Janssen 342ac7b1b2 Merge branch 'U4-11166' of https://github.com/jamescoxhead/Umbraco-CMS into jamescoxhead-U4-11166 2018-08-26 16:52:58 +02:00
Sebastiaan Janssen f5ac5f20a8 Merge pull request #2869 from Bazmech/temp-U4-11594
U4-11594 HasFocalPoint in ImageCropDataSet does not return correct value
2018-08-26 16:44:19 +02:00
Chris Houston 56de9ff4ae Fix for issue: U4 11409 - "Create content" tour is failing when doing the tour with the starter kit installed (#2851) 2018-08-26 14:52:14 +02:00
Arbie Sarkissian e4d8fcf019 U4-11506 - Fix Gregorian DateTime.MinValue is out of range for some calendars (like PersianCalendar) (#2821) 2018-08-24 11:15:53 +02:00
Sebastiaan Janssen e1f7e835ea Fixes U4-11584 RelatedLinks2 throws exception with null value in Link field 2018-08-24 11:08:27 +02:00
Sebastiaan Janssen d83bb6aa49 Whoops, committed the wrong file! Revert "Fixes U4-11584 RelatedLinks2 throws exception with null value in Link field"
This reverts commit 612138f0e1.
2018-08-24 11:07:55 +02:00
Sebastiaan Janssen 612138f0e1 Fixes U4-11584 RelatedLinks2 throws exception with null value in Link field 2018-08-24 10:49:39 +02:00
Sebastiaan Janssen bfc627857d Merge pull request #2840 from WebCentrum/temp-U4-11527
U4-11527 Fix concurrency issue
2018-08-24 00:02:30 +02:00
BatJan 7d439566cd U4-11526 - Member Group Picker doesn't remove group after unselecting it during selection. (#2835) 2018-08-23 23:56:32 +02:00
Sebastiaan Janssen d224a93ce1 Merge branch 'BatJan-feature/temp-U4-11577' into dev-v7 2018-08-23 23:44:23 +02:00
Sebastiaan Janssen 3454db6ee8 No need to do an extra userService request, if the contentType is null we can't access the settings section, that's a good enough test
Also fixed the bug where editors would see the node name instead of the content type name
2018-08-23 23:36:50 +02:00
Sebastiaan Janssen b67c06a85a Remove console.log that was left behind 2018-08-23 22:23:41 +02:00
Sebastiaan Janssen 44bd3dec9a Merge branch 'dev-v7' into feature/temp-U4-11577 2018-08-23 22:22:57 +02:00
Thomas Nielsen 68ac84aa1d Sort the Umbraco.UserPicker list alphabetically by name (#2872) 2018-08-23 22:15:28 +02:00
Sebastiaan Janssen c1bf8259ef Merge branch 'rasmusjp-fix/linkpicker-url-empty' into dev-v7 2018-08-23 21:34:06 +02:00
Sebastiaan Janssen 1b1df84863 Populates the anchor when found
Also fixes one of the JS files where .model was seemingly used randomly, but the view doesn't want a .model in there
2018-08-23 21:31:31 +02:00
Sebastiaan Janssen 05fdfc6b34 Merge branch 'fix/linkpicker-url-empty' of https://github.com/rasmusjp/Umbraco-CMS into rasmusjp-fix/linkpicker-url-empty 2018-08-23 20:52:14 +02:00
Sebastiaan Janssen 18b690f11a Bump the version to 7.12.2 2018-08-23 20:45:49 +02:00
Sebastiaan Janssen d3b577fe37 Merge pull request #2867 from BatJan/features/temp-U4-11587
U4-11587 Media link does not update when the file is swapped
2018-08-23 20:37:45 +02:00
Sebastiaan Janssen 720409ef54 Merge pull request #2871 from leekelleher/U4-11595
umb-node-preview directive - corrected the title of the "Edit" button
2018-08-23 19:21:30 +02:00
Sebastiaan Janssen 919a63d0ea Merge pull request #2848 from readingdancer/U4-11569
Small tweaks to the Getting Started tour text.
2018-08-23 18:53:40 +02:00
Mads Rasmussen ef6822e15b Merge pull request #2873 from kjac/media-picker-update
Media picker: Minor style update + add help text.
2018-08-23 09:29:05 +02:00
Jan Skovgaard 015e89b927 Make sure the "open" action is only visible when logged in as an administrator 2018-08-22 11:31:07 +02:00
Jan Skovgaard 05e48376c7 Use the node object to get the name and icon so it's also displayed for non-admin users 2018-08-22 11:30:39 +02:00
Jan Skovgaard a2cc0ec411 Shorten comments 2018-08-22 11:30:07 +02:00
Jan Skovgaard d4fff97814 Move the setModePublishStatus function above the scope.previewOpenUrl...not sure why but this makes the status be visible when logged in as something other than an administrator. When logged in as an admin it worked fine before. Can't quite make sense of this. But now it works. 2018-08-22 11:23:51 +02:00
Lee Kelleher 06e99c3b33 Corrected the title of the "Edit" button
umb-node-preview directive - corrected the title of the "Edit" button
2018-08-22 09:13:43 +01:00
Jan Skovgaard ad3d27be76 Reference the node object instead of the documentType object, which returns null if the user is not logged in as an admin. 2018-08-22 10:00:54 +02:00
Jan Skovgaard 2e2fc6ad84 Make sure to check whether the open anchor for the template should be displayed or not 2018-08-22 09:31:44 +02:00
Jan Skovgaard 9f396e4b15 By default set the "allowOpen" to be false and only set it to true if the current user is an admin. This ensures that the "Open" anchors are never displayed for other than admin users. 2018-08-22 09:13:46 +02:00
Barry Bell f42862c42a Update ImageCropDataSet.cs
If only one of the Left or Right values changed the HasFocalPoint function would return false but this should now return true if only one is altered
2018-08-21 21:07:54 +01:00
Mads Rasmussen f7201a70bd add colored border 2018-08-21 21:20:38 +02:00
Mads Rasmussen ec67ab83af Merge branch 'patch-1' of git://github.com/jannikanker/Umbraco-CMS into jannikanker-patch-1 2018-08-21 21:10:01 +02:00
Rasmus John Pedersen a725ddae5a Only remove ? or # if it's part of the url 2018-08-21 17:10:46 +02:00
Jan Skovgaard 8f2c253138 Refactort the scope.nodeUrl to be updated whenever save is hit in the existing update watcher 2018-08-21 14:52:00 +02:00
Kenn Jacobsen de8a24c691 Add "info" style to upload button + add help text when the dropzone is hidden. 2018-08-17 12:22:54 +02:00
Jannik Anker de73080e14 U4-11572
Add border to selected icon in document type icon picker dialog
2018-08-14 13:37:54 +02:00
Chris Houston ba682d95dc Small tweaks to the Getting Started tour text. 2018-08-12 01:16:57 -04:00
Pavel Budik 3efbb47aed U4-11527 Fix concurrency issue 2018-08-08 10:38:53 +02:00
James Coxhead 9a774c8f9e Added inactive state for users who haven't logged in 2018-08-02 22:01:45 +01:00
James Coxhead f81dc16210 Specify which user states we want to include when getting all users 2018-08-02 21:55:04 +01:00
James Coxhead c4a787331f Reverted previous commit to show disabled users in the status filter 2018-08-02 21:54:00 +01:00
James Coxhead 3078be93b6 Remove disabled users option from users list view filter 2018-07-05 21:07:12 +01:00
James Coxhead 0a2fd277a6 U4-11166 Hide disabled users from the users list view 2018-06-28 20:19:02 +01:00
Simon Dingley fd2550cfe9 U4-11312 Provides a fallback AuditType value of AuditType.Custom for any legacy logHeader column values that cannot be parsed 2018-06-26 13:31:22 +02:00
Shannon 78c01801f8 fixes U4-11463 MembershipHelper is not working with basic auth on the initial request 2018-06-26 10:52:42 +10:00
Anders Bjerner ad99d164c9 U4-11477 Here we go again
https://github.com/umbraco/Umbraco-CMS/pull/2720#issuecomment-400106496
2018-06-25 23:58:25 +02:00
42 changed files with 359 additions and 100 deletions
+66
View File
@@ -0,0 +1,66 @@
---
name: 🐛 Bug Report
about: File a bug report, if you've discovered a problem in Umbraco.
---
A brief description of the issue goes here.
<!--
If you haven't yet done so, please read the "contributing guidelines"
thoroughly. Then, proceed by filling out the rest of the details in the issue
template below. The more details you can give us, the easier it will be for us
to determine the cause of a problem.
See: https://github.com/umbraco/Umbraco-CMS/blob/dev-v7/docs/CONTRIBUTING.md
-->
Reproduction
------------
If you're filing a bug, please describe how to reproduce it. Include as much
relevant information as possible, such as:
### Bug summary
<!--
* Write a short summary of the bug
* Try to pinpoint it as much as possible
* Try to state the _actual problem_, and not just what you _think_ the
solution might be.
-->
### Specifics
<!--
* Mention the URL where this bug occurs, if applicable
* What version of Umbraco are you using (down to the very last digit!)
* What browser and version you are using
* Please mention if you've checked it in other browsers as well
* Please include *full error messages* and *screenshots* if possible
-->
### Steps to reproduce
<!--
* Clearly mention the steps to reproduce the bug
-->
### Expected result
<!--
* What did you _expect_ that would happen on your Umbraco site?
* Describe the intended/desired outcome after you did the steps mentioned.
-->
### Actual result
<!--
* What is the actual result of the above steps?
* Describe the behaviour of the bug
* Please, please include **error messages** and screenshots. They might mean
nothing to you, but they are _very_ helpful to us.
-->
+31
View File
@@ -0,0 +1,31 @@
---
name: 📮 Feature Request
about: Open a feature request, if you want to propose a new feature.
---
A brief description of your feature request goes here.
<!--
If you want to discuss the feature you're imagining, please make sure to keep
those discussions on the forum at https://our.umbraco.com/ (choose the
category "Contributing to Umbraco", Umbraco HQ follows all new topics there).
Once you've come to a conclusion in the discussion, feel free to propose the
new feature here.
-->
How can you help?
-------------------------------
<!--
The resources (read: available time and effort) of Umbraco's core team are
limited.
If we can not work on your suggestion, please don't take it personally. Most
likely, it's either:
- We think your idea is valid, but we can't find the time to work on it.
- Your idea might be better suited as a package, if it's not suitable for
the majority of users.
-->
@@ -0,0 +1,9 @@
---
name: ⁉️ Support Question
about: Having trouble with Umbraco? -> https://our.umbraco.com
---
This issue tracker is NOT meant for support questions. If you have a question,
please join us on the forum at https://our.umbraco.com.
Thanks!
@@ -0,0 +1,9 @@
---
name: 📖 Documentation Issue
about: See https://github.com/umbraco/UmbracoDocs/issues for documentation issues
---
The Umbraco documentation has its own dedicated repository. Please open your
documentation-related issue at https://github.com/umbraco/UmbracoDocs/issues
Thanks!
+31
View File
@@ -0,0 +1,31 @@
---
name: 🔐 Security Issue
about: Discovered a Security Issue in Umbraco?
---
⚠️ PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW.
If you have found a security issue in Umbraco, please send the details to
security@umbraco.com and don't disclose it publicly until we can provide a fix for
it. If you wish, we'll credit you for finding verified issues, when we release
the patched version.
❗ Please read more about how to report security issues on https://umbraco.com/security
A note on "Self XSS"
--------------------
Umbraco is a CMS, that allows users to edit content on a website. As such,
all _authenticated users_ can:
- Edit content, and (depending on the field types) insert HTML and CSS in that
content, with a variety of allowed attributes.
- Depending on the user level: Edit template files, and insert C#, HTML, CSS and
javascript in so on.
- Upload files to the site, which will become publicly available.
We see these functionalities as _features_, and not as security issues. Please
report the mentioned items only if they can be performed by non-authorized
users, or other exploitable vulnerabilities.
Thanks!
+3 -3
View File
@@ -1,11 +1,11 @@
### Prerequisites
- [ ] I have written a descriptive pull-request title
- [ ] I have linked this PR to an issue on the tracker at http://issues.umbraco.org
- [ ] I have [created an issue](https://github.com/umbraco/Umbraco-CMS/issues) for the proposed changes in this PR, the link is:
- [ ] I have added steps to test this contribution in the description below
### Description
<!-- A description of the changes proposed in the pull-request -->
<!-- Make sure to link to the related issue number so we can easily find it in the issue tracker -->
<!-- Thanks for contributing to Umbraco CMS! -->
+2 -2
View File
@@ -11,5 +11,5 @@ using System.Resources;
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("7.12.1")]
[assembly: AssemblyInformationalVersion("7.12.1")]
[assembly: AssemblyFileVersion("7.12.2")]
[assembly: AssemblyInformationalVersion("7.12.2")]
+10 -10
View File
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using Semver;
using System;
using System.Collections.Concurrent;
using System.Configuration;
using System.Threading;
using Semver;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
@@ -13,7 +13,7 @@ using Umbraco.Core.Sync;
namespace Umbraco.Core
{
/// <summary>
/// <summary>
/// the Umbraco Application context
/// </summary>
/// <remarks>
@@ -270,7 +270,7 @@ namespace Umbraco.Core
return _umbracoApplicationUrl;
}
}
/// <summary>
/// Resets the url.
/// </summary>
@@ -280,10 +280,10 @@ namespace Umbraco.Core
}
// ReSharper disable once InconsistentNaming
internal string _umbracoApplicationUrl;
internal List<string> _umbracoApplicationDomains = new List<string>();
internal string _umbracoApplicationUrl;
internal ConcurrentDictionary<string, string> _umbracoApplicationDomains = new ConcurrentDictionary<string, string>();
internal string _umbracoApplicationDeploymentId;
private Lazy<bool> _configured;
@@ -399,7 +399,7 @@ namespace Umbraco.Core
}
return version;
}
}
private void AssertIsNotReady()
{
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("7.12.1");
private static readonly Version Version = new Version("7.12.2");
/// <summary>
/// Gets the current version of Umbraco.
+6 -2
View File
@@ -259,7 +259,7 @@ namespace Umbraco.Core.Models.Membership
{
get
{
if (LastLoginDate == default(DateTime) && IsApproved == false && InvitedDate != null)
if (LastLoginDate == default && IsApproved == false && InvitedDate != null)
return UserState.Invited;
if (IsLockedOut)
@@ -267,7 +267,11 @@ namespace Umbraco.Core.Models.Membership
if (IsApproved == false)
return UserState.Disabled;
return UserState.Active;
// User is not disabled or locked and has never logged in before
if (LastLoginDate == default && IsApproved && IsLockedOut == false)
return UserState.Inactive;
return UserState.Active;
}
}
@@ -9,6 +9,7 @@
Active = 0,
Disabled = 1,
LockedOut = 2,
Invited = 3
Invited = 3,
Inactive = 4
}
}
}
@@ -186,6 +186,8 @@ UNION
SELECT '4CountOfLockedOut' AS colName, COUNT(id) AS num FROM umbracoUser WHERE userNoConsole = 1
UNION
SELECT '5CountOfInvited' AS colName, COUNT(id) AS num FROM umbracoUser WHERE lastLoginDate IS NULL AND userDisabled = 1 AND invitedDate IS NOT NULL
UNION
SELECT '6CountOfDisabled' AS colName, COUNT(id) AS num FROM umbracoUser WHERE userDisabled = 0 AND userNoConsole = 0 AND lastLoginDate IS NULL
ORDER BY colName";
var result = Database.Fetch<dynamic>(sql);
@@ -196,7 +198,8 @@ ORDER BY colName";
{UserState.Active, (int)result[1].num},
{UserState.Disabled, (int)result[2].num},
{UserState.LockedOut, (int)result[3].num},
{UserState.Invited, (int)result[4].num}
{UserState.Invited, (int)result[4].num},
{UserState.Inactive, (int) result[5].num}
};
}
@@ -765,6 +768,12 @@ ORDER BY colName";
sb.Append("(userDisabled = 0 AND userNoConsole = 0 AND lastLoginDate IS NOT NULL)");
appended = true;
}
if (userState.Contains(UserState.Inactive))
{
if (appended) sb.Append(" OR ");
sb.Append("(userDisabled = 0 AND userNoConsole = 0 AND lastLoginDate IS NULL)");
appended = true;
}
if (userState.Contains(UserState.Disabled))
{
if (appended) sb.Append(" OR ");
@@ -915,4 +924,4 @@ ORDER BY colName";
}
}
}
}
+1 -1
View File
@@ -699,7 +699,7 @@ namespace Umbraco.Core.Services
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
{
var repository = RepositoryFactory.CreateUserRepository(uow);
return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, member => member.Username);
return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, member => member.Name);
}
}
@@ -51,10 +51,9 @@ namespace Umbraco.Core.Sync
if (request != null)
{
var applicationUrl = GetApplicationUrlFromRequest(request);
newApplicationUrl = !appContext._umbracoApplicationDomains.Contains(applicationUrl);
newApplicationUrl = appContext._umbracoApplicationDomains.TryAdd(applicationUrl, applicationUrl);
if (newApplicationUrl)
{
appContext._umbracoApplicationDomains.Add(applicationUrl);
LogHelper.Info(typeof(ApplicationUrlHelper), string.Format("New ApplicationUrl detected: {0}", applicationUrl));
}
}
@@ -10,10 +10,12 @@
scope.publishStatus = {};
scope.disableTemplates = Umbraco.Sys.ServerVariables.features.disabledFeatures.disableTemplates;
function onInit() {
scope.allowOpen = true;
function onInit() {
// If logged in user has access to the settings section
// show the open anchors - if the user doesn't have
// access, documentType is null, see ContentModelMapper
scope.allowOpen = scope.node.documentType !== null;
scope.datePickerConfig = {
pickDate: true,
@@ -41,11 +43,13 @@
// make sure dates are formatted to the user's locale
formatDatesToLocal();
// Declare a fallback URL for the <umb-node-preview/> directive
scope.previewOpenUrl = '#/settings/documenttypes/edit/' + scope.documentType.id;
// Make sure to set the node status
setNodePublishStatus(scope.node);
// Declare a fallback URL for the <umb-node-preview/> directive
if (scope.documentType !== null) {
scope.previewOpenUrl = '#/settings/documenttypes/edit/' + scope.documentType.id;
}
}
scope.auditTrailPageChange = function (pageNumber) {
@@ -53,7 +57,7 @@
loadAuditTrail();
};
scope.openDocumentType = function (documentType) {
scope.openDocumentType = function (documentType) {
var url = "/settings/documenttypes/edit/" + documentType.id;
$location.url(url);
};
@@ -99,7 +103,7 @@
item.timestampFormatted = dateHelper.getLocalDate(item.timestamp, currentUser.locale, 'LLL');
});
});
scope.auditTrail = data.items;
scope.auditTrailOptions.pageNumber = data.pageNumber;
scope.auditTrailOptions.pageSize = data.pageSize;
@@ -107,7 +111,7 @@
scope.auditTrailOptions.totalPages = data.totalPages;
setAuditTrailLogTypeColor(scope.auditTrail);
scope.loadingAuditTrail = false;
});
@@ -115,6 +119,7 @@
function setAuditTrailLogTypeColor(auditTrail) {
angular.forEach(auditTrail, function (item) {
switch (item.logType) {
case "Publish":
item.logTypeColor = "success";
@@ -130,7 +135,6 @@
}
function setNodePublishStatus(node) {
// deleted node
if(node.trashed === true) {
scope.publishStatus.label = localizationService.localize("general_deleted");
@@ -224,7 +228,7 @@
eventsService.emit("editors.content.changeUnpublishDate", args);
}
function ucfirst(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
@@ -233,13 +237,13 @@
// get current backoffice user and format dates
userService.getCurrentUser().then(function (currentUser) {
scope.node.createDateFormatted = dateHelper.getLocalDate(scope.node.createDate, currentUser.locale, 'LLL');
scope.node.releaseDateYear = scope.node.releaseDate ? ucfirst(dateHelper.getLocalDate(scope.node.releaseDate, currentUser.locale, 'YYYY')) : null;
scope.node.releaseDateMonth = scope.node.releaseDate ? ucfirst(dateHelper.getLocalDate(scope.node.releaseDate, currentUser.locale, 'MMMM')) : null;
scope.node.releaseDateDayNumber = scope.node.releaseDate ? ucfirst(dateHelper.getLocalDate(scope.node.releaseDate, currentUser.locale, 'DD')) : null;
scope.node.releaseDateDay = scope.node.releaseDate ? ucfirst(dateHelper.getLocalDate(scope.node.releaseDate, currentUser.locale, 'dddd')) : null;
scope.node.releaseDateTime = scope.node.releaseDate ? ucfirst(dateHelper.getLocalDate(scope.node.releaseDate, currentUser.locale, 'HH:mm')) : null;
scope.node.removeDateYear = scope.node.removeDate ? ucfirst(dateHelper.getLocalDate(scope.node.removeDate, currentUser.locale, 'YYYY')) : null;
scope.node.removeDateMonth = scope.node.removeDate ? ucfirst(dateHelper.getLocalDate(scope.node.removeDate, currentUser.locale, 'MMMM')) : null;
scope.node.removeDateDayNumber = scope.node.removeDate ? ucfirst(dateHelper.getLocalDate(scope.node.removeDate, currentUser.locale, 'DD')) : null;
@@ -264,8 +268,8 @@
scope.$watch('node.updateDate', function(newValue, oldValue){
if(!newValue) { return; }
if(newValue === oldValue) { return; }
if(newValue === oldValue) { return; }
if(isInfoTab) {
loadAuditTrail();
formatDatesToLocal();
@@ -8,11 +8,16 @@
var evts = [];
function onInit() {
scope.allowOpenMediaType = true;
// If logged in user has access to the settings section
// show the open anchors - if the user doesn't have
// access, contentType is null, see MediaModelMapper
scope.allowOpen = scope.node.contentType !== null;
// get document type details
scope.mediaType = scope.node.contentType;
// get node url
scope.nodeUrl = scope.node.mediaLink;
// set the media link initially
setMediaLink();
// make sure dates are formatted to the user's locale
formatDatesToLocal();
}
@@ -25,16 +30,25 @@
});
}
function setMediaLink(){
scope.nodeUrl = scope.node.mediaLink;
}
scope.openMediaType = function (mediaType) {
// remove first "#" from url if it is prefixed else the path won't work
var url = "/settings/mediaTypes/edit/" + mediaType.id;
$location.path(url);
};
// watch for content updates - reload content when node is saved, published etc.
scope.$watch('node.updateDate', function(newValue, oldValue){
if(!newValue) { return; }
if(newValue === oldValue) { return; }
// Update the media link
setMediaLink();
// Update the create and update dates
formatDatesToLocal();
});
@@ -46,7 +60,6 @@
});
onInit();
}
var directive = {
@@ -64,4 +77,4 @@
angular.module('umbraco.directives').directive('umbMediaNodeInfo', MediaNodeInfoDirective);
})();
})();
@@ -260,7 +260,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica
// if save button is alread the default don't change it just update the label
if (buttons.defaultButton && buttons.defaultButton.letter === "A") {
buttons.defaultButton.labelKey = "buttons_saveAndSchedule";
return;
return buttons;
}
if(buttons.defaultButton && buttons.subButtons && buttons.subButtons.length > 0) {
@@ -8,7 +8,8 @@
{ "value": 0, "name": "Active", "key": "Active", "color": "success" },
{ "value": 1, "name": "Disabled", "key": "Disabled", "color": "danger" },
{ "value": 2, "name": "Locked out", "key": "LockedOut", "color": "danger" },
{ "value": 3, "name": "Invited", "key": "Invited", "color": "warning" }
{ "value": 3, "name": "Invited", "key": "Invited", "color": "warning" },
{ "value": 4, "name": "Inactive", "key": "Inactive", "color": "warning" }
];
angular.forEach(userStates, function (userState) {
@@ -27,12 +27,18 @@
}
.umb-iconpicker-item a:hover,
.umb-iconpicker-item a:focus,
.umb-iconpicker-item.-selected {
.umb-iconpicker-item a:focus {
background: @gray-10;
outline: none;
}
.umb-iconpicker-item.-selected {
background: @gray-10;
border: solid 1px @turquoise-d1;
border-radius: @baseBorderRadius;
box-sizing: border-box;
}
.umb-iconpicker-item a:active {
background: @gray-10;
}
@@ -54,11 +60,6 @@
border-radius: 3px;
}
// Hide Circle when not active
i.small{
display: none;
}
// Circle behind the checkmark
i.small.active{
font-size: 14px;
@@ -5,7 +5,7 @@
width: 100%;
height: 100%;
position: absolute;
z-index: 10000;
z-index: 65537;
top: 0;
left: 0;
margin: 0 !important;
@@ -40,11 +40,18 @@ angular.module("umbraco").controller("Umbraco.Dialogs.LinkPickerController",
// if a link exists, get the properties to build the anchor name list
contentResource.getById(id).then(function (resp) {
$scope.anchorValues = tinyMceService.getAnchorNames(JSON.stringify(resp.properties));
$scope.model.target.url = resp.urls[0];
$scope.target.url = resp.urls[0];
});
} else if ($scope.target.url.length) {
// a url but no id/udi indicates an external link - trim the url to remove the anchor/qs
$scope.target.url = $scope.model.url.substring(0, $scope.model.url.search(/(#|\?)/));
// a url but no id/udi indicates an external link - trim the url to remove the anchor/qs
// only do the substring if there's a # or a ?
var indexOfAnchor = $scope.target.url.search(/(#|\?)/);
if (indexOfAnchor > -1) {
// populate the anchor
$scope.target.anchor = $scope.target.url.substring(indexOfAnchor);
// then rewrite the model and populate the link
$scope.target.url = $scope.target.url.substring(0, indexOfAnchor);
}
}
}
@@ -81,7 +88,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.LinkPickerController",
} else {
contentResource.getById(args.node.id).then(function (resp) {
$scope.anchorValues = tinyMceService.getAnchorNames(JSON.stringify(resp.properties));
$scope.model.target.url = resp.urls[0];
$scope.target.url = resp.urls[0];
});
}
@@ -181,7 +181,7 @@
<form method="POST" name="requestPasswordResetForm" ng-submit="requestPasswordResetSubmit(email)">
<div class="control-group" ng-class="{error: requestPasswordResetForm.email.$invalid}">
<label><localize key="general_email">Email</localize></label>
<input type="email" ng-model="email" name="email" class="-full-width-input" localize="placeholder" placeholder="@placeholders_email" />
<input type="email" val-email ng-model="email" name="email" class="-full-width-input" localize="placeholder" placeholder="@placeholders_email" />
</div>
<div class="control-group" ng-show="requestPasswordResetForm.$invalid">
@@ -3,8 +3,6 @@ angular.module("umbraco").controller("Umbraco.Overlays.LinkPickerController",
function ($scope, eventsService, dialogService, entityResource, contentResource, mediaHelper, userService, localizationService, tinyMceService) {
var dialogOptions = $scope.model;
var anchorPattern = /<a id=\\"(.*?)\\">/gi;
var searchText = "Search...";
localizationService.localize("general_search").then(function (value) {
searchText = value + "...";
@@ -52,8 +50,15 @@ angular.module("umbraco").controller("Umbraco.Overlays.LinkPickerController",
$scope.model.target.url = resp.urls[0];
});
} else if ($scope.model.target.url.length) {
// a url but no id/udi indicates an external link - trim the url to remove the anchor/qs
$scope.model.target.url = $scope.model.target.url.substring(0, $scope.model.target.url.search(/(#|\?)/));
// a url but no id/udi indicates an external link - trim the url to remove the anchor/qs
// only do the substring if there's a # or a ?
var indexOfAnchor = $scope.model.target.url.search(/(#|\?)/);
if (indexOfAnchor > -1) {
// populate the anchor
$scope.model.target.anchor = $scope.model.target.url.substring(indexOfAnchor);
// then rewrite the model and populate the link
$scope.model.target.url = $scope.model.target.url.substring(0, indexOfAnchor);
}
}
} else if (dialogOptions.anchors) {
$scope.anchorValues = dialogOptions.anchors;
@@ -28,6 +28,7 @@
label-key="general_upload"
action="upload()"
disabled="lockedFolder"
button-style="info"
ng-if="acceptedMediatypes.length > 0">
</umb-button>
</div>
@@ -24,7 +24,16 @@ angular.module("umbraco").controller("Umbraco.Overlays.MemberGroupPickerControll
}
function selectMemberGroups(id) {
$scope.model.selectedMemberGroups.push(id);
var index = $scope.model.selectedMemberGroups.indexOf(id);
if(index === -1){
// If the id does not exists in the array then add it
$scope.model.selectedMemberGroups.push(id);
}
else{
// Otherwise we will remove it from the array instead
$scope.model.selectedMemberGroups.splice(index, 1);
}
}
/** Method used for selecting a node */
@@ -178,15 +178,16 @@
<umb-control-group data-element="node-info-document-type" label="@content_documentType">
<umb-node-preview
style="max-width: 100%; margin-bottom: 0;"
icon="documentType.icon"
name="documentType.name"
icon="node.icon"
name="node.contentTypeName"
allow-open="allowOpen"
on-open="openDocumentType(documentType)"
open-url="previewOpenUrl">
open-url="previewOpenUrl">
</umb-node-preview>
</umb-control-group>
<umb-control-group ng-if="disableTemplates == false" data-element="node-info-template" label="@template_template">
<div class="flex items-center">
<select class="input-block-level"
ng-model="node.template"
@@ -194,7 +195,7 @@
ng-change="updateTemplate(node.template)">
<option value=""><localize key="general_choose">Choose</localize>...</option>
</select>
<a href="" class="umb-node-preview__action" style="margin-left:15px;" ng-click="openTemplate()" ng-if="node.template !== null">
<a href="" class="umb-node-preview__action" style="margin-left:15px;" ng-click="openTemplate()" ng-if="node.template !== null && allowOpen">
<localize key="general_open">Open</localize>
</a>
</div>
@@ -9,7 +9,7 @@
size="small">
<localize key="content_noMediaLink"></localize>
</umb-empty-state>
<ul ng-if="nodeUrl" class="nav nav-stacked" style="margin-bottom: 0;">
<li>
<a href="{{nodeUrl}}" target="_blank">
@@ -28,7 +28,7 @@
<umb-box data-element="node-info-general">
<umb-box-header title-key="general_general"></umb-box-header>
<umb-box-content class="block-form">
<umb-control-group data-element="node-info-create-date" label="@content_createDate">
{{node.createDateFormatted}} by {{ node.owner.name }}
</umb-control-group>
@@ -36,13 +36,13 @@
<umb-control-group data-element="node-info-update-date" label="@content_updateDate">
{{node.updateDateFormatted}}
</umb-control-group>
<umb-control-group data-element="node-info-media-type" label="@content_mediatype">
<umb-node-preview
style="max-width: 100%; margin-bottom: 0px;"
icon="mediaType.icon"
name="mediaType.name"
allow-open="allowOpenMediaType"
icon="node.icon"
name="node.contentTypeName"
allow-open="allowOpen"
on-open="openMediaType(mediaType)">
</umb-node-preview>
</umb-control-group>
@@ -52,8 +52,8 @@
<small>{{ node.key }}</small>
</umb-control-group>
</umb-box-content>
</umb-box-content>
</umb-box>
</div>
</div>
</div>
@@ -13,7 +13,7 @@
</div>
</div>
<div class="umb-node-preview__actions">
<a class="umb-node-preview__action" title="Open" href="{{editUrl}}" ng-if="allowEdit" ng-click="onEdit()"><localize key="general_edit">Edit</localize></a>
<a class="umb-node-preview__action" title="Edit" href="{{editUrl}}" ng-if="allowEdit" ng-click="onEdit()"><localize key="general_edit">Edit</localize></a>
<a class="umb-node-preview__action" title="Open" href="{{openUrl}}" ng-if="allowOpen" ng-click="onOpen()"><localize key="general_open">Open</localize></a>
<a class="umb-node-preview__action umb-node-preview__action--red" title="Remove" href="{{removeUrl}}" ng-if="allowRemove" ng-click="onRemove()"><localize key="general_remove">Remove</localize></i></a>
</div>
@@ -37,6 +37,12 @@
</div>
</div>
<div ng-show="hideDropzone" ngf-drag-over-class="hide" class="text-center">
<small>
<localize key="media_dragFilesHereToUpload">You can drag files here to upload</localize>
</small>
</div>
<!-- List of uploading/uploaded files -->
<ul class="file-list" ng-show="done.length > 0 || queue.length > 0 || rejected.length > 0 || filesHolder.length > 0">
@@ -8,6 +8,7 @@
</div>
<div class="sub-view-column-right">
<umb-toggle
data-element="permissions-allow-as-root"
checked="model.allowAsRoot"
on-click="vm.toggle()"
hotkey="alt+shift+r"
+2 -2
View File
@@ -1034,9 +1034,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>7121</DevelopmentServerPort>
<DevelopmentServerPort>7122</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:7121</IISUrl>
<IISUrl>http://localhost:7122</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
@@ -140,7 +140,7 @@
{
"element": "[data-element='editor-description']",
"title": "Enter a description",
"content": "<p>A description helps to pick the right document type when creating content.</p><p>Write a description to our Home page. It could be: <br/><pre>The home page of the website</pre></p>"
"content": "<p>A description helps to pick the right document type when creating content.</p><p>Write a description for our Home page. It could be: <br/><pre>The home page of the website</pre></p>"
},
{
"element": "[data-element='group-add']",
@@ -169,7 +169,7 @@
{
"element": "[data-element~='overlay-property-settings'] [data-element='property-description']",
"title": "Enter a description",
"content": "<p>A description will help to fill in the right content.</p><p>Enter a description for the property editor. It could be:<br/> <pre>Write a nice introduction text so the visitors feel welcome</pre></p>"
"content": "<p>A description will help your editor fill in the right content.</p><p>Enter a description for the property editor. It could be:<br/> <pre>Write a nice introduction text so the visitors feel welcome</pre></p>"
},
{
"element": "[data-element~='overlay-property-settings'] [data-element='editor-add']",
@@ -207,6 +207,18 @@
"content": "Click <b>Submit</b> to add the property to the document type.",
"event": "click"
},
{
"element": "[data-element~='sub-view-permissions']",
"title": "Check the document type permissions",
"content": "Click <b>Permissions</b> to view the permissions page.",
"event": "click"
},
{
"element": "[data-element~='permissions-allow-as-root']",
"title": "Allow this document type to work at the root of your site",
"content": "Toggle the switch <b>Allow as root</b> to allow new content pages based on this document type to be created at the root of your site",
"event": "click"
},
{
"element": "[data-element='button-save']",
"title": "Save the document type",
@@ -247,7 +259,7 @@
"title": "Open context menu",
"content": "<p>Open the context menu by hovering over the root of the content section.</p><p>Now click the <b>three small dots</b> to the right.</p>",
"event": "click",
"eventElement": "[data-element='tree-root'] [data-element='tree-item-options']"
"eventElement": "#tree [data-element='tree-root'] [data-element='tree-item-options']"
},
{
"element": "[data-element='action-create-homePage']",
@@ -346,7 +358,7 @@
"steps": [
{
"title": "View your Umbraco site",
"content": "<p>Our three main components to a page are done: <b>Document type, Template, and Content</b>. It is now time to see the result.</p><p>In this tour you will learn how to see your published website.</p>",
"content": "<p>Our three main components for a page are done: <b>Document type, Template, and Content</b>. It is now time to see the result.</p><p>In this tour you will learn how to see your published website.</p>",
"type": "intro"
},
{
@@ -259,6 +259,7 @@
<key alias="dropFilesHere">Slip filerne her...</key>
<key alias="urls">Link til medie</key>
<key alias="orClickHereToUpload">eller klik her for at vælge filer</key>
<key alias="dragFilesHereToUpload">Du kan trække filer herind for at uploade</key>
<key alias="onlyAllowedFiles">Tilladte filtyper er kun</key>
<key alias="disallowedFileType">Kan ikke uploade denne fil, den har ikke en godkendt filtype</key>
<key alias="maxFileSize">Maks filstørrelse er</key>
@@ -267,6 +267,7 @@
<key alias="dropFilesHere">Drop your files here...</key>
<key alias="urls">Link to media</key>
<key alias="orClickHereToUpload">or click here to choose files</key>
<key alias="dragFilesHereToUpload">You can drag files here to upload</key>
<key alias="onlyAllowedFiles">Only allowed file types are</key>
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
<key alias="maxFileSize">Max file size is</key>
@@ -479,6 +480,7 @@
<key alias="currentListViewDesc" version="7.2">The active list view data type</key>
<key alias="createListView" version="7.2">Create custom list view</key>
<key alias="removeListView" version="7.2">Remove custom list view</key>
<key alias="aliasAlreadyExists">A content type, media type or member type with this alias already exists</key>
</area>
<area alias="renamecontainer">
<key alias="renamed">Renamed</key>
@@ -268,6 +268,7 @@
<key alias="dropFilesHere">Drop your files here...</key>
<key alias="urls">Link to media</key>
<key alias="orClickHereToUpload">or click here to choose files</key>
<key alias="dragFilesHereToUpload">You can drag files here to upload</key>
<key alias="onlyAllowedFiles">Only allowed file types are</key>
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
<key alias="maxFileSize">Max file size is</key>
@@ -479,6 +480,7 @@
<key alias="currentListViewDesc" version="7.2">The active list view data type</key>
<key alias="createListView" version="7.2">Create custom list view</key>
<key alias="removeListView" version="7.2">Remove custom list view</key>
<key alias="aliasAlreadyExists">A content type, media type or member type with this alias already exists</key>
</area>
<area alias="renamecontainer">
<key alias="renamed">Renamed</key>
@@ -46,7 +46,7 @@ namespace Umbraco.Web
//start the background task runner for processing instructions
const int delayMilliseconds = 60000;
var instructionProcessingRunner = new BackgroundTaskRunner<IBackgroundTask>("InstructionProcessing", ApplicationContext.ProfilingLogger.Logger);
var instructionProcessingTask = new InstructionProcessing(instructionProcessingRunner, this, _appContext.ScopeProvider, delayMilliseconds, Options.ThrottleSeconds * 1000);
var instructionProcessingTask = new InstructionProcessing(instructionProcessingRunner, this, _appContext.ScopeProvider, ApplicationContext.ProfilingLogger.Logger, delayMilliseconds, Options.ThrottleSeconds * 1000);
instructionProcessingRunner.TryAdd(instructionProcessingTask);
e.Add(instructionProcessingTask);
}
@@ -78,18 +78,36 @@ namespace Umbraco.Web
{
private readonly DatabaseServerMessenger _messenger;
private readonly IScopeProvider _scopeProvider;
private readonly ILogger _logger;
public InstructionProcessing(IBackgroundTaskRunner<RecurringTaskBase> runner,
DatabaseServerMessenger messenger,
IScopeProvider scopeProvider,
ILogger logger,
int delayMilliseconds, int periodMilliseconds)
: base(runner, delayMilliseconds, periodMilliseconds)
{
_messenger = messenger;
_scopeProvider = scopeProvider;
_logger = logger;
}
public override bool PerformRun()
{
try
{
TryPerformRun();
}
catch (Exception e)
{
_logger.Error<InstructionProcessing>("Failed (will repeat).", e);
}
//return true to repeat
return true;
}
private void TryPerformRun()
{
// beware!
// DatabaseServerMessenger uses _appContext.DatabaseContext.Database without creating
@@ -102,8 +120,6 @@ namespace Umbraco.Web
_messenger.Sync();
scope.Complete();
}
//return true to repeat
return true;
}
public override bool IsAsync
@@ -167,7 +183,7 @@ namespace Umbraco.Web
// can get the http context from it
var httpContext = (UmbracoContext.Current == null ? null : UmbracoContext.Current.HttpContext)
// if this is null, it could be that an async thread is calling this method that we weren't aware of and the UmbracoContext
// wasn't ensured at the beginning of the thread. We can try to see if the HttpContext.Current is available which might be
// wasn't ensured at the beginning of the thread. We can try to see if the HttpContext.Current is available which might be
// the case if the asp.net synchronization context has kicked in
?? (HttpContext.Current == null ? null : new HttpContextWrapper(HttpContext.Current));
@@ -227,9 +227,9 @@ namespace Umbraco.Web.Editors
// works since that is based on aliases.
var allAliases = Services.ContentTypeService.GetAllContentTypeAliases();
var exists = allAliases.InvariantContains(contentTypeSave.Alias);
if ((exists) && (ctId == 0 || ct.Alias != contentTypeSave.Alias))
if (exists && (ctId == 0 || ct.Alias.InvariantEquals(contentTypeSave.Alias) == false))
{
ModelState.AddModelError("Alias", "A content type, media type or member type with this alias already exists");
ModelState.AddModelError("Alias", Services.TextService.Localize("editcontenttype/aliasAlreadyExists"));
}
//now let the external validators execute
+10 -1
View File
@@ -219,6 +219,7 @@ namespace Umbraco.Web.Editors
// so to do that here, we'll need to check if this current user is an admin and if not we should exclude all user who are
// also admins
var hideDisabledUsers = UmbracoConfig.For.UmbracoSettings().Security.HideDisabledUsersInBackoffice;
var excludeUserGroups = new string[0];
var isAdmin = Security.CurrentUser.IsAdmin();
if (isAdmin == false)
@@ -241,10 +242,18 @@ namespace Umbraco.Web.Editors
filterQuery.Where(x => x.Name.Contains(filter) || x.Username.Contains(filter));
}
if (hideDisabledUsers)
{
if (userStates == null || userStates.Any() == false)
{
userStates = new[] { UserState.Active, UserState.Invited, UserState.LockedOut, UserState.Inactive };
}
}
long pageIndex = pageNumber - 1;
long total;
var result = Services.UserService.GetAll(pageIndex, pageSize, out total, orderBy, orderDirection, userStates, userGroups, excludeUserGroups, filterQuery);
var paged = new PagedUserResult(total, pageNumber, pageSize)
{
Items = Mapper.Map<IEnumerable<UserBasic>>(result),
+2 -2
View File
@@ -66,7 +66,7 @@ namespace Umbraco.Web.Models
public bool HasFocalPoint()
{
return FocalPoint != null && FocalPoint.Left != 0.5m && FocalPoint.Top != 0.5m;
return FocalPoint != null && (FocalPoint.Left != 0.5m || FocalPoint.Top != 0.5m);
}
public bool HasCrop(string alias)
@@ -153,4 +153,4 @@ namespace Umbraco.Web.Models
return !Equals(left, right);
}
}
}
}
@@ -116,7 +116,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
{
var strLinkId = linkData.Link;
var udiAttempt = strLinkId.TryConvertTo<Udi>();
if (udiAttempt.Success)
if (udiAttempt.Success && udiAttempt.Result != null)
{
var content = helper.TypedContent(udiAttempt.Result);
if (content != null)
@@ -168,4 +168,4 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
return link;
}
}
}
}
@@ -647,10 +647,15 @@ namespace Umbraco.Web.Security
var provider = _membershipProvider;
string username;
if (provider.IsUmbracoMembershipProvider())
{
var member = GetCurrentPersistedMember();
// If a member could not be resolved from the provider, we are clearly not authorized and can break right here
if (member == null)
return false;
username = member.Username;
// If types defined, check member is of one of those types
var allowTypesList = allowTypes as IList<string> ?? allowTypes.ToList();
if (allowTypesList.Any(allowType => allowType != string.Empty))
@@ -669,6 +674,9 @@ namespace Umbraco.Web.Security
else
{
var member = provider.GetCurrentUser();
// If a member could not be resolved from the provider, we are clearly not authorized and can break right here
if (member == null)
return false;
username = member.UserName;
}
@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Umbraco.Core;
@@ -20,7 +21,7 @@ namespace Umbraco.Web.WebApi
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((DateTime)value).ToString(_dateTimeFormat));
writer.WriteValue(((DateTime)value).ToString(_dateTimeFormat, CultureInfo.InvariantCulture));
}
}
}
}