Compare commits

...

90 Commits

Author SHA1 Message Date
Sebastiaan Janssen 76dc311586 Merge branch 'dev-v7.6' into dev-v7
# Conflicts:
#	src/Umbraco.Tests/Web/Mvc/HtmlStringUtilitiesTests.cs
#	src/Umbraco.Web/HtmlStringUtilities.cs
2017-10-02 13:51:21 +02:00
Sebastiaan Janssen 581f15b172 Manually applying change from U4-10478 7.7.1 HtmlStringUtilities Truncate throws an IndexOutOfRange when input word is shorter than "…" and crash the entire site to 7.6.9 too. 2017-10-01 12:05:40 +02:00
Robert daf01fb0fa Merge pull request #2226 from erikarenhill/U4-10478
U4-10478: Bugfix where it would throw an IndexOutOfBounds
2017-09-30 00:32:57 +02:00
Zsolt 588640037c Merge pull request #2054 from bjarnef/dev-v7-U4-7044
U4-7044 - Adjust icon and heading to fix issue with icon position in IE
2017-09-29 10:28:10 +02:00
Zsolt 7b106caf95 Merge pull request #2214 from bjarnef/dev-v7-U4-10461
U4-10461 - Format dates using culture of current backoffice user
2017-09-29 10:14:27 +02:00
Zsolt 828a94bc4f Merge pull request #2213 from bjarnef/dev-v7-U4-10462
U4-10462 - Localize dropdown filters
2017-09-29 09:28:42 +02:00
Shannon efd1ea5b86 bumps version 2017-09-29 13:18:58 +10:00
Shannon 376d93de61 Merge remote-tracking branch 'origin/dev-v7.6' into dev-v7 2017-09-29 13:18:17 +10:00
Shannon 33d7598d3c Adding key fallback to list view select functions to fix issue when selecting multiple items with an ID of int.MaxValue 2017-09-29 13:16:53 +10:00
Shannon Deminick 6a74967a49 Merge pull request #2212 from callumbwhyte/U4-10464
U4-10464: Fixes selecting multiple list view items when item ID is int.MaxValue
2017-09-29 13:13:31 +10:00
Shannon 79351efd36 Fixes the JS errors with recent changes 2017-09-29 13:08:47 +10:00
Shannon Deminick 70c9da93e9 Merge pull request #2211 from callumbwhyte/U4-10463
U4-10463: Fixes Backoffice opening custom section on login instead of content section
2017-09-29 12:30:16 +10:00
Shannon Deminick 521acc0618 Merge pull request #2220 from umbraco/temp-U4-10437
U4-10437 Listview children not showing after upgrade to 7.7
2017-09-29 12:24:02 +10:00
Shannon 95c3a7386d simplifies logic 2017-09-29 12:21:48 +10:00
Sebastiaan Janssen 448a99d5a4 Fix "Item already exists in dictionary" when selecting items in the list view 2017-09-28 22:00:25 +02:00
Sebastiaan Janssen 83f705e19f Merge branch 'dev-v7' into temp-U4-10437 2017-09-28 20:07:27 +02:00
Sebastiaan Janssen 880ae5cb95 Merge remote-tracking branch 'origin/dev-v7.6' into dev-v7 2017-09-28 20:01:44 +02:00
Sebastiaan Janssen 476773fce5 Merge pull request #2224 from umbraco/temp-U4-5222
U4-5222 Rollback Feature fails to update the UI to show the rolled ba…
2017-09-28 20:00:13 +02:00
Sebastiaan Janssen 953355cddd Merge pull request #2222 from umbraco/temp-U4-10364-2
U4-10364 SQL error occurs when we attempt to sort media items by "Cre…
2017-09-28 19:39:19 +02:00
Zsolt e0801cd05a Merge branch 'dev-v7' into dev-v7-U4-10462 2017-09-28 16:33:25 +02:00
erikarenhill b363a1711a U4-10478: Bugfix where it would throw an IndexOutOfBounds when passing a word shorter than … to Truncate. Now checks whether the input wanted an elipsis and also if it reached the end. 2017-09-28 15:52:13 +02:00
negyven6 45fca02dd1 Merge pull request #2210 from bjarnef/dev-v7-U4-10442
U4-10442 - Localization of users section
2017-09-28 15:18:15 +02:00
Sebastiaan Janssen b426f92e4f Update README.md 2017-09-28 13:53:18 +02:00
Sebastiaan Janssen 3e3372752a Update README.md 2017-09-28 13:52:16 +02:00
negyven6 4104ffc699 Merge pull request #2204 from bjarnef/dev-v7-fix-cropper-zindex
U4-10440 - Fix image cropper z-index with focal point behind sticky bar
2017-09-28 11:36:43 +02:00
negyven6 f63aa2e2ed Merge pull request #2207 from bjarnef/dev-v7-U4-10446
U4-10446 - Fix IE issues with action button in tree
2017-09-28 10:35:07 +02:00
negyven6 57553a5956 Merge pull request #2206 from bjarnef/dev-v7-U4-10445
U4-10445 - Fix IE issues with user boxes
2017-09-28 10:22:21 +02:00
Shannon d2d43255aa U4-5222 Rollback Feature fails to update the UI to show the rolled back content - requires refresh 2017-09-28 02:38:53 +10:00
Shannon 9ad767a285 removes regex configuration bits 2017-09-27 23:13:02 +10:00
Shannon b39e218d51 U4-10364 SQL error occurs when we attempt to sort media items by "Created by" column 2017-09-27 23:04:53 +10:00
Shannon 22ff362521 Changes email validation in c# to use the email address attribute like we do elsewhere in the codebase, adds unit test assertions to verify it validates the new odd email addresses 2017-09-27 22:50:47 +10:00
Shannon Deminick 3bbeb6670b Merge pull request #2215 from umbraco/temp-U4-10439
U4-10439 Email validation in installer, User and Member editor need t…
2017-09-27 22:34:47 +10:00
Shannon Deminick 581b1b6fbf Merge pull request #2208 from Sam7/U4-10444
Fix for: U4-10444 - External Logins have stopped working since the 7.…
2017-09-27 22:27:35 +10:00
Shannon 4053c52dfb U4-10437 Listview children not showing after upgrade to 7.7 2017-09-27 22:17:50 +10:00
Sebastiaan Janssen 6a80cc5708 The order matters.. go figure! 2017-09-27 13:32:03 +02:00
Sebastiaan Janssen 01ba781e75 Make sure to expose the regex during install so the validation actually works 2017-09-27 13:06:43 +02:00
Sebastiaan Janssen b477ed726d Change input types to email instead of text 2017-09-27 12:45:44 +02:00
Sebastiaan Janssen 147d6aa638 Revert to the previous regex we had, which was actually working great 2017-09-27 12:36:43 +02:00
Sebastiaan Janssen efca0a904d Adds a test for gmail syntax email aliases 2017-09-27 12:11:47 +02:00
Sebastiaan Janssen 7e25501ac5 Merge remote-tracking branch 'origin/dev-v7.6' into dev-v7
# Conflicts:
#	src/SolutionInfo.cs
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
#	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
2017-09-27 10:08:44 +02:00
Sebastiaan Janssen 4b581a2182 Merge pull request #2217 from umbraco/temp-U4-10470
U4-10470 Missing transform for the scripts tree when upgrading
2017-09-27 10:06:08 +02:00
Claus 581eac5369 U4-10470 Missing transform for the scripts tree when upgrading 2017-09-27 10:04:07 +02:00
Shannon Deminick c941ff093c Merge pull request #2216 from rasmusjp/patch-1
Fix incorrect closed div
2017-09-27 08:30:07 +10:00
Rasmus 60f9490892 Fix incorrect closed div 2017-09-26 22:28:13 +02:00
Sebastiaan Janssen 7c864fe2e9 Whoops change hardcoded regex to one provided by the configuration 2017-09-26 15:27:35 +02:00
Sebastiaan Janssen 8a52865d22 U4-10439 Email validation in installer, User and Member editor need to be the same 2017-09-26 15:23:47 +02:00
Niels Hartvig 78e5d6d3ad Merge pull request #2203 from umbraco/temp-U4-10435
U4-10435 Unable to Change Username (Reverts After Save)
2017-09-26 11:15:39 +02:00
Sebastiaan Janssen 33cf983cae Bump version 2017-09-25 11:19:36 +02:00
Shannon 3ce6eb09aa Ensures HealthCheckController is authorized to user with developer access
(cherry picked from commit 7c4eb71f07)
2017-09-25 10:48:15 +02:00
Stephan 963015cf4a Fix LocalDb detection on 32/64 bits systems
(cherry picked from commit a239e92bc0)
2017-09-25 10:47:38 +02:00
Sebastiaan Janssen cc35af4eab Merge pull request #2209 from umbraco/temp-deploy-401
deploy-401 - fix id reservations
2017-09-25 10:46:05 +02:00
Shannon 7c4eb71f07 Ensures HealthCheckController is authorized to user with developer access 2017-09-25 14:49:59 +10:00
Bjarne Fyrstenborg 9282312305 Format dates using culture of current backoffice user 2017-09-24 23:02:45 +02:00
Bjarne Fyrstenborg fc46569cd9 Add comment 2017-09-24 22:11:12 +02:00
Bjarne Fyrstenborg 30f42f4ea8 Fix dropdown issue with checkbox because of long label text 2017-09-24 21:57:05 +02:00
Bjarne Fyrstenborg fa777c46b1 Localize user filters 2017-09-24 21:43:23 +02:00
Callum Whyte a01f69807c Adding key fallback to list view select functions to fix issue when selecting multiple items with an ID of int.MaxValue 2017-09-24 19:11:58 +01:00
Callum Whyte e12498ccae Moving default or empty check for section routeParam into routing resolve function so it's handled earlier in the pipeline 2017-09-24 18:34:16 +01:00
Bjarne Fyrstenborg 4fc51e4a8b Translate last login 2017-09-23 02:19:55 +02:00
Bjarne Fyrstenborg 4c3e66e58d Ensure localization is used like in other tree controllers 2017-09-23 02:17:29 +02:00
Bjarne Fyrstenborg 17abd53b1b More localization of labels 2017-09-23 02:10:08 +02:00
Bjarne Fyrstenborg 202a3e10b5 Localize cancel link in dialog 2017-09-22 23:30:07 +02:00
Bjarne Fyrstenborg 925f64c79d Localize "select user group" dialog heading 2017-09-22 23:26:09 +02:00
Bjarne Fyrstenborg c28e5f4d55 Localize user group delete button 2017-09-22 23:25:19 +02:00
Bjarne Fyrstenborg 439c460220 Localize user management heading 2017-09-22 23:12:33 +02:00
Bjarne Fyrstenborg ae1702c62a Remove unused translation keys 2017-09-22 23:03:38 +02:00
Bjarne Fyrstenborg 1ed29fb8bb Add translations of new user management and fix other translations 2017-09-22 23:01:43 +02:00
Sebastiaan Janssen c9ea1a5504 Copy Azure Gallery script to output folder 2017-09-22 17:03:20 +02:00
Sebastiaan Janssen 10da318989 Get-FileHash is now unused 2017-09-22 16:54:34 +02:00
Sebastiaan Janssen 74e3308017 Adds Azure Gallery release script - no more need for WebPI builds 2017-09-22 16:52:04 +02:00
Stephan 349d89e4d7 deploy-401 - fix id reservations 2017-09-22 13:08:05 +02:00
Sam Sperling 201ac076c3 Fix for: U4-10444 - External Logins have stopped working since the 7.7.1 update when using auto linking 2017-09-22 13:55:15 +10:00
Bjarne Fyrstenborg bc2e9936d8 Fix issue in IE10 where width 100% pushed action button (dots) out of tree section 2017-09-22 00:01:34 +02:00
Bjarne Fyrstenborg e8e9f5ca49 Fix squeezed action button (dots) in IE 2017-09-22 00:00:39 +02:00
Bjarne Fyrstenborg b938685db0 Ensure longer text in user box is wrapped in IE, e.g. "Migrated Section Access Group 1" 2017-09-21 23:25:40 +02:00
Bjarne Fyrstenborg 39498ad362 Center avatar horizontally in IE 2017-09-21 23:24:10 +02:00
Sebastiaan Janssen 92b6e276bf U4-10443 Remove xmlrpcnet from nuspec 2017-09-21 08:44:59 +02:00
Stephan a239e92bc0 Fix LocalDb detection on 32/64 bits systems 2017-09-21 08:32:49 +02:00
Sebastiaan Janssen e0025db56d Merge remote-tracking branch 'origin/dev-v7.7' into dev-v7 2017-09-21 08:26:59 +02:00
Bjarne Fyrstenborg 1238c10b3d Ensure close button is behind sticky bar 2017-09-20 18:39:51 +02:00
Bjarne Fyrstenborg 35177eea9f Fix image cropper z-index with focal point behind sticky bar 2017-09-20 18:01:51 +02:00
Sebastiaan Janssen 7cd632302b Only sync the email and username when UsernameIsEmail is true - U4-10435 Unable to Change Username (Reverts After Save) 2017-09-20 13:34:19 +02:00
Shannon Deminick 7142222234 Merge pull request #2201 from wanddy/dev-v7
Improve Chinese translation
2017-09-20 09:36:30 +10:00
Sebastiaan Janssen fd35d89949 Merge remote-tracking branch 'origin/dev-v7' into dev-v7.7 2017-09-19 18:51:23 +02:00
Sebastiaan Janssen 1b3fc9fb21 Oops! Add -docs for all the log file pipes 2017-09-19 18:37:00 +02:00
Sebastiaan Janssen 2e98651d62 Create the out and tmp folders correctly 2017-09-19 18:16:19 +02:00
Sebastiaan Janssen 704e981284 Always do the node/bower/gulp build to get docs, start with node build first 2017-09-19 18:15:31 +02:00
Wanddy Huang(黄仁祥) 0f17a27d86 Improve Chinese translation
Improve Chinese translation.
2017-09-19 15:56:47 +08:00
Wanddy Huang(黄仁祥) 9c24dc71a4 Merge pull request #2 from umbraco/dev-v7
Merge from origin source
2017-09-19 15:49:16 +08:00
Bjarne Fyrstenborg bfb5dd91cc Adjust icon and heading to fix issue with icon position in IE 2017-07-18 01:17:47 +02:00
70 changed files with 891 additions and 696 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
[![Build status](https://ci.appveyor.com/api/projects/status/ikpgqxiw9v8opltv/branch/dev-v7?svg=true)](https://ci.appveyor.com/project/Umbraco/umbraco-cms-hs8dx/branch/dev-v7)
[![Build status](https://ci.appveyor.com/api/projects/status/6by6harxtxt0ocdx/branch/dev-v7?svg=true)](https://ci.appveyor.com/project/Umbraco/umbraco-cms-b2cri/branch/dev-v7)
Umbraco CMS
===========
@@ -7,45 +7,39 @@ function Build-UmbracoDocs
$src = "$($uenv.SolutionRoot)\src"
$out = "$($uenv.SolutionRoot)\build.out"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$buildTemp = "$PSScriptRoot\temp"
$cache = 2
Prepare-Build -keep $uenv
################ Do the UI docs
# get a temp clean node env (will restore)
Sandbox-Node $uenv
Write-Host "Executing gulp docs"
push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
write "node version is:" > $tmp\belle-docs.log
&node -v >> $tmp\belle-docs.log 2>&1
write "npm version is:" >> $tmp\belle-docs.log 2>&1
&npm -v >> $tmp\belle-docs.log 2>&1
write "executing npm install" >> $tmp\belle-docs.log 2>&1
&npm install >> $tmp\belle-docs.log 2>&1
write "executing bower install" >> $tmp\belle-docs.log 2>&1
&npm install -g bower >> $tmp\belle-docs.log 2>&1
write "installing gulp" >> $tmp\belle-docs.log 2>&1
&npm install -g gulp >> $tmp\belle-docs.log 2>&1
write "installing gulp-cli" >> $tmp\belle-docs.log 2>&1
&npm install -g gulp-cli --quiet >> $tmp\belle-docs.log 2>&1
write "building docs using gulp" >> $tmp\belle-docs.log 2>&1
&gulp docs >> $tmp\belle-docs.log 2>&1
pop-location
# No need to build belle again if it exists
$belleAppJs = "$src\Umbraco.Web.UI\Umbraco\js\app.js"
if(-not (Test-Path $belleAppJs))
{
# get a temp clean node env (will restore)
Sandbox-Node $uenv
push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
write "node version is:" > $tmp\belle.log
&node -v >> $tmp\belle.log 2>&1
write "npm version is:" >> $tmp\belle.log 2>&1
&npm -v >> $tmp\belle.log 2>&1
write "cleaning npm cache" >> $tmp\belle.log 2>&1
&npm cache clean >> $tmp\belle.log 2>&1
write "installing bower" >> $tmp\belle.log 2>&1
&npm install -g bower >> $tmp\belle.log 2>&1
write "installing gulp" >> $tmp\belle.log 2>&1
&npm install -g gulp >> $tmp\belle.log 2>&1
write "installing gulp-cli" >> $tmp\belle.log 2>&1
&npm install -g gulp-cli --quiet >> $tmp\belle.log 2>&1
write "executing npm install" >> $tmp\belle.log 2>&1
&npm install >> $tmp\belle.log 2>&1
write "building docs using gulp" >> $tmp\belle.log 2>&1
&gulp docs >> $tmp\belle.log 2>&1
pop-location
# fixme - should we filter the log to find errors?
#get-content .\build.tmp\belle-docs.log | %{ if ($_ -match "build") { write $_}}
} else {
Write-Host "Skipping belle build, $belleAppJs already exists"
}
Write-Host "Completed gulp docs build"
# fixme - should we filter the log to find errors?
#get-content .\build.tmp\belle-docs.log | %{ if ($_ -match "build") { write $_}}
# change baseUrl
$baseUrl = "https://our.umbraco.org/apidocs/ui/"
+34 -24
View File
@@ -51,13 +51,19 @@ function Prepare-Build
if (-not $keep)
{
Remove-Directory "$tmp"
mkdir "$tmp" > $null
Remove-Directory "$out"
mkdir "$out" > $null
Remove-Directory "$tmp"
Remove-Directory "$out"
}
if (-not (Test-Path "$tmp"))
{
mkdir "$tmp" > $null
}
if (-not (Test-Path "$out"))
{
mkdir "$out" > $null
}
# ensure proper web.config
$webUi = "$src\Umbraco.Web.UI"
Store-WebConfig $webUi
@@ -371,14 +377,6 @@ function Prepare-Packages
Copy-Files "$src\Umbraco.Web.UI\umbraco\lib" "*" "$tmp\WebApp\umbraco\lib"
Copy-Files "$src\Umbraco.Web.UI\umbraco\views" "*" "$tmp\WebApp\umbraco\views"
Copy-Files "$src\Umbraco.Web.UI\umbraco\preview" "*" "$tmp\WebApp\umbraco\preview"
# prepare WebPI
Write-Host "Prepare WebPI"
Remove-Directory "$tmp\WebPi"
mkdir "$tmp\WebPi" > $null
mkdir "$tmp\WebPi\umbraco" > $null
Copy-Files "$tmp\WebApp" "*" "$tmp\WebPi\umbraco"
Copy-Files "$src\WebPi" "*" "$tmp\WebPi"
}
#
@@ -407,17 +405,6 @@ function Package-Zip
"$tmp\WebApp\*" `
"-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb"`
> $null
Write-Host "Zip WebPI"
&$uenv.Zip a -r "$out\UmbracoCms.WebPI.$($version.Semver).zip" "-x!*.pdb"`
"$tmp\WebPi\*" `
"-x!dotless.Core.*" `
> $null
# hash the webpi file
Write-Host "Hash WebPI"
$hash = Get-FileHash "$out\UmbracoCms.WebPI.$($version.Semver).zip"
Write $hash | out-file "$out\webpihash.txt" -encoding ascii
}
#
@@ -461,6 +448,24 @@ function Restore-NuGet
&$uenv.NuGet restore "$src\Umbraco.sln" > "$tmp\nuget.restore.log"
}
#
# Copies the Azure Gallery script to output
#
function Prepare-AzureGallery
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
$psScript = "$($uenv.SolutionRoot)\build\azuregalleryrelease.ps1"
Write-Host ">> Copy azuregalleryrelease.ps1 to output folder"
Copy-Item $psScript $out
}
#
# Creates the NuGet packages
#
@@ -570,6 +575,10 @@ function Build-Umbraco
{
Compile-Belle $uenv $version
}
elseif ($target -eq "prepare-azuregallery")
{
Prepare-AzureGallery $uenv
}
elseif ($target -eq "all")
{
Prepare-Build $uenv
@@ -584,6 +593,7 @@ function Build-Umbraco
Verify-NuGet $uenv
Prepare-NuGet $uenv
Package-NuGet $uenv $version
Prepare-AzureGallery $uenv
}
else
{
-25
View File
@@ -1,28 +1,3 @@
# returns a string containing the hash of $file
function Get-FileHash($file)
{
try
{
$crypto = new-object System.Security.Cryptography.SHA1CryptoServiceProvider
$stream = [System.IO.File]::OpenRead($file)
$hash = $crypto.ComputeHash($stream)
$text = ""
$hash | foreach `
{
$text = $text + $_.ToString("x2")
}
return $text
}
finally
{
if ($stream)
{
$stream.Dispose()
}
$crypto.Dispose()
}
}
# returns the full path if $file is relative to $pwd
function Get-FullPath($file)
{
-1
View File
@@ -29,7 +29,6 @@
<dependency id="Lucene.Net" version="[2.9.4.1, 3.0.0.0)" />
<dependency id="SharpZipLib" version="[0.86.0, 1.0.0)" />
<dependency id="MySql.Data" version="[6.9.9, 7.0.0)" />
<dependency id="xmlrpcnet" version="[2.5.0, 3.0.0)" />
<dependency id="ClientDependency" version="[1.9.2, 2.0.0)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0.0, 2.0.0)" />
<dependency id="AutoMapper" version="[3.3.1, 4.0.0)" />
+1 -1
View File
@@ -43,7 +43,7 @@
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<add application="settings" alias="scripts" title="Scripts" type="umbraco.loadScripts, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4"
<add application="settings" alias="scripts" title="Scripts" type="Umbraco.Web.Trees.ScriptTreeController, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" alias="dictionary" title="Dictionary" type="umbraco.loadDictionary, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="6"
+59
View File
@@ -0,0 +1,59 @@
Param(
[string]$GitHubPersonalAccessToken,
[string]$Directory
)
$workingDirectory = $Directory
CD $workingDirectory
# Clone repo
$fullGitUrl = "https://$env:GIT_URL/$env:GIT_REPOSITORYNAME.git"
git clone $fullGitUrl 2>&1 | % { $_.ToString() }
# Remove everything so that unzipping the release later will update everything
# Don't remove the readme file nor the git directory
Write-Host "Cleaning up git directory before adding new version"
Remove-Item -Recurse $workingDirectory\$env:GIT_REPOSITORYNAME\* -Exclude README.md,.git
# Find release zip
$zipsDir = "$workingDirectory\$env:BUILD_DEFINITIONNAME\zips"
$pattern = "UmbracoCms.([0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3}).zip"
Write-Host "Searching for Umbraco release files in $workingDirectory\$zipsDir for a file with pattern $pattern"
$file = (Get-ChildItem $zipsDir | Where-Object { $_.Name -match "$pattern" })
if($file)
{
# Get release name
$version = [regex]::Match($file.Name, $pattern).captures.groups[1].value
$releaseName = "Umbraco $version"
Write-Host "Found $releaseName"
# Unzip into repository to update release
Add-Type -AssemblyName System.IO.Compression.FileSystem
Write-Host "Unzipping $($file.FullName) to $workingDirectory\$env:GIT_REPOSITORYNAME"
[System.IO.Compression.ZipFile]::ExtractToDirectory("$($file.FullName)", "$workingDirectory\$env:GIT_REPOSITORYNAME")
# Telling git who we are
git config --global user.email "coffee@umbraco.com" 2>&1 | % { $_.ToString() }
git config --global user.name "Umbraco HQ" 2>&1 | % { $_.ToString() }
# Commit
CD $env:GIT_REPOSITORYNAME
Write-Host "Committing Umbraco $version Release from Build Output"
git add . 2>&1 | % { $_.ToString() }
git commit -m " Release $releaseName from Build Output" 2>&1 | % { $_.ToString() }
# Tag the release
git tag -a "v$version" -m "v$version"
# Push release to master
$fullGitAuthUrl = "https://$($env:GIT_USERNAME):$GitHubPersonalAccessToken@$env:GIT_URL/$env:GIT_REPOSITORYNAME.git"
git push $fullGitAuthUrl 2>&1 | % { $_.ToString() }
#Push tag to master
git push $fullGitAuthUrl --tags 2>&1 | % { $_.ToString() }
}
else
{
Write-Error "Umbraco release file not found, searched in $workingDirectory\$zipsDir for a file with pattern $pattern - cancelling"
}
+2 -2
View File
@@ -11,5 +11,5 @@ using System.Resources;
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("7.7.1")]
[assembly: AssemblyInformationalVersion("7.7.1")]
[assembly: AssemblyFileVersion("7.7.2")]
[assembly: AssemblyInformationalVersion("7.7.2")]
@@ -357,6 +357,7 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
string IContentSection.LoginBackgroundImage
{
get { return LoginBackgroundImage; }
}
}
}
}
@@ -74,6 +74,7 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
bool EnablePropertyValueConverters { get; }
string LoginBackgroundImage { get; }
string LoginBackgroundImage { get; }
}
}
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("7.7.1");
private static readonly Version Version = new Version("7.7.2");
/// <summary>
/// Gets the current version of Umbraco.
@@ -42,6 +42,14 @@ namespace Umbraco.Core.Models.Identity
private BackOfficeIdentityUser()
{
_startMediaIds = new int[] { };
_startContentIds = new int[] { };
_groups = new IReadOnlyUserGroup[] { };
_allowedSections = new string[] { };
_culture = Configuration.GlobalSettings.DefaultUILanguage;
_groups = new IReadOnlyUserGroup[0];
_roles = new ObservableCollection<IdentityUserRole<string>>();
_roles.CollectionChanged += _roles_CollectionChanged;
}
/// <summary>
@@ -17,7 +17,30 @@ namespace Umbraco.Core.Models.Membership
}
/// <summary>
/// Returns the aggregate permissions in the permission set
/// Returns the aggregate permissions in the permission set for a single node
/// </summary>
/// <returns></returns>
/// <remarks>
/// This value is only calculated once per node
/// </remarks>
public IEnumerable<string> GetAllPermissions(int entityId)
{
if (_aggregateNodePermissions == null)
_aggregateNodePermissions = new Dictionary<int, string[]>();
string[] entityPermissions;
if (_aggregateNodePermissions.TryGetValue(entityId, out entityPermissions) == false)
{
entityPermissions = this.Where(x => x.EntityId == entityId).SelectMany(x => x.AssignedPermissions).Distinct().ToArray();
_aggregateNodePermissions[entityId] = entityPermissions;
}
return entityPermissions;
}
private Dictionary<int, string[]> _aggregateNodePermissions;
/// <summary>
/// Returns the aggregate permissions in the permission set for all nodes
/// </summary>
/// <returns></returns>
/// <remarks>
+22 -9
View File
@@ -24,6 +24,7 @@ namespace Umbraco.Core.Persistence
{
private int _version;
private bool _hasVersion;
private string _exe;
#region Availability & Version
@@ -84,16 +85,31 @@ namespace Umbraco.Core.Persistence
{
_hasVersion = true;
_version = -1;
_exe = null;
var programFiles = Environment.GetEnvironmentVariable("ProgramFiles");
if (programFiles == null) return;
// MS SQL Server installs in e.g. "C:\Program Files\Microsoft SQL Server", so
// we want to detect it in "%ProgramFiles%\Microsoft SQL Server" - however, if
// Umbraco runs as a 32bits process (e.g. IISExpress configured as 32bits)
// on a 64bits system, %ProgramFiles% will point to "C:\Program Files (x86)"
// and SQL Server cannot be found. But then, %ProgramW6432% will point to
// the original "C:\Program Files". Using it to fix the path.
// see also: MSDN doc for WOW64 implementation
//
var programW6432 = Environment.GetEnvironmentVariable("ProgramW6432");
if (string.IsNullOrWhiteSpace(programW6432) == false && programW6432 != programFiles)
programFiles = programW6432;
if (string.IsNullOrWhiteSpace(programFiles)) return;
// detect 14, 13, 12, 11
for (var i = 14; i > 10; i--)
{
var path = Path.Combine(programFiles, string.Format(@"Microsoft SQL Server\{0}0\Tools\Binn\SqlLocalDB.exe", i));
if (File.Exists(path) == false) continue;
var exe = Path.Combine(programFiles, string.Format(@"Microsoft SQL Server\{0}0\Tools\Binn\SqlLocalDB.exe", i));
if (File.Exists(exe) == false) continue;
_version = i;
_exe = exe;
break;
}
}
@@ -897,16 +913,13 @@ namespace Umbraco.Core.Persistence
/// </remarks>
private int ExecuteSqlLocalDb(string args, out string output, out string error)
{
var programFiles = Environment.GetEnvironmentVariable("ProgramFiles");
if (programFiles == null)
if (_exe == null) // should never happen - we should not execute if not available
{
output = string.Empty;
error = "SqlLocalDB.exe not found";
return -1;
}
var path = Path.Combine(programFiles, string.Format(@"Microsoft SQL Server\{0}0\Tools\Binn\SqlLocalDB.exe", _version));
var p = new Process
{
StartInfo =
@@ -914,7 +927,7 @@ namespace Umbraco.Core.Persistence
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = path,
FileName = _exe,
Arguments = args,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
@@ -929,7 +942,7 @@ namespace Umbraco.Core.Persistence
}
/// <summary>
/// Returns a Unicode string with the delimiters added to make the input string a valid SQL Server delimited identifier.
/// Returns a Unicode string with the delimiters added to make the input string a valid SQL Server delimited identifier.
/// </summary>
/// <param name="name">The name to quote.</param>
/// <param name="quote">A quote character.</param>
@@ -687,8 +687,8 @@ ORDER BY contentNodeId, versionId, propertytypeid
case "NAME":
return "umbracoNode.text";
case "PUBLISHED":
case "OWNER":
return "cmsDocument.published";
case "OWNER":
//TODO: This isn't going to work very nicely because it's going to order by ID, not by letter
return "umbracoNode.nodeUser";
// Members only
@@ -124,12 +124,15 @@ namespace Umbraco.Core.Security
var found = _userService.GetUserById(asInt.Result);
if (found != null)
{
// we have to remember whether Logins property is dirty, since the UpdateMemberProperties will reset it.
var isLoginsPropertyDirty = user.IsPropertyDirty("Logins");
if (UpdateMemberProperties(found, user))
{
_userService.Save(found);
}
if (user.IsPropertyDirty("Logins"))
if (isLoginsPropertyDirty)
{
var logins = await GetLoginsAsync(user);
_externalLoginService.SaveUserLogins(found.Id, logins);
@@ -1,5 +1,6 @@
using System;
using System.Collections.Specialized;
using System.ComponentModel.DataAnnotations;
using System.Configuration.Provider;
using System.Security.Cryptography;
using System.Text;
@@ -8,6 +9,7 @@ using System.Web;
using System.Web.Configuration;
using System.Web.Hosting;
using System.Web.Security;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
@@ -677,11 +679,7 @@ namespace Umbraco.Core.Security
internal static bool IsEmailValid(string email)
{
const string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
return Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
return new EmailAddressAttribute().IsValid(email);
}
protected internal string EncryptOrHashPassword(string pass, string salt)
+6 -6
View File
@@ -10,7 +10,7 @@ namespace Umbraco.Core.Services
{
private readonly IDatabaseUnitOfWorkProvider _uowProvider;
private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim();
private readonly Dictionary<int, TypedId<Guid>> _id2Key = new Dictionary<int, TypedId<Guid>>();
private readonly Dictionary<Guid, TypedId<int>> _key2Id = new Dictionary<Guid, TypedId<int>>();
@@ -39,8 +39,8 @@ namespace Umbraco.Core.Services
int? val;
using (var uow = _uowProvider.GetUnitOfWork())
{
val = uow.Database.ExecuteScalar<int?>("SELECT id FROM umbracoNode WHERE uniqueId=@id AND nodeObjectType=@nodeObjectType",
new { id = key, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
val = uow.Database.ExecuteScalar<int?>("SELECT id FROM umbracoNode WHERE uniqueId=@id AND (nodeObjectType=@type OR nodeObjectType=@reservation)",
new { id = key, type = GetNodeObjectTypeGuid(umbracoObjectType), reservation = Constants.ObjectTypes.IdReservationGuid });
uow.Commit();
}
@@ -92,8 +92,8 @@ namespace Umbraco.Core.Services
Guid? val;
using (var uow = _uowProvider.GetUnitOfWork())
{
val = uow.Database.ExecuteScalar<Guid?>("SELECT uniqueId FROM umbracoNode WHERE id=@id AND nodeObjectType=@nodeObjectType",
new { id, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
val = uow.Database.ExecuteScalar<Guid?>("SELECT uniqueId FROM umbracoNode WHERE id=@id AND (nodeObjectType=@type OR nodeObjectType=@reservation)",
new { id, type = GetNodeObjectTypeGuid(umbracoObjectType), reservation = Constants.ObjectTypes.IdReservationGuid });
uow.Commit();
}
@@ -179,7 +179,7 @@ namespace Umbraco.Core.Services
{
private readonly T _id;
private readonly UmbracoObjectTypes _umbracoObjectType;
public T Id
{
get { return _id; }
@@ -26,15 +26,15 @@ namespace Umbraco.Tests.Services
public override void TearDown()
{
base.TearDown();
}
}
[Test]
public void EntityService_Can_Get_Paged_Content_Children()
{
var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage");
var root = MockedContent.CreateSimpleContent(contentType);
var root = MockedContent.CreateSimpleContent(contentType);
ServiceContext.ContentService.Save(root);
for (int i = 0; i < 10; i++)
{
@@ -45,7 +45,7 @@ namespace Umbraco.Tests.Services
var service = ServiceContext.EntityService;
long total;
var entities = service.GetPagedChildren(root.Id, UmbracoObjectTypes.Document, 0, 6, out total).ToArray();
var entities = service.GetPagedChildren(root.Id, UmbracoObjectTypes.Document, 0, 6, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
entities = service.GetPagedChildren(root.Id, UmbracoObjectTypes.Document, 1, 6, out total).ToArray();
@@ -72,7 +72,7 @@ namespace Umbraco.Tests.Services
var c2 = MockedContent.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), c1);
ServiceContext.ContentService.Save(c2);
count++;
}
}
}
var service = ServiceContext.EntityService;
@@ -181,7 +181,7 @@ namespace Umbraco.Tests.Services
var root = MockedContent.CreateSimpleContent(contentType);
ServiceContext.ContentService.Save(root);
for (int i = 0; i < 10; i++)
{
var c1 = MockedContent.CreateSimpleContent(contentType, "ssss" + Guid.NewGuid(), root);
@@ -204,7 +204,7 @@ namespace Umbraco.Tests.Services
Assert.That(entities.Length, Is.EqualTo(50));
Assert.That(total, Is.EqualTo(50));
}
[Test]
public void EntityService_Can_Get_Paged_Media_Children()
{
@@ -227,7 +227,7 @@ namespace Umbraco.Tests.Services
Assert.That(total, Is.EqualTo(10));
entities = service.GetPagedChildren(root.Id, UmbracoObjectTypes.Media, 1, 6, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
Assert.That(total, Is.EqualTo(10));
}
[Test]
@@ -362,7 +362,7 @@ namespace Umbraco.Tests.Services
var root = MockedMedia.CreateMediaFolder(folderType, -1);
ServiceContext.MediaService.Save(root);
for (int i = 0; i < 10; i++)
{
var c1 = MockedMedia.CreateMediaImage(imageMediaType, root.Id);
@@ -519,7 +519,7 @@ namespace Umbraco.Tests.Services
Assert.That(
entities.Any(
x =>
x.AdditionalData.Any(y => y.Value is UmbracoEntity.EntityProperty
x.AdditionalData.Any(y => y.Value is UmbracoEntity.EntityProperty
&& ((UmbracoEntity.EntityProperty)y.Value).PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)), Is.True);
}
@@ -575,6 +575,30 @@ namespace Umbraco.Tests.Services
Assert.IsFalse(result2.Success);
}
[Test]
public void ReserveId()
{
var service = ServiceContext.EntityService;
var guid = Guid.NewGuid();
// can reserve
var reservedId = service.ReserveId(guid);
Assert.IsTrue(reservedId > 0);
// can get it back
var id = service.GetIdForKey(guid, UmbracoObjectTypes.DocumentType);
Assert.IsTrue(id.Success);
Assert.AreEqual(reservedId, id.Result);
// anything goes
id = service.GetIdForKey(guid, UmbracoObjectTypes.Media);
Assert.IsTrue(id.Success);
Assert.AreEqual(reservedId, id.Result);
// a random guid won't work
Assert.IsFalse(service.GetIdForKey(Guid.NewGuid(), UmbracoObjectTypes.DocumentType).Success);
}
private static bool _isSetup = false;
private int folderId;
@@ -589,7 +613,7 @@ namespace Umbraco.Tests.Services
//Create and Save folder-Media -> 1050
var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031);
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
ServiceContext.MediaService.Save(folder, 0);
folderId = folder.Id;
@@ -607,9 +631,9 @@ namespace Umbraco.Tests.Services
ServiceContext.MediaService.Save(subfolder, 0);
var subfolder2 = MockedMedia.CreateMediaFolder(folderMediaType, subfolder.Id);
ServiceContext.MediaService.Save(subfolder2, 0);
}
}
}
}
@@ -17,6 +17,8 @@ namespace Umbraco.Tests.Strings
Assert.IsTrue(foo.IsValid("futureTLD@somewhere.fooo"));
Assert.IsTrue(foo.IsValid("abc@xyz.financial"));
Assert.IsTrue(foo.IsValid("admin+gmail-syntax@c.pizza"));
Assert.IsTrue(foo.IsValid("admin@c.pizza"));
Assert.IsFalse(foo.IsValid("fdsa"));
Assert.IsFalse(foo.IsValid("fdsa@"));
@@ -22,5 +22,40 @@ namespace Umbraco.Tests.Web.Mvc
var expected = "<div><h1>hello world</h1><p>hello world<br />hello world<br />hello world<br />hello world</p></div>";
Assert.AreEqual(expected, output);
}
[Test]
public void TruncateWithElipsis()
{
var output = _htmlStringUtilities.Truncate("hello world", 5, true, false).ToString();
var expected = "hello&hellip;";
Assert.AreEqual(expected, output);
}
[Test]
public void TruncateWithoutElipsis()
{
var output = _htmlStringUtilities.Truncate("hello world", 5, false, false).ToString();
var expected = "hello";
Assert.AreEqual(expected, output);
}
[Test]
public void TruncateShorterWordThanHellip()
{
//http://issues.umbraco.org/issue/U4-10478
var output = _htmlStringUtilities.Truncate("hi", 5, true, false).ToString();
var expected = "hi";
Assert.AreEqual(expected, output);
}
[Test]
public void TruncateAndRemoveSpaceBetweenHellipAndWord()
{
var output = _htmlStringUtilities.Truncate("hello world", 6 /* hello plus space */, true, false).ToString();
var expected = "hello&hellip;";
Assert.AreEqual(expected, output);
}
}
}
@@ -361,11 +361,29 @@ Umbraco.Sys.registerNamespace("Umbraco.Application");
rootScope : function(){
return getRootScope();
},
reloadLocation: function() {
var injector = getRootInjector();
var $route = injector.get("$route");
$route.reload();
/**
This will reload the content frame based on it's current route, if pathToMatch is specified it will only reload it if the current
location matches the path
*/
reloadLocation: function(pathToMatch) {
var injector = getRootInjector();
var doChange = true;
if (pathToMatch) {
var $location = injector.get("$location");
var path = $location.path();
if (path != pathToMatch) {
doChange = false;
}
}
if (doChange) {
var $route = injector.get("$route");
$route.reload();
var $rootScope = injector.get("$rootScope");
$rootScope.$apply();
}
},
closeModalWindow: function(rVal) {
@@ -47,8 +47,8 @@ function valEmail(valEmailExpression) {
angular.module('umbraco.directives.validation')
.directive("valEmail", valEmail)
.factory('valEmailExpression', function () {
//NOTE: This is the fixed regex which is part of the newer angular
var emailRegex = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
return {
EMAIL_REGEXP: /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i
EMAIL_REGEXP: emailRegex
};
});
@@ -269,7 +269,8 @@
var isSelected = false;
for (var i = 0; selection.length > i; i++) {
var selectedItem = selection[i];
if (item.id === selectedItem.id || item.key === selectedItem.key) {
// if item.id is 2147483647 (int.MaxValue) use item.key
if ((item.id !== 2147483647 && item.id === selectedItem.id) || item.key === selectedItem.key) {
isSelected = true;
}
}
@@ -294,7 +295,8 @@
function deselectItem(item, selection) {
for (var i = 0; selection.length > i; i++) {
var selectedItem = selection[i];
if (item.id === selectedItem.id) {
// if item.id is 2147483647 (int.MaxValue) use item.key
if ((item.id !== 2147483647 && item.id === selectedItem.id) || item.key === selectedItem.key) {
selection.splice(i, 1);
item.selected = false;
}
@@ -366,7 +368,7 @@
var item = items[i];
if (checkbox.checked) {
selection.push({ id: item.id });
selection.push({ id: item.id, key: item.key });
} else {
clearSelection = true;
}
@@ -405,7 +407,8 @@
for (var selectedIndex = 0; selection.length > selectedIndex; selectedIndex++) {
var selectedItem = selection[selectedIndex];
if (item.id === selectedItem.id) {
// if item.id is 2147483647 (int.MaxValue) use item.key
if ((item.id !== 2147483647 && item.id === selectedItem.id) || item.key === selectedItem.key) {
numberOfSelectedItem++;
}
}
@@ -11,6 +11,18 @@
{ "value": 3, "name": "Invited", "key": "Invited", "color": "warning" }
];
angular.forEach(userStates, function (userState) {
var key = "user_state" + userState.key;
localizationService.localize(key).then(function (value) {
var reg = /^\[[\S\s]*]$/g;
var result = reg.test(value);
if (result === false) {
// Only translate if key exists
userState.name = value;
}
});
});
function getUserStateFromValue(value) {
var foundUserState;
angular.forEach(userStates, function (userState) {
@@ -18,7 +18,7 @@
<div class="control-group">
<label class="control-label" for="email">Email</label>
<div class="controls">
<input type="text" id="email" name="email" placeholder="you@example.com" required ng-model="installer.current.model.email" val-email />
<input type="email" id="email" name="email" placeholder="you@example.com" required ng-model="installer.current.model.email" val-email />
<small class="inline-help">Your email will be used as your login</small>
</div>
</div>
@@ -2,7 +2,7 @@
position: fixed;
overflow: hidden;
background: @white;
z-index: 7500;
z-index: @zindexUmbOverlay;
animation: fadeIn 0.2s;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
}
@@ -3,8 +3,8 @@
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.50);
z-index: 2000;
z-index: @zindexOverlayBackdrop;
top: 0;
left: 0;
animation: fadeIn 0.2s;
}
}
@@ -6,6 +6,7 @@
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
color: @black;
font-weight: bold;
font-size: 16px;
@@ -11,6 +11,8 @@
flex: 0 0 100%;
max-width: 100%;
display: flex;
flex-wrap: wrap;
flex-direction: column;
}
.umb-user-card:hover,
@@ -5,21 +5,20 @@
top: -30px;
padding-top: 30px;
box-shadow: inset 0px -40px 30px 25px rgba(255,255,255,1);
border-radius: 0px 0px 200px 200px;
-moz-border-radius: 0px 0px 200px 200px;
-moz-border-radius: 0px 0px 200px 200px;
-webkit-border-radius: 0px 0px 200px 200px;
border-radius: 0px 0px 200px 200px;
small {
font-size: 14px;
opacity: .5;
}
.umb-loader{
.umb-loader {
width: 640px;
height: 4px;
}
.video_player{
video {
width: 100%;
@@ -27,8 +26,8 @@
border: 1px solid @gray-9;
border-left: none;
border-bottom: none;
-moz-box-sizing:border-box;
box-sizing:border-box;
-moz-box-sizing:border-box;
}
input[type="range"] {
@@ -67,8 +66,8 @@
.progress-bar {
display: block;
box-sizing: border-box;
-moz-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing: border-box;
max-width: 100%;
width: 200px;
height: 100%;
@@ -112,26 +111,25 @@
line-height: 80px;
text-align: center;
position: relative;
display: flex;
justify-content: center;
i, h3 {
.icon, h3 {
display: inline-block;
}
i {
position: absolute;
top: 50%;
margin-top: -40px;
.icon {
font-size: 80px;
}
h3 {
margin: 0;
margin: 0 0 0 20px;
line-height: 80px;
font-weight: 700;
margin-left: 100px;
font-size: 36px;
letter-spacing: -1px;
}
}
}
}
@@ -249,6 +249,11 @@
border-radius: 0;
}
// fix dropdown with checkbox + long text in label
.dropdown-menu > li > .flex > label {
flex: 1 1 0;
}
.dropdown-menu > li > a {
padding: 8px 20px;
}
@@ -304,7 +304,7 @@ ul.color-picker li a {
top: 0;
left: 0;
cursor: move;
z-index: 6001;
z-index: @zindexCropperOverlay;
position: absolute;
}
@@ -331,7 +331,7 @@ ul.color-picker li a {
left: 0;
width: 100%;
height: 100%;
z-index: 5999;
z-index: @zindexCropperOverlay - 1;
-moz-opacity: .75;
opacity: .75;
filter: alpha(opacity=7);
@@ -438,6 +438,7 @@ ul.color-picker li a {
top: 3px;
right: 3px;
cursor: pointer;
z-index: 1;
}
.umb-close-cropper:hover {
+2 -1
View File
@@ -119,6 +119,7 @@
.umb-tree div > a.umb-options {
visibility: hidden;
flex: 1 0 auto;
}
.umb-tree div:hover > a.umb-options {
visibility: visible;
@@ -156,8 +157,8 @@
.umb-tree li > div a:not(.umb-options) {
padding: 6px 0;
width: 100%;
display: flex;
flex: 1 1 100%;
}
.umb-tree li > div:hover a:not(.umb-options) {
@@ -230,6 +230,12 @@
@zindexModalBackdrop: 1040;
@zindexModal: 1050;
@zindexUmbOverlay: 7500;
@zindexOverlayBackdrop: 2000;
// Sticky bar has a z-index of "500", which is set from javascript in directive
// so set z-index of cropper should be lower to be behind sticky bar.
@zindexCropperOverlay: 499;
// Sprite icons path
// -------------------------
+14 -10
View File
@@ -31,6 +31,12 @@ app.config(function ($routeProvider) {
userService.getCurrentUser({ broadcastEvent: broadcast }).then(function (user) {
//is auth, check if we allow or reject
if (isRequired) {
//This checks the current section and will force a redirect to 'content' as the default
if ($route.current.params.section.toLowerCase() === "default" || $route.current.params.section.toLowerCase() === "umbraco" || $route.current.params.section === "") {
$route.current.params.section = "content";
}
// U4-5430, Benjamin Howarth
// We need to change the current route params if the user only has access to a single section
// To do this we need to grab the current user's allowed sections, then reject the promise with the correct path.
@@ -98,26 +104,24 @@ app.config(function ($routeProvider) {
resolve: doLogout()
})
.when('/:section', {
//This allows us to dynamically change the template for this route since you cannot inject services into the templateUrl method.
template: "<div ng-include='templateUrl'></div>",
//This controller will execute for this route, then we can execute some code in order to set the template Url
controller: function ($scope, $route, $routeParams, $location, sectionService) {
if ($routeParams.section.toLowerCase() === "default" || $routeParams.section.toLowerCase() === "umbraco" || $routeParams.section === "") {
$routeParams.section = "content";
}
//We are going to check the currently loaded sections for the user and if the section we are navigating
//We are going to check the currently loaded sections for the user and if the section we are navigating
//to has a custom route path we'll use that
sectionService.getSectionsForUser().then(function(sections) {
//find the one we're requesting
//find the one we're requesting
var found = _.find(sections, function(s) {
return s.alias === $routeParams.section;
})
})
if (found && found.routePath) {
//there's a custom route path so redirect
$location.path(found.routePath);
}
else {
else {
//there's no custom route path so continue as normal
$routeParams.url = "dashboard.aspx?app=" + $routeParams.section;
$scope.templateUrl = 'views/common/dashboard.html';
@@ -138,8 +142,8 @@ app.config(function ($routeProvider) {
})
.when('/:section/:tree/:method', {
templateUrl: function (rp) {
//if there is no method registered for this then show the dashboard
//if there is no method registered for this then show the dashboard
if (!rp.method)
return "views/common/dashboard.html";
@@ -16,6 +16,6 @@
<a class="umb-node-preview__action" title="Open" href="" ng-if="allowEdit" ng-click="onEdit()"><localize key="general_edit">Edit</localize></a>
<a class="umb-node-preview__action" title="Open" href="" 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="" ng-if="allowRemove" ng-click="onRemove()"><localize key="general_remove">Remove</localize></i></a>
<div>
</div>
</div>
@@ -2,7 +2,7 @@
<div style="max-width: 800px; text-align: center; margin: auto; padding: 20px; min-height: 800px;">
<div class="installer-top"> <!-- ADDED -->
<i style="font-size: 80px" class="icon icon-umb-contour"></i>
<i class="icon icon-umb-contour"></i>
<h3>Umbraco Forms</h3>
</div> <!-- ADDED -->
@@ -15,7 +15,7 @@
//note on the below, we dont assign a view unless it's the right route since if we did that it will load in that controller
//for the view which is unecessary and will cause extra overhead/requests to occur
vm.page = {};
vm.page.name = "User Management";
vm.page.name = localizationService.localize("user_userManagement");
vm.page.navigation = [
{
"name": localizationService.localize("sections_users"),
@@ -1,7 +1,7 @@
(function () {
"use strict";
function UserEditController($scope, $timeout, $location, $routeParams, formHelper, usersResource, contentEditingHelper, localizationService, notificationsService, mediaHelper, Upload, umbRequestHelper, usersHelper, authResource, dateHelper) {
function UserEditController($scope, $timeout, $location, $routeParams, formHelper, usersResource, userService, contentEditingHelper, localizationService, notificationsService, mediaHelper, Upload, umbRequestHelper, usersHelper, authResource, dateHelper) {
var vm = this;
@@ -92,7 +92,7 @@
});
}
function getLocalDate(date, format) {
function getLocalDate(date, culture, format) {
if(date) {
var dateVal;
var serverOffset = Umbraco.Sys.ServerVariables.application.serverTimeOffset;
@@ -105,7 +105,7 @@
dateVal = moment(date, "YYYY-MM-DD HH:mm:ss");
}
return dateVal.format(format);
return dateVal.locale(culture).format(format);
}
}
@@ -393,11 +393,14 @@
}
function formatDatesToLocal(user) {
user.formattedLastLogin = getLocalDate(user.lastLoginDate, "MMMM Do YYYY, HH:mm");
user.formattedLastLockoutDate = getLocalDate(user.lastLockoutDate, "MMMM Do YYYY, HH:mm");
user.formattedCreateDate = getLocalDate(user.createDate, "MMMM Do YYYY, HH:mm");
user.formattedUpdateDate = getLocalDate(user.updateDate, "MMMM Do YYYY, HH:mm");
user.formattedLastPasswordChangeDate = getLocalDate(user.lastPasswordChangeDate, "MMMM Do YYYY, HH:mm");
// get current backoffice user and format dates
userService.getCurrentUser().then(function (currentUser) {
user.formattedLastLogin = getLocalDate(user.lastLoginDate, currentUser.locale, "LLL");
user.formattedLastLockoutDate = getLocalDate(user.lastLockoutDate, currentUser.locale, "LLL");
user.formattedCreateDate = getLocalDate(user.createDate, currentUser.locale, "LLL");
user.formattedUpdateDate = getLocalDate(user.updateDate, currentUser.locale, "LLL");
user.formattedLastPasswordChangeDate = getLocalDate(user.lastPasswordChangeDate, currentUser.locale, "LLL");
});
}
init();
@@ -18,7 +18,7 @@
</umb-load-indicator>
<div ng-if="!vm.loading" class="umb-packages-view-wrapper" style="padding: 0;">
<div class="umb-package-details">
<div class="umb-package-details__main-content">
@@ -30,17 +30,19 @@
<umb-box-content class="block-form">
<umb-control-group label="@general_email" required="true">
<input
type="email"
localize="placeholder"
placeholder="@placeholders_enteremail"
class="input-block-level"
<input
type="email"
localize="placeholder"
placeholder="@placeholders_enteremail"
class="input-block-level"
ng-model="vm.user.email"
umb-auto-focus name="email"
required
val-email
required
val-server-field="Email" />
<span class="help-inline" val-msg-for="email" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
</umb-control-group>
<umb-control-group label="@general_username" ng-if="!vm.usernameIsEmail" required="true">
@@ -51,7 +53,7 @@
class="input-block-level"
ng-model="vm.user.username"
umb-auto-focus name="username"
required
required
val-server-field="Username" />
<span class="help-inline" val-msg-for="username" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
<span class="help-inline" val-msg-for="username" val-toggle-msg="valServerField"></span>
@@ -53,6 +53,7 @@
<umb-button
type="button"
label="Delete"
label-key="general_delete"
icon="icon-trash"
action="vm.deleteUserGroups()"
size="xs">
@@ -1,7 +1,7 @@
(function () {
"use strict";
function UsersController($scope, $timeout, $location, usersResource, userGroupsResource, localizationService, contentEditingHelper, usersHelper, formHelper, notificationsService, dateHelper) {
function UsersController($scope, $timeout, $location, usersResource, userGroupsResource, userService, localizationService, contentEditingHelper, usersHelper, formHelper, notificationsService, dateHelper) {
var vm = this;
var localizeSaving = localizationService.localize("general_saving");
@@ -20,6 +20,19 @@
{ label: "Oldest", key: "CreateDate", direction: "Ascending" },
{ label: "Last login", key: "LastLoginDate", direction: "Descending" }
];
angular.forEach(vm.userSortData, function (userSortData) {
var key = "user_sort" + userSortData.key + userSortData.direction;
localizationService.localize(key).then(function (value) {
var reg = /^\[[\S\s]*]$/g;
var result = reg.test(value);
if (result === false) {
// Only translate if key exists
userSortData.label = value;
}
});
});
vm.userStatesFilter = [];
vm.newUser.userGroups = [];
vm.usersViewState = 'overview';
@@ -284,10 +297,10 @@
vm.selectedBulkUserGroups = _.clone(firstSelectedUser.userGroups);
vm.userGroupPicker = {
title: "Select user groups",
title: localizationService.localize("user_selectUserGroups"),
view: "usergrouppicker",
selection: vm.selectedBulkUserGroups,
closeButtonLabel: "Cancel",
closeButtonLabel: localizationService.localize("general_cancel"),
show: true,
submit: function (model) {
usersResource.setUserGroupsOnUsers(model.selection, vm.selection).then(function (data) {
@@ -320,10 +333,10 @@
function openUserGroupPicker(event) {
vm.userGroupPicker = {
title: "Select user groups",
title: localizationService.localize("user_selectUserGroups"),
view: "usergrouppicker",
selection: vm.newUser.userGroups,
closeButtonLabel: "Cancel",
closeButtonLabel: localizationService.localize("general_cancel"),
show: true,
submit: function (model) {
// apply changes
@@ -583,7 +596,10 @@
dateVal = moment(user.lastLoginDate, "YYYY-MM-DD HH:mm:ss");
}
user.formattedLastLogin = dateVal.format("MMMM Do YYYY, HH:mm");
// get current backoffice user and format date
userService.getCurrentUser().then(function (currentUser) {
user.formattedLastLogin = dateVal.locale(currentUser.locale).format("LLL");
});
}
});
}
@@ -27,7 +27,8 @@
expect(valEmailExpression.EMAIL_REGEXP.test('a@3b.c')).toBe(true);
expect(valEmailExpression.EMAIL_REGEXP.test('a@b')).toBe(true);
expect(valEmailExpression.EMAIL_REGEXP.test('abc@xyz.financial')).toBe(true);
expect(valEmailExpression.EMAIL_REGEXP.test('admin@c.pizza')).toBe(true);
expect(valEmailExpression.EMAIL_REGEXP.test('admin+gmail-syntax@c.pizza')).toBe(true);
});
});
+2 -2
View File
@@ -1027,9 +1027,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>7710</DevelopmentServerPort>
<DevelopmentServerPort>7720</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:7710</IISUrl>
<IISUrl>http://localhost:7720</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
@@ -1,4 +1,5 @@
@using Umbraco.Web
@using Umbraco.Core.Configuration
@using Umbraco.Web
@using Umbraco.Web.Install.Controllers
@{
Layout = null;
+366 -110
View File
@@ -12,13 +12,12 @@
<key alias="copy">Kopier</key>
<key alias="create">Opret</key>
<key alias="createPackage">Opret pakke</key>
<key alias="createGroup">Opret gruppe</key>
<key alias="delete">Slet</key>
<key alias="disable">Deaktivér</key>
<key alias="emptyTrashcan">Tøm papirkurv</key>
<key alias="enable">Aktivér</key>
<key alias="exportDocumentType">Eksportér dokumenttype</key>
<key alias="exportDocumentTypeAsCode">Eksportér til .NET</key>
<key alias="exportDocumentTypeAsCode-Full">Eksportér til .NET</key>
<key alias="importDocumentType">Importér dokumenttype</key>
<key alias="importPackage">Importér pakke</key>
<key alias="liveEdit">Redigér i Canvas</key>
@@ -30,15 +29,48 @@
<key alias="unpublish">Fortryd udgivelse</key>
<key alias="refreshNode">Genindlæs elementer</key>
<key alias="republish">Genudgiv hele sitet</key>
<key alias="rename" version="7.3.0">Omdøb</key>
<key alias="restore" version="7.3.0">Gendan</key>
<key alias="SetPermissionsForThePage">Sæt rettigheder for siden %0%</key>
<key alias="chooseWhereToMove">Vælg hvortil du vil flytte</key>
<key alias="toInTheTreeStructureBelow">I træstrukturen nedenfor</key>
<key alias="rights">Rettigheder</key>
<key alias="rollback">Fortryd ændringer</key>
<key alias="sendtopublish">Send til udgivelse</key>
<key alias="sendToTranslate">Send til oversættelse</key>
<key alias="setGroup">Sæt gruppe</key>
<key alias="sort">Sortér</key>
<key alias="translate">Oversæt</key>
<key alias="update">Opdatér</key>
<key alias="setPermissions">Sæt rettigheder</key>
<key alias="unlock">Lås op</key>
<key alias="createblueprint">Opret indholdsskabelon</key>
</area>
<area alias="actionCategories">
<key alias="content">Indhold</key>
<key alias="administration">Administration</key>
<key alias="structure">Struktur</key>
<key alias="other">Andet</key>
</area>
<area alias="actionDescriptions">
<key alias="assignDomain">Tillad adgang til at tildele sprog og domæner</key>
<key alias="auditTrail">Tillad adgang for at få vist en nodes historik</key>
<key alias="browse">Tillad adgang for at få vist en node</key>
<key alias="changeDocType">Tillad adgang til at ændre dokumenttype for en node</key>
<key alias="copy">Tillad adgang til at kopiere en node</key>
<key alias="create">Tillad adgang til at oprette noder</key>
<key alias="delete">Tillad adgang til at slette noder</key>
<key alias="move">Tillad adgang til at flytte en node</key>
<key alias="protect">Tillad adgang til at indstille og ændre offentlig adgang til en node</key>
<key alias="publish">Tillad adgang til at udgive en node</key>
<key alias="rights">Tillad adgang til at ændre rettigheder for en node</key>
<key alias="rollback">Tillad adgang til at returnere en node til en tidligere tilstand</key>
<key alias="sendtopublish">Tillad adgang til at sende en node til godkendelse før den udgives</key>
<key alias="sendToTranslate">Tillad adgang til at sende en node til oversættelse</key>
<key alias="sort">Tillad adgang til at ændre sorteringsrækkefølge for noder</key>
<key alias="translate">Tillad adgang til at oversætte en node</key>
<key alias="update">Tillad adgang til at gemme en node</key>
<key alias="createblueprint">Tillad adgang til at oprette en indholdsskabelon</key>
</area>
<area alias="assignDomain">
<key alias="permissionDenied">Tilladelse nægtet.</key>
@@ -55,6 +87,13 @@
<key alias="domainUpdated">Domænet '%0%' er nu opdateret</key>
<key alias="orEdit">eller rediger nuværende domæner</key>
<key alias="domainHelp">f.eks. ditdomaene.com, www.ditdomaene.com</key>
<key alias="inherit">Nedarv</key>
<key alias="setLanguage">Sprog</key>
<key alias="setLanguageHelp">
<![CDATA[Indstil sproget for noder under den aktuelle node,<br /> eller nedarv sprog fra forældre noder. Gælder også<br />
for den aktuelle node, medmindre et domæne nedenfor også indstiller et sprog.]]>
</key>
<key alias="setDomains">Domæner</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">For</key>
@@ -92,6 +131,9 @@
<key alias="styleShow">Vis koder</key>
<key alias="tableInsert">Indsæt tabel</key>
<key alias="generateModels">Generer modeller</key>
<key alias="saveAndGenerateModels">Gem og generer modeller</key>
<key alias="undo">Fortryd</key>
<key alias="redo">Genskab</key>
</area>
<area alias="changeDocType">
<key alias="changeDocTypeInstruction">For at skifte det valgte indholds dokumenttype, skal du først vælge en ny dokumenttype, som er gyldig på denne placering.</key>
@@ -131,7 +173,10 @@
<key alias="itemChanged">Dette punkt er ændret siden udgivelsen</key>
<key alias="itemNotPublished">Dette punkt er endnu ikke udgivet</key>
<key alias="lastPublished">Sidst udgivet</key>
<key alias="noItemsToShow">Der er ingen elementer at vise</key>
<key alias="listViewNoItems" version="7.1.5">Der er ingen elementer at vise på listen.</key>
<key alias="listViewNoContent">Intet indhold er blevet tilføjet</key>
<key alias="listViewNoMembers">Ingen medlemmer er blevet tilføjet</key>
<key alias="mediatype">Medietype</key>
<key alias="mediaLinks">Link til medie(r)</key>
<key alias="membergroup">Medlemsgruppe</key>
@@ -142,6 +187,8 @@
<key alias="otherElements">Egenskaber</key>
<key alias="parentNotPublished">Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er udgivet!</key>
<key alias="parentNotPublishedAnomaly">Upd: dette dokument er udgiver, men er ikke i cachen (intern fejl)</key>
<key alias="getUrlException">Kunne ikke hente url'en</key>
<key alias="routeError">Dette dokument er udgivet, men dets url ville kollidere med indholdet %0%</key>
<key alias="publish">Udgivet</key>
<key alias="publishStatus">Udgivelsesstatus</key>
<key alias="releaseDate">Udgivelsesdato</key>
@@ -162,6 +209,22 @@
<key alias="notmemberof">Ikke medlem af grupper(ne)</key>
<key alias="childItems" version="7.0">Undersider</key>
<key alias="target" version="7.0">Åben i vindue</key>
<key alias="scheduledPublishServerTime">Dette oversætter til den følgende tid på serveren:</key>
<key alias="scheduledPublishDocumentation"><![CDATA[<a href="https://our.umbraco.org/documentation/Getting-Started/Data/Scheduled-Publishing/#timezones" target="_blank">Hvad betyder det?</a>]]></key>
<key alias="nestedContentDeleteItem">Er du sikker på, at du vil slette dette element?</key>
<key alias="nestedContentEditorNotSupported">Egenskaben %0% anvender editoren %1% som ikke er understøttet af Nested Content.</key>
<key alias="addTextBox">Tilføj en ny tekstboks</key>
<key alias="removeTextBox">Fjern denne tekstboks</key>
<key alias="contentRoot">Indholdsrod</key>
</area>
<area alias="blueprints">
<key alias="createBlueprintFrom">Opret en ny indholdsskabelon fra '%0%'</key>
<key alias="blankBlueprint">Blank</key>
<key alias="selectBlueprint">Vælg en indholdsskabelon</key>
<key alias="createdBlueprintHeading">Indholdsskabelon oprettet</key>
<key alias="createdBlueprintMessage">En indholdsskabelon blev oprettet fra '%0%'</key>
<key alias="duplicateBlueprintMessage">En anden indholdsskabelon med samme navn eksisterer allerede</key>
<key alias="blueprintDescription">En indholdskabelon er foruddefineret indhold, som en redaktør kan vælge at bruge som grundlag for at oprette nyt indhold</key>
</area>
<area alias="media">
<key alias="clickToUpload">Klik for at uploade</key>
@@ -169,7 +232,9 @@
<key alias="urls">Link til medie</key>
<key alias="orClickHereToUpload">eller klik her for at vælge filer</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>
<key alias="mediaRoot">Medie rod</key>
</area>
<area alias="member">
<key alias="createNewMember">Opret et nyt medlem</key>
@@ -178,14 +243,21 @@
<area alias="create">
<key alias="chooseNode">Hvor ønsker du at oprette den nye %0%</key>
<key alias="createUnder">Opret under</key>
<key alias="createContentBlueprint">Vælg den dokumenttype, du vil oprette en indholdsskabelon til</key>
<key alias="updateData">Vælg en type og skriv en titel</key>
<key alias="noDocumentTypes" version="7.0"><![CDATA[Der kunne ikke findes nogen tilladte dokument typer. Du skal tillade disse i indstillinger under <strong>"dokument typer"</strong>.]]></key>
<key alias="noMediaTypes" version="7.0"><![CDATA[Der kunne ikke findes nogen tilladte media typer. Du skal tillade disse i indstillinger under <strong>"media typer"</strong>.]]></key>
<key alias="documentTypeWithoutTemplate">Dokumenttype uden skabelon</key>
<key alias="newEmptyPartialView">Ny tom partial view</key>
<key alias="newFolder">Ny mappe</key>
<key alias="newDataType">Ny datatype</key>
<key alias="newJavascriptFile">Ny javascript fil</key>
<key alias="newEmptyPartialView">Ny tom partial view</key>
<key alias="newFolder">Ny mappe</key>
<key alias="newPartialViewMacro">Ny partial view makro</key>
<key alias="newPartialViewFromSnippet">Ny partial view fra snippet</key>
<key alias="newEmptyPartialViewMacro">Ny tom partial view makro</key>
<key alias="newPartialViewMacroFromSnippet">Ny partial view makro fra snippet</key>
<key alias="newPartialViewMacroNoMacro">Ny partial view makro (uden makro)</key>
</area>
<area alias="dashboard">
<key alias="browser">Til dit website</key>
@@ -231,6 +303,8 @@
<key alias="copiedItemOfItems">Kopierede %0% ud af %1% elementer</key>
</area>
<area alias="defaultdialogs">
<key alias="nodeNameLinkPicker">Link titel</key>
<key alias="urlLinkPicker">Link</key>
<key alias="anchorInsert">Navn på lokalt link</key>
<key alias="assignDomain">Rediger domæner</key>
<key alias="closeThisWindow">Luk denne dialog</key>
@@ -258,6 +332,9 @@
<key alias="macroDoesNotHaveProperties">Denne makro har ingen egenskaber du kan redigere</key>
<key alias="paste">Indsæt tekst</key>
<key alias="permissionsEdit">Rediger rettigheder for</key>
<key alias="permissionsSet">Sæt rettigheder for</key>
<key alias="permissionsSetForGroup">Sæt rettigheder for %0% for brugergruppe %1%</key>
<key alias="permissionsHelp">Vælg de brugergrupper, du vil angive tilladelser til</key>
<key alias="recycleBinDeleting">Elementerne i papirkurven slettes. Luk venligst ikke dette vindue mens sletningen foregår</key>
<key alias="recycleBinIsEmpty">Papirkurven er nu tom</key>
<key alias="recycleBinWarning">Når elementer slettes fra papirkurven, slettes de for altid</key>
@@ -281,20 +358,28 @@
<key alias="linkToPage">Link til side</key>
<key alias="openInNewWindow">Åben linket i et nyt vindue eller fane</key>
<key alias="linkToMedia">Link til medie</key>
<key alias="linkToFile">Link til fil</key>
<key alias="selectContentStartNode">Vælg indhold startnode</key>
<key alias="selectMedia">Vælg medie</key>
<key alias="selectIcon">Vælg ikon</key>
<key alias="selectItem">Vælg item</key>
<key alias="selectLink">Vælg link</key>
<key alias="selectMacro">Vælg makro</key>
<key alias="selectContent">Vælg indhold</key>
<key alias="selectMediaStartNode">Vælg medie startnode</key>
<key alias="selectMember">Vælg medlem</key>
<key alias="selectMemberGroup">Vælg medlemsgruppe</key>
<key alias="selectNode">Vælg node</key>
<key alias="selectSections">Vælg sektioner</key>
<key alias="selectUsers">Vælg brugere</key>
<key alias="noIconsFound">Ingen ikoner blev fundet</key>
<key alias="noMacroParams">Der er ingen parametre for denne makro</key>
<key alias="noMacros">Der er ikke tilføjet nogen makroer</key>
<key alias="linkYour">Link dit</key>
<key alias="unLinkYour">Fjern link fra dit</key>
<key alias="account">konto</key>
<key alias="selectEditor">Vælg editor</key>
<key alias="selectSnippet">Vælg snippet</key>
</area>
<area alias="dictionaryItem">
<key alias="description">
@@ -313,14 +398,18 @@
<area alias="placeholders">
<key alias="username">Indtast dit brugernavn</key>
<key alias="password">Indtast dit kodeord</key>
<key alias="confirmPassword">Bekræft dit kodeord</key>
<key alias="nameentity">Navngiv %0%...</key>
<key alias="entername">Indtast navn...</key>
<key alias="enteremail">Indtast en e-mail...</key>
<key alias="enterusername">Indtast et brugernavn...</key>
<key alias="label">Label...</key>
<key alias="enterDescription">Indtast beskrivelse</key>
<key alias="search">Søg...</key>
<key alias="filter">Filtrer...</key>
<key alias="enterTags">Indtast nøgleord (tryk på Enter efter hvert nøgleord)...</key>
<key alias="email">Indtast din e-mail</key>
<key alias="enterMessage">Indtast en besked...</key>
<key alias="usernameHint">Dit brugernavn er typisk din e-mailadresse</key>
</area>
<area alias="editcontenttype">
@@ -341,6 +430,11 @@
<key alias="createListView" version="7.2">Opret brugerdefineret listevisning</key>
<key alias="removeListView" version="7.2">Fjern brugerdefineret listevisning</key>
</area>
<area alias="renamecontainer">
<key alias="renamed">Omdøbt</key>
<key alias="enterNewFolderName">Indtast et ny mappenavn her</key>
<key alias="folderWasRenamed">%0% was renamed to %1%</key>
</area>
<area alias="editdatatype">
<key alias="addPrevalue">Tilføj førværdi</key>
<key alias="dataBaseDatatype">Database-datatype</key>
@@ -353,6 +447,13 @@
<key alias="rteRelatedStylesheets">Relaterede stylesheets</key>
<key alias="rteShowLabel">Vis label</key>
<key alias="rteWidthAndHeight">Bredde og højde</key>
<key alias="allPropTypes">All property types &amp; property data</key>
<key alias="willBeDeleted">using this data type will be deleted permanently, please confirm you want to delete these as well</key>
<key alias="yesDelete">Ja, slet</key>
<key alias="andAllRelated">and all property types &amp; property data using this data type</key>
<key alias="selectFolder">Vælg den mappe, der skal flyttes</key>
<key alias="inTheTree">til i træstrukturen nedenfor</key>
<key alias="wasMoved">blev flyttet under</key>
</area>
<area alias="errorHandling">
<key alias="errorButDataWasSaved">Dine data er blevet gemt, men før du kan udgive denne side er der nogle fejl der skal rettes:</key>
@@ -424,15 +525,20 @@
<key alias="email">E-mail</key>
<key alias="error">Fejl</key>
<key alias="findDocument">Find</key>
<key alias="first">Første</key>
<key alias="groups">Grupper</key>
<key alias="height">Højde</key>
<key alias="help">Hjælp</key>
<key alias="hide">Skjul</key>
<key alias="icon">Ikon</key>
<key alias="import">Importer</key>
<key alias="innerMargin">Indre margen</key>
<key alias="insert">Indsæt</key>
<key alias="install">Installér</key>
<key alias="invalid">Ugyldig</key>
<key alias="justify">Justering</key>
<key alias="language">Sprog</key>
<key alias="last">Sidste</key>
<key alias="layout">Layout</key>
<key alias="loading">Henter</key>
<key alias="locked">Låst</key>
@@ -440,6 +546,8 @@
<key alias="logoff">Log af</key>
<key alias="logout">Log ud</key>
<key alias="macro">Makro</key>
<key alias="mandatory">Påkrævet</key>
<key alias="message">Besked</key>
<key alias="move">Flyt</key>
<key alias="more">Mere</key>
<key alias="name">Navn</key>
@@ -450,6 +558,7 @@
<key alias="ok">OK</key>
<key alias="open">Åben</key>
<key alias="or">eller</key>
<key alias="orderBy">Sortér efter</key>
<key alias="password">Kodeord</key>
<key alias="path">Sti</key>
<key alias="placeHolderID">Placeholder ID</key>
@@ -464,15 +573,18 @@
<key alias="rename">Omdøb</key>
<key alias="renew">Forny</key>
<key alias="required" version="7.0">Påkrævet</key>
<key alias="retrieve">Hent</key>
<key alias="retry">Prøv igen</key>
<key alias="rights">Rettigheder</key>
<key alias="search">Søg</key>
<key alias="searchNoResult">Beklager, vi kan ikke finde det, du leder efter.</key>
<key alias="noItemsInList">Ingen elementer er blevet tilføjet</key>
<key alias="server">Server</key>
<key alias="show">Vis</key>
<key alias="showPageOnSend">Hvilken side skal vises efter at formularen er sendt</key>
<key alias="size">Størrelse</key>
<key alias="sort">Sortér</key>
<key alias="status">Status</key>
<key alias="submit">Indsend</key>
<!-- TODO: Translate this -->
<key alias="type">Type</key>
@@ -703,7 +815,40 @@ Mange hilsner fra Umbraco robotten
</area>
<area alias="packager">
<key alias="chooseLocalPackageText">Vælg pakken fra din computer. Umbraco pakker er oftest en ".zip" fil</key>
<key alias="packageAuthor">Udvikler</key>
<key alias="dropHere">Slip her for at uploade</key>
<key alias="orClickHereToUpload">eller klik her for at vælge pakkefil</key>
<key alias="uploadPackage">Upload pakke</key>
<key alias="localPackageDescription">Installer en lokal pakke ved at vælge den fra din computer. Installer kun pakker fra kilder, du kender og stoler på</key>
<key alias="uploadAnother">Upload en anden pakke</key>
<key alias="cancelAndUploadAnother">Annuller og upload en anden pakke</key>
<key alias="packageLicense">Licens</key>
<key alias="accept">Jeg accepterer</key>
<key alias="termsOfUse">betingelser for anvendelse</key>
<key alias="packageInstall">Installér pakke</key>
<key alias="installFinish">Afslut</key>
<key alias="installedPackages">Installeret pakker</key>
<key alias="noPackages">Du har ingen pakker installeret</key>
<key alias="noPackagesDescription"><![CDATA[Du har ikke nogen pakker installeret. Du kan enten installere en lokal pakke ved at vælge den fra din computer eller gennemse de tilgængelige pakker ved hjælp af ikonet <strong>'Pakker'</strong> øverst til højre på din skærm]]></key>
<key alias="packageSearch">Søg efter pakker</key>
<key alias="packageSearchResults">Resultater for</key>
<key alias="packageNoResults">Vi kunne ikke finde resultater for</key>
<key alias="packageNoResultsDescription">Prøv venligst at søge efter en anden pakke eller gennemse kategorierne</key>
<key alias="packagesPopular">Populære</key>
<key alias="packagesNew">Nye udgivelser</key>
<key alias="packageHas">har</key>
<key alias="packageKarmaPoints">karma points</key>
<key alias="packageInfo">Information</key>
<key alias="packageOwner">Ejer</key>
<key alias="packageContrib">Bidragsydere</key>
<key alias="packageCreated">Oprettet</key>
<key alias="packageCurrentVersion">Nuværende version</key>
<key alias="packageNetVersion">.NET version</key>
<key alias="packageDownloads">Downloads</key>
<key alias="packageLikes">Likes</key>
<key alias="packageCompatibility">Kompatibilitet</key>
<key alias="packageCompatibilityDescription">Denne pakke er kompatibel med de følgende versioner af Umbraco, som rapporteret af community-medlemmer. Fuld kompatibilitet kan ikke garanteres for versioner rapporteret nedenfor 100%</key>
<key alias="packageExternalSources">Eksterne kilder</key>
<key alias="packageAuthor">Forfatter</key>
<key alias="packageDemonstration">Demonstration</key>
<key alias="packageDocumentation">Dokumentation</key>
<key alias="packageMetaData">Pakke meta data</key>
@@ -727,7 +872,18 @@ Mange hilsner fra Umbraco robotten
<key alias="packageUpgradeInstructions">Opdateringsinstrukser</key>
<key alias="packageUpgradeText">Der er en tilgængelig opdatering til denne pakke. Du kan downloade den direkte fra Umbracos pakke opbevaringsbase.</key>
<key alias="packageVersion">Pakke version</key>
<key alias="packageVersionHistory">Pakke versionshistorik</key>
<key alias="viewPackageWebsite">Se pakkeudviklerens website</key>
<key alias="packageAlreadyInstalled">Pakke allerede installeret</key>
<key alias="targetVersionMismatch">Denne pakke kan ikke installeres, den kræver en minimum Umbraco version af</key>
<key alias="installStateUninstalling">Afinstallerer...</key>
<key alias="installStateDownloading">Downloader...</key>
<key alias="installStateImporting">Importeret...</key>
<key alias="installStateInstalling">Installerer...</key>
<key alias="installStateRestarting">Genstarter, vent venligst...</key>
<key alias="installStateComplete">Færdig, din browser opdateres nu, vent venligst...</key>
<key alias="installStateCompleted">Klik venligst på 'Afslut' for at gennemføre installation og opdatere siden.</key>
<key alias="installStateUploading">Uploader pakke...</key>
</area>
<area alias="paste">
<key alias="doNothing">Indsæt med fuld formattering (Anbefales ikke)</key>
@@ -791,108 +947,7 @@ Mange hilsner fra Umbraco robotten
<area alias="imagecropper">
<key alias="reset">Nulstil</key>
</area>
<area alias="grid">
<key alias="insertControl">Vælg indholdstype</key>
<key alias="chooseLayout">Vælg layout</key>
<key alias="addRows">Tilføj række</key>
<key alias="addElement">Tilføj indhold</key>
<key alias="dropElement">Slip indhold</key>
<key alias="settingsApplied">Indstillinger tilføjet</key>
<key alias="contentNotAllowed">Indholdet er ikke tilladt her</key>
<key alias="contentAllowed">Indholdet er tilladt her</key>
<key alias="clickToEmbed">Klik for at indlejre</key>
<key alias="clickToInsertImage">Klik for at indsætte et billede</key>
<key alias="placeholderImageCaption">Billedtekst...</key>
<key alias="placeholderWriteHere">Skriv her...</key>
<key alias="gridLayouts">Gridlayout</key>
<key alias="gridLayoutsDetail">Et layout er det overordnede arbejdsområde til dit gitter - du vil typisk kun behøve ét eller to</key>
<key alias="addGridLayout">Tilføj gitterlayout</key>
<key alias="addGridLayoutDetail">Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner</key>
<key alias="rowConfigurations">Rækkekonfigurationer</key>
<key alias="rowConfigurationsDetail">Rækker er foruddefinerede celler, der arrangeres vandret</key>
<key alias="addRowConfiguration">Tilføj rækkekonfiguration</key>
<key alias="addRowConfigurationDetail">Juster rækken ved at indstille cellebredder og tilføje yderligere celler</key>
<key alias="columns">Kolonner</key>
<key alias="columnsDetails">Det totale antaller kolonner i gitteret</key>
<key alias="settings">Indstillinger</key>
<key alias="settingsDetails">Konfigurer, hvilket indstillinger, brugeren kan ændre</key>
<key alias="styles">Typografi</key>
<key alias="stylesDetails">Vælg, hvilke typografiværdier, en redaktør kan ændre</key>
<key alias="settingDialogDetails">Indstillinger gemmes kun, hvis den indtaste json-konfiguration er gyldig</key>
<key alias="allowAllEditors">Tillad alle editorer</key>
<key alias="allowAllRowConfigurations">Tillad alle rækkekonfigurationer</key>
<key alias="setAsDefault">Sæt som standard</key>
<key alias="chooseExtra">Vælg ekstra</key>
<key alias="chooseDefault">Vælg standard</key>
<key alias="areAdded">er tilføjet</key>
</area>
<area alias="contentTypeEditor">
<key alias="compositions">Kompositioner</key>
<key alias="noTabs">Du har ikke tilføjet nogle faner</key>
<key alias="addNewTab">Tilføj ny fane</key>
<key alias="addAnotherTab">Tilføj endnu en fane</key>
<key alias="inheritedFrom">Nedarvet fra</key>
<key alias="addProperty">Tilføj property</key>
<key alias="requiredLabel">Påkrævet label</key>
<key alias="enableListViewHeading">Aktiver listevisning</key>
<key alias="enableListViewDescription">Konfigurer indholdet til at blive vist i en sorterbar og søgbar liste, dens børn vil ikke blive vist i træet</key>
<key alias="allowedTemplatesHeading">Tilladte skabeloner</key>
<key alias="allowedTemplatesDescription">Vælg hvilke skabeloner der er tilladt at bruge på dette indhold</key>
<key alias="allowAsRootHeading">Tillad på rodniveau</key>
<key alias="allowAsRootDescription">Kun dokumenttyper med denne indstilling aktiveret oprettes i rodniveau under inhold og mediearkiv</key>
<key alias="allowAsRootCheckbox">Ja indhold af denne type er tilladt i roden</key>
<key alias="childNodesHeading">Tilladte typer</key>
<key alias="childNodesDescription">Tillad at oprette indhold af en specifik type under denne</key>
<key alias="chooseChildNode">Vælg child node</key>
<key alias="compositionsDescription">Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.</key>
<key alias="compositionInUse">Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som komposition</key>
<key alias="noAvailableCompositions">Der er ingen indholdstyper tilgængelige at bruge som komposition</key>
<key alias="availableEditors">Tilgængelige editors</key>
<key alias="reuse">Genbrug</key>
<key alias="editorSettings">Editor indstillinger</key>
<key alias="configuration">Konfiguration</key>
<key alias="yesDelete">Ja, slet</key>
<key alias="movedUnderneath">blev flyttet til</key>
<key alias="folderToMove">Vælg hvor</key>
<key alias="structureBelow">skal flyttes til</key>
<key alias="allDocumentTypes">Alle dokumenttyper</key>
<key alias="allDocuments">Alle dokumenter</key>
<key alias="allMediaItems">Alle medier</key>
<key alias="usingThisDocument">som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="usingThisMedia">som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="usingThisMember">som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="andAllDocuments">og alle dokumenter, som benytter denne type</key>
<key alias="andAllMediaItems">og alle medier, som benytter denne type</key>
<key alias="andAllMembers">og alle medlemmer, som benytter denne type</key>
<key alias="thisEditorUpdateSettings">der bruger denne editor vil blive opdateret med de nye indstillinger</key>
</area>
<area alias="rollback">
<key alias="currentVersion">Nuværende version</key>
@@ -1008,13 +1063,36 @@ Mange hilsner fra Umbraco robotten
<key alias="partialViewSavedText">Partial view gemt uden fejl!</key>
<key alias="partialViewErrorHeader">Partial view ikke gemt</key>
<key alias="partialViewErrorText">Der opstod en fejl ved at gemme filen.</key>
<key alias="permissionsSavedFor">Rettigheder gemt for</key>
<key alias="scriptSavedHeader">Script view gemt</key>
<key alias="scriptSavedText">Script view gemt uden fejl!</key>
<key alias="scriptErrorHeader">Script view ikke gemt</key>
<key alias="scriptErrorText">An error occurred saving the file.</key>
<key alias="cssErrorText">An error occurred saving the file.</key>
<key alias="deleteUserGroupsSuccess">Slettede %0% brugergrupper</key>
<key alias="deleteUserGroupSuccess">%0% blev slettet</key>
<key alias="enableUsersSuccess">Aktiverede %0% brugere</key>
<key alias="enableUsersError">Der opstod en fejl under aktivering af brugerne</key>
<key alias="disableUsersSuccess">Deaktiverede %0% brugere</key>
<key alias="disableUsersError">Der opstod en fejl under deaktivering af brugerne</key>
<key alias="enableUserSuccess">%0% er nu aktiveret</key>
<key alias="enableUserError">Der opstod en fejl under aktivering af brugeren</key>
<key alias="disableUserSuccess">%0% er nu deaktiveret</key>
<key alias="disableUserError">Der opstod en fejl under deaktivering af brugeren</key>
<key alias="setUserGroupOnUsersSuccess">Brugergrupper er blevet indstillet</key>
<key alias="deleteUserGroupsSuccess">Slettede %0% brugergrupper</key>
<key alias="deleteUserGroupSuccess">%0% blev slettet</key>
<key alias="unlockUsersSuccess">Låste %0% brugere op</key>
<key alias="unlockUsersError">Der opstod en fejl under oplåsning af brugerne</key>
<key alias="unlockUserSuccess">%0% er nu låst op</key>
<key alias="unlockUserError">Der opstod en fejl under oplåsning af brugeren</key>
</area>
<area alias="stylesheet">
<key alias="aliasHelp">Bruger CSS-syntax f.eks. h1, .redheader, .blueTex</key>
<key alias="aliasHelp">Bruger CSS-syntaks f.eks. h1, .redheader, .blueTex</key>
<key alias="editstylesheet">Rediger stylesheet</key>
<key alias="editstylesheetproperty">Rediger CSS-egenskab</key>
<key alias="nameHelp">Navn der identificerer CSS-egenskaben i tekstredigeringsværktøjet</key>
<key alias="preview">Vis prøve</key>
<key alias="preview">Forhåndsvisning</key>
<key alias="styles">Styles</key>
</area>
@@ -1127,7 +1205,111 @@ Mange hilsner fra Umbraco robotten
<key alias="template">Skabelon</key>
</area>
<area alias="grid">
<key alias="insertControl">Vælg indholdstype</key>
<key alias="chooseLayout">Vælg layout</key>
<key alias="addRows">Tilføj række</key>
<key alias="addElement">Tilføj indhold</key>
<key alias="dropElement">Slip indhold</key>
<key alias="settingsApplied">Indstillinger tilføjet</key>
<key alias="contentNotAllowed">Indholdet er ikke tilladt her</key>
<key alias="contentAllowed">Indholdet er tilladt her</key>
<key alias="clickToEmbed">Klik for at indlejre</key>
<key alias="clickToInsertImage">Klik for at indsætte et billede</key>
<key alias="placeholderImageCaption">Billedtekst...</key>
<key alias="placeholderWriteHere">Skriv her...</key>
<key alias="gridLayouts">Gitterlayout</key>
<key alias="gridLayoutsDetail">Et layout er det overordnede arbejdsområde til dit gitter - du vil typisk kun behøve ét eller to</key>
<key alias="addGridLayout">Tilføj gitterlayout</key>
<key alias="addGridLayoutDetail">Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner</key>
<key alias="rowConfigurations">Rækkekonfigurationer</key>
<key alias="rowConfigurationsDetail">Rækker er foruddefinerede celler, der arrangeres vandret</key>
<key alias="addRowConfiguration">Tilføj rækkekonfiguration</key>
<key alias="addRowConfigurationDetail">Juster rækken ved at indstille cellebredder og tilføje yderligere celler</key>
<key alias="columns">Kolonner</key>
<key alias="columnsDetails">Det totale antaller kolonner i gitteret</key>
<key alias="settings">Indstillinger</key>
<key alias="settingsDetails">Konfigurer, hvilket indstillinger, brugeren kan ændre</key>
<key alias="styles">Typografi</key>
<key alias="stylesDetails">Vælg, hvilke typografiværdier, en redaktør kan ændre</key>
<key alias="settingDialogDetails">Indstillinger gemmes kun, hvis den indtaste json-konfiguration er gyldig</key>
<key alias="allowAllEditors">Tillad alle editorer</key>
<key alias="allowAllRowConfigurations">Tillad alle rækkekonfigurationer</key>
<key alias="setAsDefault">Sæt som standard</key>
<key alias="chooseExtra">Vælg ekstra</key>
<key alias="chooseDefault">Vælg standard</key>
<key alias="areAdded">er tilføjet</key>
</area>
<area alias="contentTypeEditor">
<key alias="compositions">Kompositioner</key>
<key alias="noTabs">Du har ikke tilføjet nogle faner</key>
<key alias="addNewTab">Tilføj ny fane</key>
<key alias="addAnotherTab">Tilføj endnu en fane</key>
<key alias="inheritedFrom">Nedarvet fra</key>
<key alias="addProperty">Tilføj property</key>
<key alias="requiredLabel">Påkrævet label</key>
<key alias="enableListViewHeading">Aktiver listevisning</key>
<key alias="enableListViewDescription">Konfigurer indholdet til at blive vist i en sorterbar og søgbar liste, dens børn vil ikke blive vist i træet</key>
<key alias="allowedTemplatesHeading">Tilladte skabeloner</key>
<key alias="allowedTemplatesDescription">Vælg hvilke skabeloner der er tilladt at bruge på dette indhold</key>
<key alias="allowAsRootHeading">Tillad på rodniveau</key>
<key alias="allowAsRootDescription">Kun dokumenttyper med denne indstilling aktiveret oprettes i rodniveau under inhold og mediearkiv</key>
<key alias="allowAsRootCheckbox">Ja indhold af denne type er tilladt i roden</key>
<key alias="childNodesHeading">Tilladte typer</key>
<key alias="childNodesDescription">Tillad at oprette indhold af en specifik type under denne</key>
<key alias="chooseChildNode">Vælg child node</key>
<key alias="compositionsDescription">Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.</key>
<key alias="compositionInUse">Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som komposition</key>
<key alias="noAvailableCompositions">Der er ingen indholdstyper tilgængelige at bruge som komposition</key>
<key alias="availableEditors">Tilgængelige editors</key>
<key alias="reuse">Genbrug</key>
<key alias="editorSettings">Editor indstillinger</key>
<key alias="configuration">Konfiguration</key>
<key alias="yesDelete">Ja, slet</key>
<key alias="movedUnderneath">blev flyttet til</key>
<key alias="folderToMove">Vælg hvor</key>
<key alias="structureBelow">skal flyttes til</key>
<key alias="allDocumentTypes">Alle dokumenttyper</key>
<key alias="allDocuments">Alle dokumenter</key>
<key alias="allMediaItems">Alle medier</key>
<key alias="usingThisDocument">som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="usingThisMedia">som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="usingThisMember">som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil slette dem.</key>
<key alias="andAllDocuments">og alle dokumenter, som benytter denne type</key>
<key alias="andAllMediaItems">og alle medier, som benytter denne type</key>
<key alias="andAllMembers">og alle medlemmer, som benytter denne type</key>
<key alias="thisEditorUpdateSettings">der bruger denne editor vil blive opdateret med de nye indstillinger</key>
<key alias="memberCanEdit">Medlem kan redigere</key>
<key alias="showOnMemberProfile">Vis på medlemsprofil</key>
<key alias="tabHasNoSortOrder">fane har ingen sorteringsrækkefølge</key>
</area>
<area alias="templateEditor">
<key alias="alternativeField">Alternativt felt</key>
<key alias="alternativeText">Alternativ tekst</key>
@@ -1183,6 +1365,9 @@ Mange hilsner fra Umbraco robotten
<key alias="uploadTranslationXml">Upload oversættelse (xml)</key>
</area>
<area alias="treeHeaders">
<key alias="content">Indhold</key>
<key alias="contentBlueprints">Indholdsskabeloner</key>
<key alias="media">Mediearkiv</key>
<key alias="cacheBrowser">Cacheviser</key>
<key alias="contentRecycleBin">Papirkurv</key>
<key alias="createdPackages">Oprettede pakker</key>
@@ -1215,6 +1400,7 @@ Mange hilsner fra Umbraco robotten
<key alias="templates">Skabeloner</key>
<key alias="xslt">XSLT-filer</key>
<key alias="analytics">Analytics</key>
<key alias="users">Brugere</key>
</area>
<area alias="update">
<key alias="updateAvailable">Ny opdatering er klar</key>
@@ -1224,23 +1410,41 @@ Mange hilsner fra Umbraco robotten
</area>
<area alias="user">
<key alias="access">Adgang</key>
<key alias="accessHelp">Baseret på de tildelte grupper og startnoder har brugeren adgang til følgende noder</key>
<key alias="assignAccess">Tildel adgang</key>
<key alias="administrators">Administrator</key>
<key alias="categoryField">Kategorifelt</key>
<key alias="createDate">Bruger oprettet</key>
<key alias="changePassword">Skift dit kodeord</key>
<key alias="changePhoto">Skift billede</key>
<key alias="newPassword">Nyt kodeord</key>
<key alias="noLockouts">er ikke blevet låst ude</key>
<key alias="noPasswordChange">Kodeordet er ikke blevet ændret</key>
<key alias="confirmNewPassword">Gentag dit nye kodeord</key>
<key alias="changePasswordDescription">Du kan ændre dit kodeord, som giver dig adgang til Umbraco Back Office ved at udfylde formularen og klikke på knappen 'Skift dit kodeord'</key>
<key alias="contentChannel">Indholdskanal</key>
<key alias="changePhoto">Skift billede</key>
<key alias="createUserHelp">Opret nye brugere for at give dem adgang til Umbraco. Når en ny bruger oprettes, genereres der en adgangskode, som du kan dele med brugeren.</key>
<key alias="descriptionField">Beskrivelsesfelt</key>
<key alias="disabled">Deaktivér bruger</key>
<key alias="documentType">Dokumenttype</key>
<key alias="editors">Redaktør</key>
<key alias="excerptField">Uddragsfelt</key>
<key alias="failedPasswordAttempts">Fejlet loginforsøg</key>
<key alias="goToProfile">Gå til brugerprofil</key>
<key alias="groupsHelp">Tilføj grupper for at tildele adgang og tilladelser</key>
<key alias="inviteAnotherUser">Invitér anden bruger</key>
<key alias="inviteUserHelp">Invitér nye brugere til at give dem adgang til Umbraco. En invitation vil blive sendt via e-mail til brugeren med oplysninger om, hvordan man logger ind i Umbraco.</key>
<key alias="language">Sprog</key>
<key alias="lastLogin">Sidste login</key>
<key alias="languageHelp">Indstil det sprog, du vil se i menuer og dialoger</key>
<key alias="lastLockoutDate">Seneste låst ude dato</key>
<key alias="lastLogin">Senest login</key>
<key alias="lastPasswordChangeDate">Kodeord sidst ændret</key>
<key alias="loginname">Brugernavn</key>
<key alias="mediastartnode">Startnode i mediearkivet</key>
<key alias="mediastartnodehelp">Begræns mediebiblioteket til en bestemt startnode</key>
<key alias="mediastartnodes">Medie startnoder</key>
<key alias="mediastartnodeshelp">Begræns mediebiblioteket til bestemte startnoder</key>
<key alias="modules">Moduler</key>
<key alias="noConsole">Deaktivér adgang til Umbraco</key>
<key alias="noLogin">har endnu ikke logget ind</key>
@@ -1259,17 +1463,58 @@ Mange hilsner fra Umbraco robotten
<key alias="permissionReplaceChildren">Erstat underelement-rettigheder</key>
<key alias="permissionSelectedPages">Du ændrer i øjeblikket rettigheder for siderne:</key>
<key alias="permissionSelectPages">Vælg sider for at ændre deres rettigheder</key>
<key alias="removePhoto">Fjern billede</key>
<key alias="permissionsDefault">Standard rettigheder</key>
<key alias="permissionsGranular">Granulære rettigheder</key>
<key alias="permissionsGranularHelp">Sæt rettigheder for specifikke noder</key>
<key alias="profile">Profil</key>
<key alias="searchAllChildren">Søg alle 'børn'</key>
<key alias="startnode">Start node</key>
<key alias="stateActive">Aktiv</key>
<key alias="stateAll">Alle</key>
<key alias="stateDisabled">Deaktiveret</key>
<key alias="stateLockedOut">Låst ude</key>
<key alias="stateInvited">Inviteret</key>
<key alias="sortNameAscending">Navn (A-Å)</key>
<key alias="sortNameDescending">Navn (Å-A)</key>
<key alias="sortCreateDateDescending">Nyeste</key>
<key alias="sortCreateDateAscending">Ældste</key>
<key alias="sortLastLoginDateDescending">Senest login</key>
<key alias="sectionsHelp">Tilføj sektioner for at give brugerne adgang</key>
<key alias="selectUserGroups">Vælg brugergrupper</key>
<key alias="noStartNode">Ingen startnode valgt</key>
<key alias="noStartNodes">Ingen startnoder valgt</key>
<key alias="startnode">Startnode</key>
<key alias="startnodehelp">Begræns indholdstræet til en bestemt startnode</key>
<key alias="startnodes">Indhold startnoder</key>
<key alias="startnodeshelp">Begræns indholdstræet til bestemte startnoder</key>
<key alias="updateDate">Bruger sidst opdateret</key>
<key alias="userCreated">er blevet oprettet</key>
<key alias="userCreatedSuccessHelp">Den nye bruger er blevet oprettet. For at logge ind i Umbraco skal du bruge adgangskoden nedenfor.</key>
<key alias="userManagement">Brugeradministration</key>
<key alias="username">Navn</key>
<key alias="userPermissions">Brugertilladelser</key>
<key alias="userGroupPermissions">Brugergruppe tilladelser</key>
<key alias="usergroup">Brugergruppe</key>
<key alias="userGroups">Brugergrupper</key>
<key alias="userInvited">er blevet inviteret</key>
<key alias="userInvitedSuccessHelp">En invitation er blevet sendt til den nye bruger med oplysninger om, hvordan man logger ind i Umbraco.</key>
<key alias="userinviteWelcomeMessage">Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar.</key>
<key alias="userinviteAvatarMessage">Upload et billede for at gøre det nemt for andre brugere at genkende dig.</key>
<key alias="writer">Forfatter</key>
<key alias="translator">Oversætter</key>
<key alias="change">Skift</key>
<key alias="yourProfile">Din profil</key>
<key alias="yourHistory">Din historik</key>
<key alias="sessionExpires">Session udløber</key>
<key alias="inviteUser">Invitér bruger</key>
<key alias="createUser">Opret bruger</key>
<key alias="sendInvite">Send invitation</key>
<key alias="backToUsers">Tilbage til brugere</key>
<key alias="inviteEmailCopySubject">Umbraco: Invitation</key>
<key alias="inviteEmailCopyFormat">
<![CDATA[<html><body><p>Hej %0%, du er blevet inviteret af %1% til Umbraco backoffice.</p><p>Besked fra %1%: <em>%2%</em></p><p>Klik på dette <a href="%3%" target="_blank">link</a> for acceptere invitationen</p><p><small>Hvis du ikke kan klikke på linket, så kopier og indsæt denne URL i dit browservindue<br/><br/>%3%</small></p></body></html>]]>
</key>
</area>
<area alias="validation">
<key alias="validation">Validation</key>
@@ -1278,6 +1523,14 @@ Mange hilsner fra Umbraco robotten
<key alias="validateAsUrl">Valider som Url</key>
<key alias="enterCustomValidation">...eller indtast din egen validering</key>
<key alias="fieldIsMandatory">Feltet er påkrævet</key>
<key alias="validationRegExp">Indtast et regulært udtryk</key>
<key alias="minCount">Du skal tilføje mindst</key>
<key alias="maxCount">Du kan kun have</key>
<key alias="items">elementer</key>
<key alias="itemsSelected">elementer valgt</key>
<key alias="invalidDate">Ugyldig dato</key>
<key alias="invalidNumber">Ikke et tal</key>
<key alias="invalidEmail">Ugyldig e-mail</key>
</area>
<area alias="redirectUrls">
<key alias="disableUrlTracker">Slå URL tracker fra</key>
@@ -1296,6 +1549,9 @@ Mange hilsner fra Umbraco robotten
<key alias="enabledConfirm">URL tracker er nu slået fra.</key>
<key alias="enableError">Der opstod en fejl under forsøget på at slå URL trackeren til, der findes mere information i logfilen.</key>
</area>
<area alias="emptyStates">
<key alias="emptyDictionaryTree">Ingen ordbog elementer at vælge imellem</key>
</area>
<area alias="textbox">
<key alias="characters_left">Karakterer tilbage</key>
</area>
@@ -1676,15 +1676,27 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="profile">Profile</key>
<key alias="searchAllChildren">Search all children</key>
<key alias="sectionsHelp">Add sections to give users access</key>
<key alias="selectUserGroups">Select user groups</key>
<key alias="noStartNode">No start node selected</key>
<key alias="noStartNodes">No start nodes selected</key>
<key alias="stateActive">Active</key>
<key alias="stateAll">All</key>
<key alias="stateDisabled">Disabled</key>
<key alias="stateLockedOut">Locked out</key>
<key alias="stateInvited">Invited</key>
<key alias="startnode">Content start node</key>
<key alias="startnodehelp">Limit the content tree to a specific start node</key>
<key alias="startnodes">Content start nodes</key>
<key alias="startnodeshelp">Limit the content tree to specific start nodes</key>
<key alias="sortNameAscending">Name (A-Z)</key>
<key alias="sortNameDescending">Name (Z-A)</key>
<key alias="sortCreateDateDescending">Newest</key>
<key alias="sortCreateDateAscending">Oldest</key>
<key alias="sortLastLoginDateDescending">Last login</key>
<key alias="updateDate">User last updated</key>
<key alias="userCreated">has been created</key>
<key alias="userCreatedSuccessHelp">The new user has successfully been created. To log in to Umbraco use the password below.</key>
<key alias="userManagement">User management</key>
<key alias="username">Name</key>
<key alias="userPermissions">User permissions</key>
<key alias="userGroupPermissions">User group permissions</key>
@@ -1669,15 +1669,27 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="profile">Profile</key>
<key alias="searchAllChildren">Search all children</key>
<key alias="sectionsHelp">Add sections to give users access</key>
<key alias="selectUserGroups">Select user groups</key>
<key alias="noStartNode">No start node selected</key>
<key alias="noStartNodes">No start nodes selected</key>
<key alias="stateActive">Active</key>
<key alias="stateAll">All</key>
<key alias="stateDisabled">Disabled</key>
<key alias="stateLockedOut">Locked out</key>
<key alias="stateInvited">Invited</key>
<key alias="startnode">Content start node</key>
<key alias="startnodehelp">Limit the content tree to a specific start node</key>
<key alias="startnodes">Content start nodes</key>
<key alias="startnodeshelp">Limit the content tree to specific start nodes</key>
<key alias="sortNameAscending">Name (A-Z)</key>
<key alias="sortNameDescending">Name (Z-A)</key>
<key alias="sortCreateDateDescending">Newest</key>
<key alias="sortCreateDateAscending">Oldest</key>
<key alias="sortLastLoginDateDescending">Last login</key>
<key alias="updateDate">User last updated</key>
<key alias="userCreated">has been created</key>
<key alias="userCreatedSuccessHelp">The new user has successfully been created. To log in to Umbraco use the password below.</key>
<key alias="userManagement">User management</key>
<key alias="username">Name</key>
<key alias="userPermissions">User permissions</key>
<key alias="userGroupPermissions">User group permissions</key>
@@ -15,8 +15,6 @@
<key alias="disable">נטרל</key>
<key alias="emptyTrashcan">רוקן סל מיחזור</key>
<key alias="exportDocumentType">ייצא סוג קובץ</key>
<key alias="exportDocumentTypeAsCode">ייצא אל.NET</key>
<key alias="exportDocumentTypeAsCode-Full">ייצא אל .NET</key>
<key alias="importDocumentType">ייבא סוג מסמך</key>
<key alias="importPackage">ייבא חבילה</key>
<key alias="liveEdit">ערוך במצב "קנבס"</key>
@@ -15,8 +15,6 @@
<key alias="disable">비활성</key>
<key alias="emptyTrashcan">휴지통 비우기</key>
<key alias="exportDocumentType">추출 문서 유형</key>
<key alias="exportDocumentTypeAsCode">.NET으로 추출</key>
<key alias="exportDocumentTypeAsCode-Full">.NET으로 추출</key>
<key alias="importDocumentType">등록 문서 유형</key>
<key alias="importPackage">패키지 등록</key>
<key alias="liveEdit">캔버스 내용 편집</key>
@@ -15,8 +15,6 @@
<key alias="disable">Desabilitar</key>
<key alias="emptyTrashcan">Esvaziar Lixeira</key>
<key alias="exportDocumentType">Exportar Tipo de Documento</key>
<key alias="exportDocumentTypeAsCode">Exportar para .NET</key>
<key alias="exportDocumentTypeAsCode-Full">Exportar para .NET</key>
<key alias="importDocumentType">Importar Tipo de Documento</key>
<key alias="importPackage">Importar Pacote</key>
<key alias="liveEdit">Editar na Tela</key>
@@ -346,7 +346,7 @@
<key alias="password">输入您的密码</key>
<key alias="confirmPassword">确认密码</key>
<key alias="nameentity">命名 %0%...</key>
<key alias="entername">输入用户名...</key>
<key alias="entername">输入名...</key>
<key alias="label">标签...</key>
<key alias="enterDescription">输入说明...</key>
<key alias="search">输入搜索关键字...</key>
@@ -172,9 +172,9 @@ Umbraco.Sys.registerNamespace("Umbraco.Application");
},
reloadLocation: function () {
reloadLocation: function (pathToMatch) {
if (this.mainWindow().UmbClientMgr) {
this.mainWindow().UmbClientMgr.reloadLocation();
this.mainWindow().UmbClientMgr.reloadLocation(pathToMatch);
}
},
+11 -3
View File
@@ -431,9 +431,17 @@ namespace Umbraco.Web.Editors
[HttpPost]
public Dictionary<int, string[]> GetPermissions(int[] nodeIds)
{
return Services.UserService
.GetPermissions(Security.CurrentUser, nodeIds)
.ToDictionary(x => x.EntityId, x => x.AssignedPermissions);
var permissions = Services.UserService
.GetPermissions(Security.CurrentUser, nodeIds);
var permissionsDictionary = new Dictionary<int, string[]>();
foreach (var nodeId in nodeIds)
{
var aggregatePerms = permissions.GetAllPermissions(nodeId).ToArray();
permissionsDictionary.Add(nodeId, aggregatePerms);
}
return permissionsDictionary;
}
/// <summary>
+1 -1
View File
@@ -48,7 +48,7 @@ namespace Umbraco.Web.Editors
{
//get the first tree in the section and get it's root node route path
var sectionTrees = appTreeController.GetApplicationTrees(section.Alias, null, null).Result;
section.RoutePath = sectionTrees.IsContainer == false
section.RoutePath = sectionTrees.IsContainer == false || sectionTrees.Children.Count == 0
? sectionTrees.RoutePath
: sectionTrees.Children[0].RoutePath;
}
+1 -1
View File
@@ -550,7 +550,7 @@ namespace Umbraco.Web.Editors
// if the found user has his email for username, we want to keep this synced when changing the email.
// we have already cross-checked above that the email isn't colliding with anything, so we can safely assign it here.
if (found.Username == found.Email && userSave.Username != userSave.Email)
if (UmbracoConfig.For.UmbracoSettings().Security.UsernameIsEmail && found.Username == found.Email && userSave.Username != userSave.Email)
{
userSave.Username = userSave.Email;
}
@@ -6,12 +6,14 @@ using System.Web.Http;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.HealthChecks;
using Umbraco.Web.Editors;
using Umbraco.Web.WebApi.Filters;
namespace Umbraco.Web.HealthCheck
{
/// <summary>
/// The API controller used to display the health check info and execute any actions
/// </summary>
[UmbracoApplicationAuthorize(Core.Constants.Applications.Developer)]
public class HealthCheckController : UmbracoAuthorizedJsonController
{
private readonly IHealthCheckResolver _healthCheckResolver;
+8 -2
View File
@@ -92,6 +92,8 @@ namespace Umbraco.Web
using (var outputms = new MemoryStream())
{
bool lengthReached = false;
using (var outputtw = new StreamWriter(outputms))
{
using (var ms = new MemoryStream())
@@ -106,7 +108,6 @@ namespace Umbraco.Web
using (TextReader tr = new StreamReader(ms))
{
bool isInsideElement = false,
lengthReached = false,
insideTagSpaceEncountered = false,
isTagClose = false;
@@ -254,10 +255,15 @@ namespace Umbraco.Web
//Check to see if there is an empty char between the hellip and the output string
//if there is, remove it
if (string.IsNullOrWhiteSpace(firstTrim) == false)
if (addElipsis && lengthReached && string.IsNullOrWhiteSpace(firstTrim) == false)
{
result = firstTrim[firstTrim.Length - hellip.Length - 1] == ' ' ? firstTrim.Remove(firstTrim.Length - hellip.Length - 1, 1) : firstTrim;
}
else
{
result = firstTrim;
}
return new HtmlString(result);
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Trees
{
[UmbracoTreeAuthorize(Constants.Trees.Users)]
[Tree(Constants.Applications.Users, Constants.Trees.Users, "Users", sortOrder: 0)]
[Tree(Constants.Applications.Users, Constants.Trees.Users, null, sortOrder: 0)]
[PluginController("UmbracoTrees")]
[LegacyBaseTree(typeof(loadUsers))]
[CoreTree]
@@ -101,30 +101,19 @@ namespace Umbraco.Web.WebApi.Filters
ids.Add(((dynamic)items[i]).Id);
}
//get all the permissions for these nodes in one call
var permissions = _userService.GetPermissions(user, ids.ToArray()).ToArray();
var permissions = _userService.GetPermissions(user, ids.ToArray());
var toRemove = new List<dynamic>();
foreach (dynamic item in items)
{
var nodePermission = permissions.Where(x => x.EntityId == Convert.ToInt32(item.Id)).ToArray();
//if there are no permissions for this id then we need to check what the user's default
// permissions are.
if (nodePermission.Length == 0)
{
//get the combined permission set across all user groups for this node
//we're in the world of dynamics here so we need to cast
var nodePermission = ((IEnumerable<string>)permissions.GetAllPermissions(item.Id)).ToArray();
//if the permission being checked doesn't exist then remove the item
if (nodePermission.Contains(_permissionToCheck.ToString(CultureInfo.InvariantCulture)) == false)
{
//var defaultP = user.DefaultPermissions
toRemove.Add(item);
}
else
{
foreach (var n in nodePermission)
{
//if the permission being checked doesn't exist then remove the item
if (n.AssignedPermissions.Contains(_permissionToCheck.ToString(CultureInfo.InvariantCulture)) == false)
{
toRemove.Add(item);
}
}
}
}
}
foreach (var item in toRemove)
{
@@ -3,6 +3,7 @@ using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
@@ -117,36 +118,23 @@ namespace umbraco.presentation.dialogs
if (!IsPostBack) {
allVersions.Items.Add(new ListItem(ui.Text("rollback", "selectVersion")+ "...", ""));
foreach (DocumentVersionList dl in currentDoc.GetVersions()) {
foreach (DocumentVersionList dl in currentDoc.GetVersions())
{
//we don't need to show the current version
if (dl.Version == currentDoc.Version)
continue;
allVersions.Items.Add(new ListItem(dl.Text + " (" + ui.Text("content", "createDate") + ": " + dl.Date.ToShortDateString() + " " + dl.Date.ToShortTimeString() + ")", dl.Version.ToString()));
}
Button1.Text = ui.Text("actions", "rollback");
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
#endregion
protected void doRollback_Click(object sender, System.EventArgs e)
{
if (allVersions.SelectedValue.Trim() != "") {
if (allVersions.SelectedValue.Trim() != "")
{
Document d = new Document(int.Parse(helper.Request("nodeId")));
d.RollBack(new Guid(allVersions.SelectedValue), base.getUser());
@@ -159,6 +147,8 @@ namespace umbraco.presentation.dialogs
feedBackMsg.Text = ui.Text("rollback", "documentRolledBack", vars, new global::umbraco.BusinessLogic.User(0)) + "</p><p><a href='#' onclick='" + ClientTools.Scripts.CloseModalWindow() + "'>" + ui.Text("closeThisWindow") + "</a>";
diffPanel.Visible = false;
pl_buttons.Visible = false;
ClientTools.ReloadLocationIfMatched(string.Format("/content/content/edit/{0}", d.Id));
}
}
}
-76
View File
@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<WebPlatform>
<Links>
<AddLink InDashboard="True">
<Title>Start Here</Title>
<Description>First time here? Complete the installation of your Umbraco Site, select a Starter Kit and Skin to get you started.</Description>
<Uri>/install/default.aspx</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/umbraco.png</ImageUri>
</AddLink>
<AddLink InDashboard="True" InLearn="True">
<Title>Getting Started with Umbraco</Title>
<Description>So you've finished installing Umbraco in WebMatrix, what next? Learn how to build and configure your new site!</Description>
<Uri>http://our.umbraco.org/wiki/how-tos/getting-started-with-umbraco-what-is-next-after-you-install</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/umbraco.png</ImageUri>
</AddLink>
<AddLink InDashboard="True" InLearn="True">
<Title>Extending Umbraco using WebMatrix</Title>
<Description>In this 5-minute video tutorial you'll learn how to edit templates, use the Razor syntax to add dynamic functionality and deploy an Umbraco site - all from within WebMatrix.</Description>
<Uri>http://umbraco.com/help-and-support/video-tutorials/getting-started/working-with-webmatrix</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/umbraco.png</ImageUri>
</AddLink>
<AddLink InDashboard="True" InLearn="True">
<Title>Umbraco Forum - Where the friendliest CMS community on the planet helps each other</Title>
<Description>Search for documentation, get help and guidance from seasoned experts, download and collaborate on plugins and extensions.</Description>
<Uri>http://our.umbraco.org/</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/community.png</ImageUri>
</AddLink>
<AddLink InDashboard="True">
<Title>Umbraco Products</Title>
<Description>We have additional products and services available to help you get the most out of Umbraco.</Description>
<Uri>http://umbraco.com/products</Uri>
<Uri xml:lang="es">http://umbraco.com/products</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/products.png</ImageUri>
</AddLink>
<AddLink InDashboard="True">
<Title>Umbraco Community Projects - "The Deli"</Title>
<Description>Find free and commercial add-ons, extensions, skins, and starter sites.</Description>
<Uri>http://our.umbraco.org/projects</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/deli.png</ImageUri>
</AddLink>
</Links>
<Ribbon>
<AddRibbonButton>
<Label>Site Admin</Label>
<Uri>/umbraco/</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/umbraco.png</ImageUri>
</AddRibbonButton>
<AddRibbonButton>
<Label>Community</Label>
<Uri>http://our.umbraco.org/</Uri>
<ImageUri>http://cdn.umbraco.org/cdn/umbraco/images/webmatrix/community.png</ImageUri>
</AddRibbonButton>
</Ribbon>
<PathProtection>
<AllowPath>
<RelativePath>install</RelativePath>
</AllowPath>
<AllowPath AllowNested="False">
<RelativePath>web.config</RelativePath>
</AllowPath>
<ProtectPath>
<RelativePath>bin</RelativePath>
</ProtectPath>
<ProtectPath>
<RelativePath>umbraco</RelativePath>
</ProtectPath>
<ProtectPath>
<RelativePath>umbraco_client</RelativePath>
</ProtectPath>
</PathProtection>
</WebPlatform>
-9
View File
@@ -1,9 +0,0 @@
/**********************************************************************/
/* Install.SQL */
/* Creates a login and makes the user a member of db roles */
/* */
/* Modifications for SQL AZURE - ON MASTER */
/**********************************************************************/
CREATE LOGIN PlaceHolderForUser WITH PASSWORD = 'PlaceHolderForPassword'
-15
View File
@@ -1,15 +0,0 @@
/**********************************************************************/
/* CreateUser.SQL */
/* Creates a user and makes the user a member of db roles */
/* This script runs against the User database and requires connection string */
/* Supports SQL Server and SQL AZURE */
/**********************************************************************/
-- Create database user and map to login
-- and add user to the datareader, datawriter, ddladmin and securityadmin roles
--
CREATE USER PlaceHolderForUser FOR LOGIN PlaceHolderForUser;
GO
EXEC sp_addrolemember 'db_owner', PlaceHolderForUser;
GO
-45
View File
@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<msdeploy.iisApp>
<iisApp path="umbraco" />
<!-- managedRuntimeVersion="v4.0" /> -->
<setAcl path="umbraco"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/app_code"
setAclAccess="ReadandExecute" />
<setAcl path="umbraco/app_browsers"
setAclAccess="ReadandExecute" />
<setAcl path="umbraco/app_data"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/bin"
setAclAccess="Read" />
<setAcl path="umbraco/config"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/css"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/macroScripts"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/masterpages"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/media"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/scripts"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/umbraco"
setAclAccess="Read" />
<setAcl path="umbraco/usercontrols"
setAclAccess="Read" />
<setAcl path="umbraco/views"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/xslt"
setAclAccess="Read, Write, Modify" />
<setAcl path="umbraco/web.config"
setAclResourceType="File"
setAclAccess="Read, Write, Modify" />
<!-- Runs SQL script to create login and assign permissions, requires transacted="false"
This script runs as the database administrator provided in parameters.xml
-->
<dbfullsql path="installSQL1.sql" transacted="false" />
<dbfullsql path="installSQL2.sql" transacted="false" />
</msdeploy.iisApp>
-161
View File
@@ -1,161 +0,0 @@
<parameters>
<!-- Prompts where to copy the content files and takes a web site path (such as "contoso.com/app"). -->
<parameter name="Application Path" description="It is recommended that Umbraco be installed as a web site root. Leave this parameter empty." tags="iisapp">
<parameterValidation type="AllowEmpty" />
<parameterEntry type="ProviderPath" scope="iisapp" match="^umbraco$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the root site folder -->
<parameter name="SetAclParameter1" description="Sets the ACL on the root site folder" defaultValue="{Application Path}" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the app_code folder -->
<parameter name="SetAclParameter2" description="Sets the ACL on the app_code folder" defaultValue="{Application Path}/app_code" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/app_code$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the app_browsers folder -->
<parameter name="SetAclParameter15" description="Sets the ACL on the app_code folder" defaultValue="{Application Path}/app_browsers" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/app_browsers$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the app_data folder -->
<parameter name="SetAclParameter16" description="Sets the ACL on the app_code folder" defaultValue="{Application Path}/app_data" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/app_data$" />
</parameter>
<!-- This is the parameter that is used to set ACLs, on the bin folder -->
<parameter name="SetAclParameter3" description="Sets the ACL on the bin folder" defaultValue="{Application Path}/bin" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/bin$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the config folder -->
<parameter name="SetAclParameter4" description="Sets the ACL on the config folder" defaultValue="{Application Path}/config" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/config$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the css folder -->
<parameter name="SetAclParameter5" description="Sets the ACL on the css folder" defaultValue="{Application Path}/css" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="umbraco/css$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the masterpages folder -->
<parameter name="SetAclParameter7" description="Sets the ACL on the masterpages folder" defaultValue="{Application Path}/masterpages" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/masterpages$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the media folder -->
<parameter name="SetAclParameter8" description="Sets the ACL on the media folder" defaultValue="{Application Path}/media" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/media$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the macroScripts folder -->
<parameter name="SetAclParameter9" description="Sets the ACL on the python folder" defaultValue="{Application Path}/macroScripts" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/macroScripts$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the scripts folder -->
<parameter name="SetAclParameter10" description="Sets the ACL on the scripts folder" defaultValue="{Application Path}/scripts" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/scripts$" />
</parameter>
<!-- This is the parameter that is used to set ACLs on the umbraco folder -->
<parameter name="SetAclParameter11" description="Sets the ACL on the umbraco folder" defaultValue="{Application Path}/umbraco" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/umbraco$" />
</parameter>
<!-- This is the parameter that is used to set ACLs, it's set to the application path filled in by the user -->
<parameter name="SetAclParameter12" description="Sets the ACL on the usercontrols folder" defaultValue="{Application Path}/usercontrols" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/usercontrols$" />
</parameter>
<!-- This is the parameter that is used to set ACLs, it's set to the application path filled in by the user -->
<parameter name="SetAclParameter13" description="Sets the ACL on the xslt folder" defaultValue="{Application Path}/xslt" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/xslt$" />
</parameter>
<!-- This is the parameter that is used to set ACLs, it's set to the application path filled in by the user -->
<parameter name="SetAclParameter14" description="Sets the ACL on the web.config file" defaultValue="{Application Path}/web.config" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/web.config$" />
</parameter>
<!-- This is the parameter that is used to set ACLs, it's set to the application path filled in by the user -->
<parameter name="SetAclParameter17" description="Sets the ACL on the views folder" defaultValue="{Application Path}/views" tags="Hidden">
<parameterEntry type="ProviderPath" scope="setAcl" match="^umbraco/views$" />
</parameter>
<!-- Prompts for database server name, this is used in the connection string parameter later -->
<parameter name="Database Server" description="Location of your database server." defaultValue=".\sqlexpress" tags="DBServer, SQL">
</parameter>
<!-- Prompts for the database name and fills it into the database scripts -->
<parameter name="Database Name" description="Name of the database for your application." defaultValue="umbraco" tags="DBName, SQL">
<parameterEntry type="TextFile" scope="installSQL1.sql" match="PlaceHolderForDb" />
<parameterEntry type="TextFile" scope="installSQL2.sql" match="PlaceHolderForDb" />
</parameter>
<!-- Prompts for the database username and fills it into the database scripts.
The SQL tag indicates it is a parameter required for SQL, the DbUsername tag indicates this is a Db username -->
<parameter name="Database Username" description="User name to access you application database." defaultValue="umbracouser" tags="SQL, DbUsername">
<parameterEntry type="TextFile" scope="installSQL1.sql" match="PlaceHolderForUser" />
<parameterEntry type="TextFile" scope="installSQL2.sql" match="PlaceHolderForUser" />
</parameter>
<!-- Prompts for the database password and fills it into the database scripts.
The SQL tag indicates it is a parameter required for SQL, the DbUserPassword tag indicates this is a Db password -->
<parameter name="Database Password" description="Enter Password for the Database Username. Passwords will contain at least 1 upper case letter, at least 1 lower case letter, at least 1 number or special character, and be least 8 characters in length. "
tags="New, Password, SQL, DbUserPassword">
<parameterValidation type = "RegularExpression" validationString = "(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" />
<parameterEntry type="TextFile" scope="installSQL1.sql" match="PlaceHolderForPassword" />
<parameterEntry type="TextFile" scope="installSQL2.sql" match="PlaceHolderForPassword" />
</parameter>
<!-- Prompts for the admin creds and uses it for the administrator connection string.
This is used to create a login and assign permissions. The SQL tag indicates it is a parameter required for SQL.
The DbAdminUsername tag indicates it should be used when the user is creating a new database.
If they're not, it can be filled in with the DbUsername value. -->
<parameter name="Database Administrator" description="Administrator username for your database." defaultValue="sa" tags="SQL, DbAdminUsername">
</parameter>
<!-- Prompts for the admin password and uses it for the administrator connection string.
This is used to create a login and assign permissions. The SQL tags indicates it is a parameter required for SQL.
The DbAdminPassword tag indicates it should be used when the user is creating a new database.
If they're not, it can be filled in with the DbUserPassword value. -->
<parameter name="Database Administrator Password" description="Password that is associated with the database administrator account." tags="Password, SQL, DbAdminPassword,NoStore">
</parameter>
<!-- This is the hidden admin connection string used to run the database scripts -->
<parameter name="Connection String Master" description="Automatically sets the connection string for the connection request." defaultValue="Server={Database Server};Database=master;uid={Database Administrator};Pwd={Database Administrator Password};" tags="Hidden,SQL,SQLConnectionString,NoStore">
<parameterEntry type="ProviderPath" scope="dbfullsql" match="installSQL1.sql" />
</parameter>
<!-- This is the hidden connection string with the newly created db account that is used in the web.config -->
<parameter name="Connection String" description="Connection string to enter into config" defaultValue="server={Database Server};database={Database Name};uid={Database Administrator};Pwd={Database Administrator Password};" tags="Hidden,SQL,SQLConnectionString,NoStore">
<parameterEntry type="ProviderPath" scope="dbfullsql" match="installSQL2.sql" />
</parameter>
<parameter name="SQLCE Database Preparation" defaultValue="local"
tags="SQLCE, Hidden,NoStore">
<parameterEntry type="XmlFile" scope="\\web.config$" match="//connectionStrings/add/@name" />
</parameter>
<!-- This is the hidden connection string with the newly created db account that is used in the web.config -->
<parameter name="Connection String for Config" description="Connection string to enter into config"
defaultValue="server={Database Server};database={Database Name};user id={Database Username};password={Database Password}"
tags="SQL, Hidden,NoStore">
<!-- scope=”web.config” will look for all web.config files under the root directory . Using scope=”\\web.config$” will select only the root web.config -->
<parameterEntry type="XmlFile" scope="\\web.config$" match="//connectionStrings/add[@name='umbracoDbDSN']/@connectionString" />
</parameter>
<!-- This is the hidden connection string with the newly created db account that is used in the web.config -->
<parameter name="Connection String for Config1" description="Connection string to enter into config"
defaultValue="server={Database Server};database={Database Name};user id={Database Username};password={Database Password}"
tags="SQL, Hidden,SQLConnectionString">
<!-- scope=”web.config” will look for all web.config files under the root directory . Using scope=”\\web.config$” will select only the root web.config -->
<parameterEntry type="XmlFile" scope="\\web.config$" match="//connectionStrings/add[@name='umbracoDbDSN']/@connectionString" />
</parameter>
</parameters>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

@@ -52,7 +52,8 @@ namespace umbraco.BasePages
public static string ReloadContentFrameUrlIfPathLoaded(string url) {
return string.Format(ClientMgrScript + ".reloadContentFrameUrlIfPathLoaded('{0}');", url);
}
public static string ReloadLocation { get { return string.Format(ClientMgrScript + ".reloadLocation();"); } }
public static string ReloadLocation { get { return ClientMgrScript + ".reloadLocation();"; } }
public static string ReloadLocationIfMatched { get { return ClientMgrScript + ".reloadLocation('{0}');"; } }
public static string ChildNodeCreated = GetMainTree + ".childNodeCreated();";
public static string SyncTree { get { return GetMainTree + ".syncTree('{0}', {1});"; } }
public static string ClearTreeCache { get { return GetMainTree + ".clearTreeCache();"; } }
@@ -277,21 +278,33 @@ namespace umbraco.BasePages
RegisterClientScript(string.Format(Scripts.ReloadActionNode, (!reselect).ToString().ToLower(), (!reloadChildren).ToString().ToLower()));
return this;
}
/// <summary>
/// When the application searches for a node, it searches for nodes in specific tree types.
/// If SyncTree is used, it will sync the tree nodes with the active tree type, therefore if
/// a developer wants to sync a specific tree, they can call this method to set the type to sync.
/// </summary>
/// <remarks>
/// Each branch of a particular tree should theoretically be the same type, however, developers can
/// override the type of each branch in their BaseTree's but this is not standard practice. If there
/// are multiple types of branches in one tree, then only those branches that have the Active tree type
/// will be searched for syncing.
/// </remarks>
/// <param name="treeType"></param>
/// <returns></returns>
public ClientTools SetActiveTreeType(string treeType)
public ClientTools ReloadLocationIfMatched(string routePath)
{
RegisterClientScript(string.Format(Scripts.ReloadLocationIfMatched, routePath));
return this;
}
public ClientTools ReloadLocation()
{
RegisterClientScript(Scripts.ReloadLocation);
return this;
}
/// <summary>
/// When the application searches for a node, it searches for nodes in specific tree types.
/// If SyncTree is used, it will sync the tree nodes with the active tree type, therefore if
/// a developer wants to sync a specific tree, they can call this method to set the type to sync.
/// </summary>
/// <remarks>
/// Each branch of a particular tree should theoretically be the same type, however, developers can
/// override the type of each branch in their BaseTree's but this is not standard practice. If there
/// are multiple types of branches in one tree, then only those branches that have the Active tree type
/// will be searched for syncing.
/// </remarks>
/// <param name="treeType"></param>
/// <returns></returns>
public ClientTools SetActiveTreeType(string treeType)
{
RegisterClientScript(string.Format(Scripts.SetActiveTreeType, treeType));
return this;
+3 -4
View File
@@ -276,13 +276,12 @@ namespace umbraco.cms.businesslogic
{
if (_version == Guid.Empty)
{
string sql = "Select versionId from cmsContentVersion where contentID = " + this.Id +
" order by id desc ";
var sql = string.Format("SELECT versionId FROM cmsDocument where nodeid={0} AND newest = 1 ORDER BY updateDate desc", this.Id);
using (var sqlHelper = Application.SqlHelper)
using (IRecordsReader dr = sqlHelper.ExecuteReader(sql))
{
if (!dr.Read())
if (dr.Read() == false)
_version = Guid.Empty;
else
_version = dr.GetGuid("versionId");