Compare commits

..

4 Commits

Author SHA1 Message Date
Sebastiaan Janssen 25c68a5a36 Merge pull request #567 from readingdancer/Fix_issue_U4-4585
Fix so Login screen now works correctly with Umbraco UI Localization settings.
2014-11-26 12:03:46 +01:00
Sebastiaan Janssen 82d433d291 Ignore VS15 generated files 2014-11-26 11:31:22 +01:00
Sebastiaan Janssen 69ae715998 Revert to using MVC 4.0.0.0 OOB so that people who have only 4.0.0.0 in the GAC can actually install Umbraco. If 4.0.0.1 is in the GAC that version will be taken.
Leaves the additional reference to System.Web.Http in web.config so that you don't get the System.Web.Http.ApiController when 4.0.0.1 is indeed in the GAC.
2014-11-26 10:31:13 +01:00
Chris Houston 87ae16b89a Fix for issue http://issues.umbraco.org/issue/U4-4585
"I cant change UI language for the login screen in Umbraco 7.1.6"

Also added a couple more Spanish translations to the Language file.
2014-11-25 19:14:35 +00:00
831 changed files with 13821 additions and 52928 deletions
+1 -19
View File
@@ -51,7 +51,6 @@ _BuildOutput/*
build/UmbracoCms.AllBinaries*zip
build/UmbracoCms.WebPI*zip
build/UmbracoCms*zip
build/UmbracoExamine.PDF*zip
build/*.nupkg
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
@@ -79,12 +78,6 @@ src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.panel.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.palettes.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.front.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.config.js
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.css
@@ -117,15 +110,4 @@ src/Umbraco.Web.UI/umbraco/js/init.js
build/ApiDocs/*
build/ApiDocs/Output/*
src/Umbraco.Web.UI.Client/bower_components/*
/src/Umbraco.Web.UI/Umbraco/preview
#Ignore Rule for output of generated documentation files from Grunt docserve
src/Umbraco.Web.UI.Client/docs/api
src/*.boltdata/
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.loader.js
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.palettes.js
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.panel.js
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.config.js
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.front.js
src/umbraco.sln.ide/*
build/UmbracoCms.*/
src/umbraco.sln.ide
+1 -5
View File
@@ -24,7 +24,7 @@ ReplaceIISExpressPortNumber.exe ..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj %rel
ECHO Installing the Microsoft.Bcl.Build package before anything else, otherwise you'd have to run build.cmd twice
SET nuGetFolder=%CD%\..\src\packages\
..\src\.nuget\NuGet.exe sources Remove -Name MyGetUmbracoCore
..\src\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/ >NUL
..\src\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Web.UI\packages.config -OutputDirectory %nuGetFolder%
..\src\.nuget\NuGet.exe install ..\src\umbraco.businesslogic\packages.config -OutputDirectory %nuGetFolder%
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Core\packages.config -OutputDirectory %nuGetFolder%
@@ -35,12 +35,9 @@ RD ..\src\Umbraco.Web.UI.Client\build /Q /S
ECHO Removing existing built files to make sure everything is clean as a whistle
RMDIR /Q /S _BuildOutput
DEL /F /Q UmbracoCms.*.zip
DEL /F /Q UmbracoExamine.*.zip
DEL /F /Q UmbracoCms.*.nupkg
DEL /F /Q webpihash.txt
ECHO Making sure Git is in the path so that the build can succeed
CALL InstallGit.cmd
ECHO Performing MSBuild and producing Umbraco binaries zip files
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.proj" /p:BUILD_RELEASE=%release% /p:BUILD_COMMENT=%comment%
@@ -65,7 +62,6 @@ REN .\_BuildOutput\WebApp\Xslt\Web.config Web.config.transform
ECHO Packing the NuGet release files
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %version%
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %version%
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoExamine.PDF.nuspec
IF ERRORLEVEL 1 GOTO :showerror
+5 -13
View File
@@ -76,7 +76,6 @@
<BuildZipFileName>UmbracoCms$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileName>
<BuildZipFileNameBin>UmbracoCms.AllBinaries$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameBin>
<BuildZipFileNameWebPi>UmbracoCms.WebPI$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameWebPi>
<BuildZipExaminePDFName>UmbracoExamine.PDF.0.6.0.zip</BuildZipExaminePDFName>
<IncludeSymbols>False</IncludeSymbols>
<BuildFolderRelativeToProjects>..\..\build\$(BuildFolder)</BuildFolderRelativeToProjects>
<BuildFolderAbsolutePath>$(MSBuildProjectDirectory)\$(BuildFolder)</BuildFolderAbsolutePath>
@@ -103,6 +102,7 @@
<SystemFolders Include="$(WebAppFolder)Masterpages" />
<SystemFolders Include="$(WebAppFolder)Scripts" />
<SystemFolders Include="$(WebAppFolder)Css" />
<SystemFolders Include="$(WebAppFolder)MacroScripts" />
<SystemFolders Include="$(WebAppFolder)Xslt" />
<SystemFolders Include="$(WebAppFolder)UserControls" />
<SystemFolders Include="$(WebAppFolder)Views" />
@@ -153,22 +153,14 @@
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameWebPi)%22 %22$(WebPiFolderAbsolutePath)*%22" />
</Target>
<Target Name="ZipWebApp" DependsOnTargets="ZipUmbracoExaminePDF" >
<Target Name="ZipWebApp" DependsOnTargets="CreateSystemFolders" >
<Message Text="Starting to zip to $(buildDate)-$(BuildZipFileName)" Importance="high" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22 -x!dotLess.Core.dll" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22 -x!dotLess.Core.dll" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22" />
<Message Text="Finished zipping to build\$(BuildFolder)\$(buildDate)-$(BuildZipFileName)" Importance="high" />
</Target>
<Target Name="ZipUmbracoExaminePDF" DependsOnTargets="CreateSystemFolders" >
<Message Text="Starting to zip to $(buildDate)-$(BuildZipExaminePDFName)" Importance="high" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipExaminePDFName)%22 %22$(ExaminePDFPath)*%22" />
<Message Text="Finished zipping to build\$(BuildFolder)\$(buildDate)-$(BuildZipExaminePDFName)" Importance="high" />
</Target>
<Target Name="CreateSystemFolders" DependsOnTargets="CopyBelleBuild" Inputs="@(SystemFolders)" Outputs="%(Identity).Dummy">
<MakeDir Directories="@(SystemFolders)" />
@@ -231,7 +223,7 @@
<!-- Copy the config files and rename them to *.config.transform -->
<Target Name="CopyTransformedConfig" DependsOnTargets="CopyXmlDocumentation">
<ItemGroup>
<ConfigFiles Include="$(WebAppFolder)config\*.config;$(WebAppFolder)config\*.js" />
<ConfigFiles Include="$(WebAppFolder)config\*.config" />
<WebConfigTransformFile Include="$(WebAppFolder)Web.config" />
</ItemGroup>
-33
View File
@@ -1,33 +0,0 @@
@ECHO OFF
SET oldPath=%PATH%
git.exe 2> NUL
if %ERRORLEVEL%==9009 GOTO :trydefaultpath
GOTO :EOF
:trydefaultpath
path=C:\Program Files (x86)\Git\cmd;%PATH%
git.exe 2> NUL
if %ERRORLEVEL%==9009 GOTO :showerror
GOTO :EOF
:showerror
path=%oldPath%
ECHO Git is not in your path and could not be found in C:\Program Files (x86)\Git\bin
set /p install=" Do you want to install Git through Chocolatey [y/n]? " %=%
if %install%==y (
GOTO :installgit
) else (
GOTO :cantcontinue
)
:cantcontinue
ECHO Can't complete the build without Git being in the path. Please add it to be able to continue.
GOTO :EOF
:installgit
ECHO Installing Chocolatey first
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
ECHO Installing Git through Chocolatey
choco install git
path=C:\Program Files (x86)\Git\cmd;%path%
+3 -3
View File
@@ -28,10 +28,10 @@
<dependency id="SharpZipLib" version="[0.86.0, 1.0.0)" />
<dependency id="MySql.Data" version="[6.6.5]" />
<dependency id="xmlrpcnet" version="[2.5.0, 3.0.0)" />
<dependency id="ClientDependency" version="[1.8.0, 2.0.0)" />
<dependency id="ClientDependency-Mvc" version="[1.8.0, 2.0.0)" />
<dependency id="ClientDependency" version="[1.7.1.2, 2.0.0)" />
<dependency id="ClientDependency-Mvc" version="[1.7.0.4, 2.0.0)" />
<dependency id="AutoMapper" version="[3.0.0, 4.0.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.5, 7.0.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.4, 7.0.0)" />
<dependency id="Examine" version="[0.1.57, 1.0.0)" />
<dependency id="ImageProcessor" version="[1.9.5, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[3.3.1, 5.0.0)" />
+3 -8
View File
@@ -16,12 +16,12 @@
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="Newtonsoft.Json" version="[6.0.5, 7.0.0)" />
</dependencies>
</metadata>
<files>
<file src="..\_BuildOutput\Configs\**" target="Content\config" exclude="..\_BuildOutput\Configs\Web.config.transform" />
<file src="..\_BuildOutput\WebApp\css\**" target="Content\css" />
<file src="..\_BuildOutput\WebApp\macroScripts\**" target="Content\macroScripts" exclude="..\_BuildOutput\WebApp\macroScripts\Web.config" />
<file src="..\_BuildOutput\WebApp\masterpages\**" target="Content\masterpages" />
<file src="..\_BuildOutput\WebApp\media\**" target="Content\media" />
<file src="..\_BuildOutput\WebApp\scripts\**" target="Content\scripts" />
@@ -29,8 +29,8 @@
<file src="..\_BuildOutput\WebApp\Views\**" target="Content\Views" exclude="..\_BuildOutput\WebApp\Views\Web.config" />
<file src="..\_BuildOutput\WebApp\xslt\**" target="Content\xslt" />
<file src="..\_BuildOutput\WebApp\default.aspx" target="Content\default.aspx" />
<file src="..\_BuildOutput\WebApp\Web.config" target="Content\Web.config" />
<file src="..\_BuildOutput\WebApp\Global.asax" target="Content\Global.asax" />
<file src="..\_BuildOutput\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="..\_BuildOutput\WebApp\App_Browsers\**" target="UmbracoFiles\App_Browsers" />
<file src="..\_BuildOutput\WebApp\App_Plugins\**" target="UmbracoFiles\App_Plugins" />
<file src="..\_BuildOutput\WebApp\bin\amd64\**" target="UmbracoFiles\bin\amd64" />
@@ -38,14 +38,9 @@
<file src="..\_BuildOutput\WebApp\config\splashes\**" target="UmbracoFiles\config\splashes" />
<file src="..\_BuildOutput\WebApp\umbraco\**" target="UmbracoFiles\umbraco" />
<file src="..\_BuildOutput\WebApp\umbraco_client\**" target="UmbracoFiles\umbraco_client" />
<file src="..\_BuildOutput\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="tools\install.ps1" target="tools\install.ps1" />
<file src="tools\Readme.txt" target="tools\Readme.txt" />
<file src="tools\Web.config.install.xdt" target="Content\Web.config.install.xdt" />
<file src="tools\applications.config.install.xdt" target="Content\config\applications.config.install.xdt" />
<file src="tools\ClientDependency.config.install.xdt" target="Content\config\ClientDependency.config.install.xdt" />
<file src="tools\Dashboard.config.install.xdt" target="Content\config\Dashboard.config.install.xdt" />
<file src="tools\trees.config.install.xdt" target="Content\config\trees.config.install.xdt" />
<file src="tools\umbracoSettings.config.install.xdt" target="Content\config\umbracoSettings.config.install.xdt" />
<file src="build\**" target="build" />
</files>
</package>
-23
View File
@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>UmbracoExamine.PDF</id>
<version>0.7.0</version>
<authors>Umbraco HQ</authors>
<owners>Umbraco HQ</owners>
<licenseUrl>http://umbraco.codeplex.com/license</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>UmbracoExmine.PDF</description>
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Core" version="[7.0.0, 8.0.0)" />
<dependency id="iTextSharp" version="[5.5.3, 6.0.0)" />
</dependencies>
</metadata>
<files>
<file src="..\_BuildOutput\UmbracoExamine.PDF\UmbracoExamine.PDF.dll" target="lib\UmbracoExamine.PDF.dll" />
<file src="..\_BuildOutput\UmbracoExamine.PDF\UmbracoExamine.PDF.XML" target="lib\UmbracoExamine.PDF.XML" />
</files>
</package>
@@ -1,8 +0,0 @@
<?xml version="1.0"?>
<clientDependency xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<fileRegistration>
<providers>
<add name="CanvasProvider" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</providers>
</fileRegistration>
</clientDependency>
@@ -1,82 +0,0 @@
<?xml version="1.0"?>
<dashBoard xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<section alias="StartupSettingsDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Welcome" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing">
<control showOnce="true" addPanel="true" panelCaption="" xdt:Transform="InsertIfMissing">
views/dashboard/settings/settingsdashboardintro.html
</control>
</tab>
</section>
<section alias="StartupFormsDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<areas>
<area>forms</area>
</areas>
<tab caption="Install Umbraco Forms">
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/forms/formsdashboardintro.html
</control>
</tab>
</section>
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Replace">
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/developer/developerdashboardvideos.html
</control>
</tab>
<tab caption="Examine Management" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
</section>
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Examine Management" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing">
<control>
views/dashboard/developer/examinemanagement.html
</control>
</tab>
</section>
<section alias="StartupMediaDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Content" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing" />
<tab caption="Content" xdt:Locator="Match(caption)" xdt:Transform="Replace">
<control showOnce="false" addPanel="false" panelCaption="">
views/dashboard/media/mediafolderbrowser.html
</control>
</tab>
</section>
<section alias="StartupDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Get Started" xdt:Transform="Insert">
<access>
<grant>admin</grant>
</access>
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/default/startupdashboardintro.html
</control>
</tab>
<tab caption="Change password" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Change Password" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Change Password" xdt:Transform="Insert">
<control showOnce="false" addPanel="false" panelCaption="">
views/dashboard/ChangePassword.html
</control>
</tab>
<tab caption="Last Edits" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
</section>
<section alias="StartupMemberDashboardSection" xdt:Locator="Match(alias)">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Get Started" xdt:Transform="Insert">
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/members/membersdashboardvideos.html
</control>
</tab>
</section>
<section alias="uGoLiveDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="Remove" />
<section alias="ExamineManagement" xdt:Locator="Match(alias)" xdt:Transform="Remove" />
</dashBoard>
+14 -11
View File
@@ -1,23 +1,26 @@
A note about running Umbraco from Visual Studio.
Don't forget to build!
When upgrading your website using NuGet you should answer "No" to the questions to overwrite the Web.config
file (and config files in the config folder).
We will overwrite Web.config anyway but we keep a backup in the App_Data\NuGetBackup folder. There you'll
find a folder with the current date and time in which the backup has been placed. Make sure to merge the
new file with the old backup files before you proceed.
The web.config will be overwritten by default to ensure that it has the necessary settings from the current release.
We've done our best to transform your configuration files but in case something is not quite right: remember we
backed up your files in App_Data\NuGetBackup so you can find the original files before they were transformed.
We've also overwritten all the files in the Umbraco and Umbraco_Client folder, these have also been backed up in
App_Data\NuGetBackup. We didn't overwrite the UI.xml file nor did we remove any files or folders that you or a package
might have added. Only the existing files were overwritten. If you customized anything then make sure to do a compare
and merge with the NuGetBackup folder.
We've overwritten all the files in the Umbraco and Umbraco_Client folder, these have been backed up in
App_Data\NuGetBackup. We didn't overwrite the UI.xml file nor did we remove any files or folders that you or
a package might have added. Only the existing files were overwritten. If you customized anything then make
sure to do a compare and merge with the NuGetBackup folder.
The config files found in the config folder will usually not be changed for patch releases, so they can usually be skipped,
but the web.config will have to have its previous "umbracoConfigurationStatus"-appsetting and "umbracoDbDSN" connection string
copied over (as a minimum).
This NuGet package includes build targets that extend the creation of a deploy package, which is generated by
This nuget package includes build targets that extends the creation of a deploy package, which is generated by
Publishing from Visual Studio. The targets will only work once Publishing is configured, so if you don't use
Publish this won't affect you.
The following items will now be automatically included when creating a deploy package or publishing to the file
system: umbraco, umbraco_client, config\splashes and global.asax.
These things will now be automatically included when creating a deploy package or publishing to the file system:
umbraco, umbraco_client, config\splashes and global.asax.
Please read the release notes on our.umbraco.org:
http://our.umbraco.org/contribute/releases
-180
View File
@@ -1,180 +0,0 @@
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing" />
<configSections>
<section name="BaseRestExtensions" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="FileSystemProviders" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="ExamineLuceneIndexSets" type="Examine.LuceneEngine.Config.IndexSets, Examine" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="SetAttributes(type,requirePermission)" />
<sectionGroup name="applicationSettings" xdt:Locator="Match(name)">
<section name="umbraco.presentation.Properties.Settings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</sectionGroup>
<sectionGroup name="system.web.webPages.razor" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<sectionGroup name="umbracoConfiguration" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing">
<section name="settings" type="Umbraco.Core.Configuration.UmbracoSettings.UmbracoSettingsSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="BaseRestExtensions" type="Umbraco.Core.Configuration.BaseRest.BaseRestSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="FileSystemProviders" type="Umbraco.Core.Configuration.FileSystemProvidersSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="dashBoard" type="Umbraco.Core.Configuration.Dashboard.DashboardSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</sectionGroup>
</configSections>
<appSettings xdt:Transform="InsertIfMissing" />
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
</appSettings>
<umbracoConfiguration xdt:Transform="InsertIfMissing">
<settings configSource="config\umbracoSettings.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<BaseRestExtensions configSource="config\BaseRestExtensions.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<FileSystemProviders configSource="config\FileSystemProviders.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<dashBoard configSource="config\Dashboard.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
</umbracoConfiguration>
<FileSystemProviders xdt:Transform="Remove" />
<BaseRestExtensions xdt:Transform="Remove" />
<system.data xdt:Transform="InsertIfMissing">
<DbProviderFactories xdt:Transform="InsertIfMissing">
<remove invariant="System.Data.SqlServerCe.4.0" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe" xdt:Locator="Match(invariant)" xdt:Transform="SetAttributes(invariant,description,type)" />
<remove invariant="MySql.Data.MySqlClient" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" xdt:Locator="Match(invariant)" xdt:Transform="SetAttributes(invariant,description,type)" />
</DbProviderFactories>
</system.data>
<clientDependency xdt:Transform="RemoveAttributes(version)" />
<system.web xdt:Transform="InsertIfMissing" />
<system.web>
<siteMap xdt:Transform="Remove" />
<membership defaultProvider="DefaultMembershipProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove" />
<roleManager defaultProvider="DefaultRoleProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>
<profile defaultProvider="DefaultProfileProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>>
<sessionState customProvider="DefaultSessionProvider" xdt:Locator="Match(customProvider)" xdt:Transform="Remove"/>
<compilation xdt:Transform="InsertIfMissing" />
<compilation>
<assemblies xdt:Transform="InsertIfMissing" />
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)"
xdt:Transform="InsertIfMissing" />
<add assembly="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
</assemblies>
</compilation>
<xhtmlConformance xdt:Transform="Remove" />
<httpModules xdt:Transform="InsertIfMissing" />
<httpModules>
<add name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name=" UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UmbracoModule" type="Umbraco.Web.UmbracoModule,umbraco" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</httpModules>
<httpHandlers xdt:Transform="InsertIfMissing" />
<httpHandlers>
<add path="GoogleSpellChecker.ashx" xdt:Locator="Match(path)" xdt:Transform="Remove" />
</httpHandlers>
</system.web>
<system.webServer xdt:Transform="InsertIfMissing" />
<system.webServer>
<modules xdt:Transform="InsertIfMissing" />
<modules runAllManagedModulesForAllRequests="true" xdt:Transform="SetAttributes(runAllManagedModulesForAllRequests)">
<remove name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="WebDAVModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<!-- Inserts it as the first element. Also see http://stackoverflow.com/a/19041487/5018 -->
<remove name="WebDAVModule" xdt:Locator="Match(name)" xdt:Transform="Insert" />
<add name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name=" UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UmbracoModule" type="Umbraco.Web.UmbracoModule,umbraco" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</modules>
<staticContent xdt:Transform="InsertIfMissing" />
<staticContent>
<remove fileExtension=".svg" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
<remove fileExtension=".woff" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
<mimeMap fileExtension=".woff" mimeType="application/x-font-woff" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
<remove fileExtension=".less" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
<mimeMap fileExtension=".less" mimeType="text/css" xdt:Locator="Match(fileExtension)" xdt:Transform="InsertIfMissing" />
</staticContent>
<handlers>
<remove name="SpellChecker" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="SpellChecker" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</handlers>
</system.webServer>
<system.codedom xdt:Transform="Remove" />
<runtime xdt:Transform="InsertIfMissing" />
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xdt:Transform="InsertIfMissing" />
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Newtonsoft.Json')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.Mvc')" xdt:Transform="Remove" />
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.web.webPages.razor xdt:Transform="Remove" />
<location path="umbraco" xdt:Locator="Match(path)" xdt:Transform="InsertIfMissing" />
<location path="umbraco" xdt:Locator="Match(path)">
<system.webServer xdt:Transform="InsertIfMissing">
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
</system.webServer>
</location>
<location path="App_Plugins" xdt:Locator="Match(path)" xdt:Transform="InsertIfMissing" />
<location path="App_Plugins" xdt:Locator="Match(path)">
<system.webServer xdt:Transform="InsertIfMissing">
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
</system.webServer>
</location>
</configuration>
@@ -1,11 +0,0 @@
<?xml version="1.0"?>
<applications xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<add alias="content" icon="traycontent" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="media" icon="traymedia" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="settings" icon="traysettings" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="developer" icon="traydeveloper" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="users" icon="trayusers" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="member" icon="traymember" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon)" />
<add alias="forms" name="Forms" icon="icon-umb-contour" sortOrder="6" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing" />
<add alias="translation" icon="traytranslation" sortOrder="7" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes(icon,sortOrder)" />
</applications>
+6 -112
View File
@@ -4,25 +4,20 @@ if ($project) {
$dateTime = Get-Date -Format yyyyMMdd-HHmmss
$backupPath = Join-Path (Split-Path $project.FullName -Parent) "\App_Data\NuGetBackup\$dateTime"
$copyLogsPath = Join-Path $backupPath "CopyLogs"
$projectDestinationPath = Split-Path $project.FullName -Parent
# Create backup folder and logs folder if it doesn't exist yet
New-Item -ItemType Directory -Force -Path $backupPath
New-Item -ItemType Directory -Force -Path $copyLogsPath
# Create a backup of original web.config
$projectDestinationPath = Split-Path $project.FullName -Parent
$webConfigSource = Join-Path $projectDestinationPath "Web.config"
Copy-Item $webConfigSource $backupPath -Force
# Backup config files folder
$configFolder = Join-Path $projectDestinationPath "Config"
if(Test-Path $configFolder) {
$umbracoBackupPath = Join-Path $backupPath "Config"
New-Item -ItemType Directory -Force -Path $umbracoBackupPath
robocopy $configFolder $umbracoBackupPath /e /LOG:$copyLogsPath\ConfigBackup.log
}
# Copy Web.config from package to project folder
$umbracoFilesPath = Join-Path $rootPath "UmbracoFiles\Web.config"
Copy-Item $umbracoFilesPath $projectDestinationPath -Force
# Copy umbraco and umbraco_files from package to project folder
# This is only done when these folders already exist because we
# only want to do this for upgrades
@@ -47,108 +42,7 @@ if ($project) {
robocopy $umbracoClientFolder $umbracoClientBackupPath /e /LOG:$copyLogsPath\UmbracoClientBackup.log
robocopy $umbracoClientFolderSource $umbracoClientFolder /is /it /e /LOG:$copyLogsPath\UmbracoClientCopy.log
}
$copyWebconfig = $false
try
{
# SJ - What can I say: big up for James Newton King for teaching us a hack for detecting if this is a new install vs. an upgrade!
# https://github.com/JamesNK/Newtonsoft.Json/pull/387 - would never have seen this without the controversial pull request..
$dte2 = Get-Interface $dte ([EnvDTE80.DTE2])
if ($dte2.ActiveWindow.Caption -eq "Package Manager Console")
{
# user is installing from VS NuGet console
# get reference to the window, the console host and the input history
# copy web.config if "install-package UmbracoCms" was last input
$consoleWindow = $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow])
$props = $consoleWindow.GetType().GetProperties([System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::NonPublic)
$prop = $props | ? { $_.Name -eq "ActiveHostInfo" } | select -first 1
if ($prop -eq $null) { return }
$hostInfo = $prop.GetValue($consoleWindow)
if ($hostInfo -eq $null) { return }
$history = $hostInfo.WpfConsole.InputHistory.History
$lastCommand = $history | select -last 1
if ($lastCommand)
{
$lastCommand = $lastCommand.Trim().ToLower()
if ($lastCommand.StartsWith("install-package") -and $lastCommand.Contains("umbracocms"))
{
$copyWebconfig = $true
}
}
}
else
{
# user is installing from VS NuGet dialog
# get reference to the window, then smart output console provider
# copy web.config if messages in buffered console contains "installing...UmbracoCms" in last operation
$instanceField = [NuGet.Dialog.PackageManagerWindow].GetField("CurrentInstance", [System.Reflection.BindingFlags]::Static -bor [System.Reflection.BindingFlags]::NonPublic)
$consoleField = [NuGet.Dialog.PackageManagerWindow].GetField("_smartOutputConsoleProvider", [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::NonPublic)
if ($instanceField -eq $null -or $consoleField -eq $null) { return }
$instance = $instanceField.GetValue($null)
if ($instance -eq $null) { return }
$consoleProvider = $consoleField.GetValue($instance)
if ($consoleProvider -eq $null) { return }
$console = $consoleProvider.CreateOutputConsole($false)
$messagesField = $console.GetType().GetField("_messages", [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::NonPublic)
if ($messagesField -eq $null) { return }
$messages = $messagesField.GetValue($console)
if ($messages -eq $null) { return }
$operations = $messages -split "=============================="
$lastOperation = $operations | select -last 1
if ($lastOperation)
{
$lastOperation = $lastOperation.ToLower()
$lines = $lastOperation -split "`r`n"
$installMatch = $lines | ? { $_.StartsWith("------- installing...umbracocms ") } | select -first 1
if ($installMatch)
{
$copyWebconfig = $true
}
}
}
}
catch
{
# stop potential errors from bubbling up
$ErrorMessage = $_.Exception.Message
$FailedItem = $_.Exception.ItemName
$installLogFile = Join-Path $projectDestinationPath "NuGetInstallError.log"
$text = "Error occurred: " + $ErrorMessage + " failure: " + $FailedItem
$text | Out-File $installLogFile
}
if($copyWebconfig -eq $true)
{
$packageWebConfigSource = Join-Path $rootPath "UmbracoFiles\Web.config"
$destinationWebConfig = Join-Path $projectDestinationPath "Web.config"
Copy-Item $packageWebConfigSource $destinationWebConfig -Force
}
$installFolder = Join-Path $projectDestinationPath "Install"
if(Test-Path $installFolder) {
Remove-Item $installFolder -Force -Recurse -Confirm:$false
}
# Open readme.txt file
$DTE.ItemOperations.OpenFile($toolsPath + '\Readme.txt')
}
@@ -1,36 +0,0 @@
<?xml version="1.0"?>
<trees xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<add initialize="true" sortOrder="0" alias="content" application="content" title="Content" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.ContentTreeController, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add alias="content" xdt:Locator="Match(alias)" xdt:Transform="RemoveAttributes(silent)" />
<add initialize="false" sortOrder="0" alias="contentRecycleBin" application="content" title="Recycle Bin" iconClosed="icon-folder" iconOpen="icon-folder" type="umbraco.cms.presentation.Trees.ContentRecycleBin, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="0" alias="media" application="media" title="Media" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.MediaTreeController, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add initialize="false" sortOrder="0" alias="mediaRecycleBin" application="media" title="Recycle Bin" iconClosed="icon-folder" iconOpen="icon-folder" type="umbraco.cms.presentation.Trees.MediaRecycleBin, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="stylesheets" title="Stylesheets" type="umbraco.loadStylesheets, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="0" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="stylesheetProperty" title="Stylesheet Property" type="umbraco.loadStylesheetProperty, umbraco" iconClosed="" iconOpen="" initialize="false" sortOrder="0" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="templates" title="Templates" type="umbraco.loadTemplates, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="1" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="partialViews" title="Partial Views" silent="false" initialize="true" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.PartialViewsTree, umbraco" sortOrder="2" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="scripts" title="Scripts" type="umbraco.loadScripts, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="3" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="dictionary" title="Dictionary" type="umbraco.loadDictionary, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add alias="dictionary" xdt:Locator="Match(alias)" xdt:Transform="RemoveAttributes(action)" />
<add application="settings" alias="languages" title="Languages" type="umbraco.loadLanguages, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="5" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="mediaTypes" title="Media Types" type="umbraco.loadMediaTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="6" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="nodeTypes" title="Document Types" type="umbraco.loadNodeTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="7" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="0" alias="datatype" application="developer" title="Data Types" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.DataTypeTreeController, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="macros" title="Macros" type="umbraco.loadMacros, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="2" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="packager" title="Packages" type="umbraco.loadPackager, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="3" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="packagerPackages" title="Packager Packages" type="umbraco.loadPackages, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" initialize="false" sortOrder="3" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="relationTypes" title="Relation Types" type="umbraco.loadRelationTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="xslt" title="XSLT Files" type="umbraco.loadXslt, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="5" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTree, umbraco" silent="false" initialize="true" sortOrder="6" title="Partial View Macro Files" iconClosed="icon-folder" iconOpen="icon-folder" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="users" alias="users" title="Users" type="umbraco.loadUsers, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="0" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="users" alias="userTypes" title="User Types" type="umbraco.cms.presentation.Trees.UserTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="1" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="users" alias="userPermissions" title="User Permissions" type="umbraco.cms.presentation.Trees.UserPermissions, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="2" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="0" alias="member" application="member" title="Members" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.MemberTreeController, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="member" alias="memberGroup" title="Member Groups" type="umbraco.loadMemberGroups, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="1" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="member" alias="memberType" title="Member Types" type="umbraco.loadMemberTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="2" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add silent="false" initialize="true" sortOrder="1" alias="openTasks" application="translation" title="Tasks assigned to you" iconClosed="icon-folder" iconOpen="icon-folder" type="umbraco.loadOpenTasks, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add alias="openTasks" xdt:Locator="Match(alias)" xdt:Transform="RemoveAttributes(action)" />
<add silent="false" initialize="true" sortOrder="2" alias="yourTasks" application="translation" title="Tasks created by you" iconClosed="icon-folder" iconOpen="icon-folder" type="umbraco.loadYourTasks, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add alias="yourTasks" xdt:Locator="Match(alias)" xdt:Transform="RemoveAttributes(action)" />
<add application="developer" alias="python" xdt:Locator="Match(alias)" xdt:Transform="Remove" />
</trees>
@@ -1,8 +0,0 @@
<?xml version="1.0"?>
<settings xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<content>
<EnableCanvasEditing xdt:Transform="Remove" />
</content>
<webservices xdt:Transform="Remove" />
</settings>
+1 -1
View File
@@ -1,2 +1,2 @@
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
7.2.0
7.1.9
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<actionScriptProperties analytics="false" mainApplicationPath="DesktopMediaUploader.mxml" projectUUID="9115d8c5-0cb4-4a34-8702-48456cca7762" version="6">
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="true" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
<compilerSourcePath/>
<libraryPath defaultLinkType="0">
<libraryPathEntry kind="4" path="">
<excludedEntries>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
</excludedEntries>
</libraryPathEntry>
<libraryPathEntry kind="1" linkType="1" path="libs"/>
</libraryPath>
<sourceAttachmentPath/>
</compiler>
<applications>
<application path="DesktopMediaUploader.mxml">
<airExcludes>
<airExclude path="assets/dmu_orange.fla"/>
<airExclude path="assets/logo.psd"/>
<airExclude path="assets/icon-128-old.png"/>
<airExclude path="assets/icon-128.psd"/>
</airExcludes>
</application>
</applications>
<modules/>
<buildCSSFiles/>
</actionScriptProperties>
+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flexProperties enableServiceManager="false" flexServerFeatures="0" flexServerType="0" toolCompile="true" useServerFlexSDK="false" version="2"/>
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>DesktopMediaUploader</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.adobe.flexbuilder.project.flexbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.adobe.flexbuilder.project.apollobuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.adobe.flexbuilder.project.apollonature</nature>
<nature>com.adobe.flexbuilder.project.flexnature</nature>
<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,3 @@
#Tue Jul 20 11:35:49 BST 2010
eclipse.preferences.version=1
encoding/<project>=utf-8
Binary file not shown.
@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/2.0">
<!-- Adobe AIR Application Descriptor File Template.
Specifies parameters for identifying, installing, and launching AIR applications.
xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/2.0
The last segment of the namespace specifies the version
of the AIR runtime required for this application to run.
minimumPatchLevel - The minimum patch level of the AIR runtime required to run
the application. Optional.
-->
<!-- A universally unique application identifier. Must be unique across all AIR applications.
Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
<id>org.umbraco.DesktopMediaUploader</id>
<!-- Used as the filename for the application. Required. -->
<filename>Desktop Media Uploader</filename>
<!-- The name that is displayed in the AIR application installer.
May have multiple values for each language. See samples or xsd schema file. Optional. -->
<name>Desktop Media Uploader</name>
<!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
<version>v2.1.0</version>
<!-- Description, displayed in the AIR application installer.
May have multiple values for each language. See samples or xsd schema file. Optional. -->
<description>
This application allows you to upload media to an Umbraco website directly from your desktop.
</description>
<!-- Copyright information. Optional -->
<copyright>2010 Umbraco.org</copyright>
<!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
<!-- <publisherID></publisherID> -->
<!-- Settings for the application's initial window. Required. -->
<initialWindow>
<!-- The main SWF or HTML file of the application. Required. -->
<!-- Note: In Flash Builder, the SWF reference is set automatically. -->
<content>DesktopMediaUploader.swf</content>
<!-- The title of the main window. Optional. -->
<!-- <title></title> -->
<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
<!-- <systemChrome></systemChrome> -->
<!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
<!-- <transparent></transparent> -->
<!-- Whether the window is initially visible. Optional. Default false. -->
<!-- <visible></visible> -->
<!-- Whether the user can minimize the window. Optional. Default true. -->
<!-- <minimizable></minimizable> -->
<!-- Whether the user can maximize the window. Optional. Default true. -->
<!-- <maximizable></maximizable> -->
<!-- Whether the user can resize the window. Optional. Default true. -->
<!-- <resizable></resizable> -->
<!-- The window's initial width in pixels. Optional. -->
<!-- <width></width> -->
<!-- The window's initial height in pixels. Optional. -->
<!-- <height></height> -->
<!-- The window's initial x position. Optional. -->
<!-- <x></x> -->
<!-- The window's initial y position. Optional. -->
<!-- <y></y> -->
<!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
<!-- <minSize></minSize> -->
<!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
<!-- <maxSize></maxSize> -->
</initialWindow>
<!-- We recommend omitting the supportedProfiles element, -->
<!-- which in turn permits your application to be deployed to all -->
<!-- devices supported by AIR. If you wish to restrict deployment -->
<!-- (i.e., to only mobile devices) then add this element and list -->
<!-- only the profiles which your application does support. -->
<!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->
<!-- The subpath of the standard default installation location to use. Optional. -->
<!-- <installFolder></installFolder> -->
<!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
<!-- <programMenuFolder></programMenuFolder> -->
<!-- The icon the system uses for the application. For at least one resolution,
specify the path to a PNG file included in the AIR package. Optional. -->
<icon>
<image16x16>assets/icon-16.png</image16x16>
<image32x32>assets/icon-32.png</image32x32>
<image48x48>assets/icon-48.png</image48x48>
<image128x128>assets/icon-128.png</image128x128>
</icon>
<!-- Whether the application handles the update when a user double-clicks an update version
of the AIR file (true), or the default AIR application installer handles the update (false).
Optional. Default false. -->
<!-- <customUpdateUI></customUpdateUI> -->
<!-- Whether the application can be launched when the user clicks a link in a web browser.
Optional. Default false. -->
<allowBrowserInvocation>true</allowBrowserInvocation>
<!-- Listing of file types for which the application can register. Optional. -->
<!-- <fileTypes> -->
<!-- Defines one file type. Optional. -->
<!-- <fileType> -->
<!-- The name that the system displays for the registered file type. Required. -->
<!-- <name></name> -->
<!-- The extension to register. Required. -->
<!-- <extension></extension> -->
<!-- The description of the file type. Optional. -->
<!-- <description></description> -->
<!-- The MIME content type. -->
<!-- <contentType></contentType> -->
<!-- The icon to display for the file type. Optional. -->
<!-- <icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon> -->
<!-- </fileType> -->
<!-- </fileTypes> -->
</application>
@@ -0,0 +1,90 @@
/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
global
{
focus-color: #EEB470;
selection-color: #EEB470;
roll-over-color: #EEEEEE;
}
mx|Tree
{
textSelectedColor: #ffffff;
textRollOverColor: #000000;
selection-color: #f36f21;
roll-over-color: #cccccc;
}
#grpSignInForm s|Label
{
paddingTop: 5px;
}
#grpSignInForm s|CheckBox s|Label
{
paddingTop: 0;
}
.header
{
borderColor: #7a7a7a;
backgroundColor: #7a7a7a;
paddingTop: 25px;
paddingBottom: 25px;
paddingLeft: 25px;
paddingRight: 25px;
}
.header mx|Label
{
color: #ffffff;
font-size: 16px;
font-weight: bold;
}
.header s|DropDownList
{
skinClass: ClassReference('org.umbraco.desktopmediauploader.skins.HeaderDropDownListSkin');
color: #ffffff;
content-background-color: #7a7a7a;
roll-over-color: #f36f22;
}
.header s|DropDownList s|Label
{
font-size: 12px;
font-weight: normal;
}
#btnSignIn,
#btnUpload
{
cornerRadius: 5px;
borderThickness: 2px;
downSkin: Embed(source="assets/dmu_orange.swf", symbol="Button_downSkin");
overSkin: Embed(source="assets/dmu_orange.swf", symbol="Button_overSkin");
upSkin: Embed(source="assets/dmu_orange.swf", symbol="Button_upSkin");
paddingLeft: 20px;
paddingRight: 20px;
paddingTop: 7px;
paddingBottom: 7px;
color: #ffffff;
font-weight: bold;
font-size: 14px;
text-roll-over-color: #ffffff;
text-selected-color: #ffffff;
text-disabled-color: #cccccc;
}
.signOutButton
{
skinClass: ClassReference('org.umbraco.desktopmediauploader.skins.SignOutButtonSkin');
}
.removeButton
{
skinClass: ClassReference('org.umbraco.desktopmediauploader.skins.RemoveButtonSkin');
}
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
skinClass="org.umbraco.desktopmediauploader.skins.ApplicationSkin"
width="330" height="600" showStatusBar="false"
xmlns:views="org.umbraco.desktopmediauploader.views.*"
windowComplete="init();" >
<fx:Style source="DesktopMediaUploader.css"/>
<fx:Script>
<![CDATA[
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.util.*;
import mx.controls.Alert;
protected function init():void
{
StageHelper.stage = stage;
NativeApplication.nativeApplication.addEventListener(BrowserInvokeEvent.BROWSER_INVOKE, app_BrowserInvoke);
vwSignIn.addEventListener(SignedInEvent.SIGNED_IN, vwSignIn_SignedIn);
vwUpload.addEventListener(SignedOutEvent.SIGNED_OUT, vwUpload_SignOut);
vwSignIn.init();
}
protected function app_BrowserInvoke(e:BrowserInvokeEvent):void
{
vwSignIn.visible = true;
vwUpload.visible = false;
}
protected function vwSignIn_SignedIn(e:SignedInEvent):void
{
vwSignIn.visible = false;
vwUpload.visible = true;
}
protected function vwUpload_SignOut(e:SignedOutEvent):void
{
vwSignIn.visible = true;
vwUpload.visible = false;
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<views:SignInView id="vwSignIn" left="0" top="0" right="0" bottom="0">
</views:SignInView>
<views:UploadView id="vwUpload" left="0" top="0" bottom="0" right="0"
visible="false">
</views:UploadView>
</s:WindowedApplication>
+21
View File
@@ -0,0 +1,21 @@
package
{
public class Model
{
[Bindable] public static var url:String;
[Bindable] public static var username:String;
[Bindable] public static var password:String;
[Bindable] public static var ticket:String;
[Bindable] public static var displayName:String;
[Bindable] public static var umbracoPath:String;
[Bindable] public static var maxRequestLength:Number;
[Bindable] public static var currentFolder:XML;
[Bindable] public static var folderId:Number = 0;
[Bindable] public static var folderName:String = "";
[Bindable] public static var folderPath:String = "";
[Bindable] public static var replaceExisting:Boolean = false;
}
}
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="260" height="350" title="Select a folder..." creationComplete="folderPickerDialog_CreationComplete(event)"
close="folderPickerDialog_Close(event)" borderVisible="true" chromeColor="#EEEEEE" borderColor="#666666">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.net.*;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.events.FlexEvent;
import mx.managers.*;
protected function folderPickerDialog_CreationComplete(event:FlexEvent):void
{
CursorManager.setBusyCursor();
DmuRequest.makeRequest(DmuRequestAction.FOLDER_LIST,
folderListLoader_Complete,
folderListLoader_Error);
}
protected function folderListLoader_Complete(event:DmuRequestEvent):void
{
CursorManager.removeBusyCursor();
var xml:XML = event.result;
trFolders.dataProvider = xml.folder;
trFolders.labelField = "@name";
trFolders.validateNow();
// Reselect current folder
if (Model.folderId)
{
var node:XMLList = xml..folder.(@id == Model.folderId.toString());
if (node.length() > 0)
{
expandParents(node[0]);
trFolders.selectedItem = node[0];
var idx:int = trFolders.getItemIndex(node[0]);
trFolders.scrollToIndex(idx);
}
else
{
Model.folderId = undefined;
Model.folderName = undefined;
}
}
}
protected function folderListLoader_Error(event:Event):void
{
CursorManager.removeBusyCursor();
Alert.show("Unable to load folder list", "Ooops!");
}
protected function folderPickerDialog_Close(event:CloseEvent):void
{
PopUpManager.removePopUp(this);
}
protected function trFolders_DoubleClick(event:MouseEvent):void
{
var item:XML = trFolders.selectedItem as XML;
Model.currentFolder = item;
Model.folderId = item.@id;
Model.folderName = item.@name;
var pathItem:XML = item;
var path:String = pathItem.@name;
while(pathItem.parent())
{
pathItem = pathItem.parent();
if(pathItem.@name != undefined)
{
path = pathItem.@name +"/"+ path;
}
}
Model.folderPath = path;
PopUpManager.removePopUp(this);
}
private function expandParents(node:XML):void
{
if (node && !trFolders.isItemOpen(node))
{
trFolders.expandItem(node, true);
expandParents(node.parent());
}
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<mx:Tree width="100%" height="100%" id="trFolders"
defaultLeafIcon="@Embed('assets/folder.png')"
folderClosedIcon="@Embed('assets/folder.png')"
folderOpenIcon="@Embed('assets/folder-open.png')"
paddingLeft="5" paddingRight="5" paddingTop="2" paddingBottom="2"
doubleClickEnabled="true" doubleClick="trFolders_DoubleClick(event)" borderVisible="false"></mx:Tree>
</s:TitleWindow>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
backgroundColor="#e7e7e7" borderColor="#CCCCCC"
width="100%" height="30">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
[Bindable] public var totalItems:int;
protected function btnUploadRemove_Click(event:MouseEvent):void
{
dispatchEvent(new Event(Event.CANCEL));
}
]]>
</fx:Script>
<mx:Image left="7" source="@Embed('assets/information.png')" width="16" height="16" verticalCenter="0"/>
<mx:Label id="lblUploadName" text="Total of {totalItems} File{(totalItems == 1)? '' : 's'}" fontWeight="bold" fontSize="12" color="#999999" left="27" truncateToFit="true" minWidth="0" right="35" verticalCenter="0"/>
<s:Button id="btnUploadRemove" width="16" height="16" top="5" right="5" useHandCursor="true" buttonMode="true" styleName="removeButton" click="btnUploadRemove_Click(event)" />
</s:BorderContainer>
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
backgroundColor="#F5F5F5" borderColor="#CCCCCC"
borderColor.Error="#C50101" backgroundColor.Error="#F3DBDB"
height.Ready="45" height="60" width="100%">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.net.*;
import org.umbraco.desktopmediauploader.util.*;
import flash.desktop.*;
import flash.events.*;
import flash.filesystem.*;
import flash.net.*;
import org.osmf.utils.URL;
[Bindable] public var file:FileReference;
[Bindable] public var path:String;
[Bindable] public var uploading:Boolean = false;;
[Bindable] public var uploaded:Boolean = false;
public function get fullPath():String
{
return path + "/" + file.name;
}
protected function btnUploadRemove_Click(event:MouseEvent):void
{
cancel();
}
protected function file_Complete(event:DataEvent):void
{
uploading = false;
var result:String = StringHelper.cleanXmlString(event.data);
var xml:XML = new XML(result);
if (xml.@success == "true")
{
uploaded = true;
dispatchEvent(new Event(Event.COMPLETE));
}
else
{
file_SecurityError(new SecurityErrorEvent(SecurityErrorEvent.SECURITY_ERROR));
}
}
protected function file_Progress(event:ProgressEvent):void
{
dispatchEvent(event);
}
protected function file_HttpError(event:HTTPStatusEvent):void
{
setCurrentState("Error");
dispatchEvent(event);
}
protected function file_IOError(event:IOErrorEvent):void
{
setCurrentState("Error");
dispatchEvent(event);
}
protected function file_SecurityError(event:SecurityErrorEvent):void
{
setCurrentState("Error");
dispatchEvent(event);
}
public function upload():void
{
setCurrentState("Uploading");
uploading = true;
var vars:URLVariables = new URLVariables();
vars.parentNodeId = Model.folderId;
vars.replaceExisting = Model.replaceExisting ? "1" : "0";
vars.path = path;
var req:URLRequest = DmuRequest.getRequest(DmuRequestAction.UPLOAD, vars);
file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, file_Complete);
file.addEventListener(ProgressEvent.PROGRESS, file_Progress);
file.addEventListener(HTTPStatusEvent.HTTP_STATUS, file_HttpError);
file.addEventListener(IOErrorEvent.IO_ERROR, file_IOError);
file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, file_SecurityError);
file.upload(req);
}
public function pause():void
{
if (uploading)
file.cancel();
uploading = false;
}
public function cancel():void
{
pause();
dispatchEvent(new Event(Event.CANCEL));
}
private function trim( s:String ):String
{
return s.replace( /^([\s|\t|\n]+)?(.*)([\s|\t|\n]+)?$/gm, "$2" );
}
]]>
</fx:Script>
<s:states>
<s:State name="Ready"/>
<s:State name="Uploading"/>
<s:State name="Error"/>
</s:states>
<mx:Image top="6" left="5" source="@Embed('assets/page.png')"/>
<mx:Label id="lblUploadName" text="{file.name}" fontWeight="bold" color="#000000" left="40" top="4" truncateToFit="true" minWidth="0" right="35" />
<s:Button id="btnUploadRemove" width="16" height="16" top="5" right="5" useHandCursor="true" buttonMode="true" click="btnUploadRemove_Click(event)" styleName="removeButton" />
<mx:ProgressBar id="pbUploadProgress" labelPlacement="top" label="" source="{file}" bottom="5" left="5" right="5" excludeFrom="Ready" />
<mx:Label id="lblUploadPath" left="40" top="20" right="35" fontSize="11" color="#CCCCCC" truncateToFit="true" minWidth="0" fontAntiAliasType="advanced" fontGridFitType="pixel" fontThickness="200" fontSharpness="400"
htmlText="&lt;font color='#666666'&gt;{Model.folderPath.replace(/\//g, ' ')}&lt;/font&gt;{path.replace(/\//g, ' ')}"/>
</s:BorderContainer>
@@ -0,0 +1,19 @@
package org.umbraco.desktopmediauploader.events
{
import flash.events.Event;
public class DmuRequestEvent extends Event
{
public static const SUCCESS:String = "success";
public static const ERROR:String = "error";
public var result:XML;
public function DmuRequestEvent(type:String, result:XML = null, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
this.result = result;
}
}
}
@@ -0,0 +1,18 @@
package org.umbraco.desktopmediauploader.events
{
import flash.events.Event;
public class SignedInEvent extends Event
{
public static const SIGNED_IN:String = "signedIn";
public function SignedInEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
override public function clone():Event {
return new SignedInEvent(type, bubbles, cancelable);
}
}
}
@@ -0,0 +1,18 @@
package org.umbraco.desktopmediauploader.events
{
import flash.events.Event;
public class SignedOutEvent extends Event
{
public static const SIGNED_OUT:String = "signedOut";
public function SignedOutEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
override public function clone():Event {
return new SignedOutEvent(type, bubbles, cancelable);
}
}
}
@@ -0,0 +1,77 @@
package org.umbraco.desktopmediauploader.net
{
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.util.*;
import flash.events.*;
import flash.net.*;
public class DmuRequest extends EventDispatcher
{
public function DmuRequest(action:String, vars:URLVariables = null, target:IEventDispatcher = null)
{
super(target);
var req:URLRequest = getRequest(action, vars);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loader_Success);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_Error);
loader.load(req);
}
private function loader_Success(event:Event):void
{
var loader:URLLoader = event.target as URLLoader;
if (loader != null)
{
var result:String = StringHelper.cleanXmlString(loader.data);
var xml:XML = new XML(result);
if (xml.@success == "true")
{
dispatchEvent(new DmuRequestEvent(DmuRequestEvent.SUCCESS, xml));
}
else
{
loader_Error();
}
}
else
{
loader_Error();
}
}
private function loader_Error(event:IOErrorEvent = null):void
{
dispatchEvent(new DmuRequestEvent(DmuRequestEvent.ERROR));
}
public static function getRequest(action:String, vars:URLVariables = null):URLRequest
{
var loaderUrl:String = Model.url +"/umbraco/webservices/mediauploader.ashx";
if (vars == null)
vars = new URLVariables();
vars.action = action;
vars.username = Model.username;
vars.password = Model.password;
vars.ticket = Model.ticket;
var req:URLRequest = new URLRequest(loaderUrl);
req.data = vars;
req.method = URLRequestMethod.POST;
return req;
}
public static function makeRequest(action:String, successCallback:Function, errorCallback:Function,
vars:URLVariables = null):void
{
var req:DmuRequest = new DmuRequest(action, vars);
req.addEventListener(DmuRequestEvent.SUCCESS, successCallback);
req.addEventListener(DmuRequestEvent.ERROR, errorCallback);
}
}
}
@@ -0,0 +1,9 @@
package org.umbraco.desktopmediauploader.net
{
public class DmuRequestAction
{
public static var CONFIG:String = "config";
public static var FOLDER_LIST:String = "folderList";
public static var UPLOAD:String = "upload";
}
}
@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2009/03/13/setting-a-linear-gradient-background-on-an-fxapplication-container-in-flex-gumbo/ -->
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
alpha.disabled="0.5"
alpha.disabledWithControlBar="0.5">
<s:states>
<s:State name="normal" />
<s:State name="disabled" />
<s:State name="normalWithControlBar" />
<s:State name="disabledWithControlBar" />
<s:State name="normalAndInactive" />
</s:states>
<fx:Metadata>
<![CDATA[
[HostComponent("spark.components.Application")]
]]>
</fx:Metadata>
<!-- fill -->
<!---
A rectangle with a solid color fill that forms the background of the application.
The color of the fill is set to the Application's backgroundColor property.
-->
<s:Rect id="backgroundRect" left="0" right="0" top="0" bottom="0" >
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="#cccccc" />
<s:GradientEntry color="#eeeeee" ratio="0.2" />
<s:GradientEntry color="#ffffff" ratio="0.8" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<s:Group left="0" right="0" top="0" bottom="0">
<s:layout>
<s:VerticalLayout gap="0" horizontalAlign="justify" />
</s:layout>
<s:Group id="topGroup" minWidth="0" minHeight="0"
includeIn="normalWithControlBar, disabledWithControlBar" >
<!-- layer 0: control bar highlight -->
<s:Rect left="0" right="0" top="0" bottom="1" >
<s:stroke>
<s:LinearGradientStroke rotation="90" weight="1">
<s:GradientEntry color="0xFFFFFF" />
<s:GradientEntry color="0xD8D8D8" />
</s:LinearGradientStroke>
</s:stroke>
</s:Rect>
<!-- layer 1: control bar fill -->
<s:Rect left="1" right="1" top="1" bottom="2" >
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="0xEDEDED" />
<s:GradientEntry color="0xCDCDCD" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<!-- layer 2: control bar divider line -->
<s:Rect left="0" right="0" bottom="0" height="1" alpha="0.55">
<s:fill>
<s:SolidColor color="0x000000" />
</s:fill>
</s:Rect>
<!-- layer 3: control bar -->
<s:Group id="controlBarGroup" left="0" right="0" top="1" bottom="1" minWidth="0" minHeight="0">
<s:layout>
<s:HorizontalLayout paddingLeft="10" paddingRight="10" paddingTop="7" paddingBottom="7" gap="10" />
</s:layout>
</s:Group>
</s:Group>
<s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0" />
</s:Group>
</s:Skin>
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ADOBE SYSTEMS INCORPORATED
Copyright 2009 Adobe Systems Incorporated
All Rights Reserved.
NOTICE: Adobe permits you to use, modify, and distribute this file
in accordance with the terms of the license agreement accompanying it.
-->
<!--- The default skin class for a Spark DefaultItemRenderer class.
@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:ItemRenderer focusEnabled="false" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" useHandCursor="true" buttonMode="true">
<s:states>
<s:State name="normal" />
<s:State name="hovered" />
<s:State name="selected" />
<s:State name="normalAndShowsCaret"/>
<s:State name="hoveredAndShowsCaret"/>
<s:State name="selectedAndShowsCaret"/>
</s:states>
<s:Rect left="0" right="0" top="0" bottom="0">
<s:stroke.normalAndShowsCaret>
<s:SolidColorStroke
color="{getStyle('selectionColor')}"
weight="1"/>
</s:stroke.normalAndShowsCaret>
<s:stroke.hoveredAndShowsCaret>
<s:SolidColorStroke
color="{getStyle('selectionColor')}"
weight="1"/>
</s:stroke.hoveredAndShowsCaret>
<s:stroke.selectedAndShowsCaret>
<s:SolidColorStroke
color="{getStyle('selectionColor')}"
weight="1"/>
</s:stroke.selectedAndShowsCaret>
<s:fill>
<s:SolidColor
color.normal="0x9a9a9a"
color.normalAndShowsCaret="0x9a9a9a"
color.hovered="{getStyle('rollOverColor')}"
color.hoveredAndShowsCaret="{getStyle('rollOverColor')}"
color.selected="{getStyle('selectionColor')}"
color.selectedAndShowsCaret="{getStyle('selectionColor')}"
/>
</s:fill>
</s:Rect>
<s:Label id="labelDisplay" verticalCenter="0" left="5" right="5" top="6" bottom="4"/>
</s:ItemRenderer>
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ADOBE SYSTEMS INCORPORATED
Copyright 2009 Adobe Systems Incorporated
All Rights Reserved.
NOTICE: Adobe permits you to use, modify, and distribute this file
in accordance with the terms of the license agreement accompanying it.
-->
<!--- The default skin class for the anchor button on a Spark DropDownList component.
@see spark.components.DropDownList
@see spark.skins.spark.DropDownListSkin
@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="21" minHeight="21">
<fx:Metadata>
<![CDATA[
/**
* @copy spark.skins.spark.ApplicationSkin#hostComponent
*/
[HostComponent("spark.components.Button")]
]]>
</fx:Metadata>
<!-- states -->
<s:states>
<s:State name="up" />
<s:State name="over" />
<s:State name="down" />
<s:State name="disabled" />
</s:states>
<!-- Layer 2: innerFill -->
<s:Rect id="innerFill" left="0" right="0" top="0" bottom="0" radiusX="0">
<s:fill>
<s:SolidColor color="0x9a9a9a" color.up="0x8a8a8a" />
</s:fill>
</s:Rect>
<!-- layer 8: arrow -->
<!--- The arrow graphic displayed in the anchor button. -->
<s:Path right="6" verticalCenter="0" id="arrow"
data="M 7.03 0.5 C 7.43 0.9 7.43 1.55 7.03 1.95 L 4.64 4.34 C 4.24 4.74 3.59 4.74 3.19 4.34 L 0.8 1.95 C 0.4 1.55 0.4 0.9 0.8 0.5 L 7.03 0.5 Z">
<s:fill>
<s:SolidColor color="0xFFFFFF" />
</s:fill>
</s:Path>
</s:Skin>
@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ADOBE SYSTEMS INCORPORATED
Copyright 2009 Adobe Systems Incorporated
All Rights Reserved.
NOTICE: Adobe permits you to use, modify, and distribute this file
in accordance with the terms of the license agreement accompanying it.
-->
<!--- The default skin class for the Spark DropDownList component.
The skin for the anchor button for a DropDownList component
is defined by the DropDownListButtonSkin class.
@see spark.components.DropDownList
@see spark.skins.spark.DropDownListButtonSkin
@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled=".5">
<!-- host component -->
<fx:Metadata>
<![CDATA[
/**
* @copy spark.skins.spark.ApplicationSkin#hostComponent
*/
[HostComponent("spark.components.DropDownList")]
]]>
</fx:Metadata>
<s:states>
<s:State name="normal" />
<s:State name="open" />
<s:State name="disabled" />
</s:states>
<!---
The PopUpAnchor control that opens the drop-down list.
-->
<s:PopUpAnchor id="popUp" displayPopUp.normal="false" displayPopUp.open="true" includeIn="open"
left="0" right="0" top="0" bottom="0" itemDestructionPolicy="auto"
popUpPosition="below" popUpWidthMatchesAnchorWidth="true">
<!---
The drop down area of the skin.
This includes borders, background colors, scrollers, and filters.
-->
<s:Group id="dropDown" maxHeight="134" >
<!-- fill -->
<!---
Defines the appearance of drop-down list's background fill.
-->
<s:Rect id="background" left="0" right="0" top="0" bottom="0" >
<s:fill>
<!---
The color of the drop down's background fill.
The default color is 0xFFFFFF.
-->
<s:SolidColor id="bgFill" color="0x9a9a9a" />
</s:fill>
</s:Rect>
<s:Scroller id="scroller" left="0" top="0" right="0" bottom="0" hasFocusableChildren="false" minViewportInset="1">
<!---
The container for the data items in the drop-down list.
-->
<s:DataGroup id="dataGroup" itemRenderer="org.umbraco.desktopmediauploader.skins.DefaultItemRenderer">
<s:layout>
<s:VerticalLayout gap="0" horizontalAlign="contentJustify"/>
</s:layout>
</s:DataGroup>
</s:Scroller>
</s:Group>
</s:PopUpAnchor>
<!--- The anchor button used by the DropDownList. The default skin is DropDownListButtonSkin. -->
<s:Button id="openButton" left="0" right="0" top="0" bottom="0" focusEnabled="false"
skinClass="org.umbraco.desktopmediauploader.skins.HeaderDropDownListButtonSkin" />
<!--- The prompt area of the DropDownList. -->
<s:Label id="labelDisplay" verticalAlign="middle" maxDisplayedLines="1"
mouseEnabled="false" mouseChildren="false"
left="5" right="20" top="2" bottom="2" width="75" verticalCenter="1" />
</s:Skin>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="21" minHeight="21" alpha.disabled="0.5">
<!-- host component -->
<fx:Metadata>
<![CDATA[
[HostComponent("spark.components.Button")]
]]>
</fx:Metadata>
<!-- states -->
<s:states>
<s:State name="up" />
<s:State name="over" />
<s:State name="down" />
<s:State name="disabled" />
</s:states>
<mx:Image source="@Embed('assets/cross-grey.png')"
source.over="@Embed('assets/cross.png')"
/>
</s:SparkSkin>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="21" minHeight="21" alpha.disabled="0.5">
<!-- host component -->
<fx:Metadata>
<![CDATA[
[HostComponent("spark.components.Button")]
]]>
</fx:Metadata>
<!-- states -->
<s:states>
<s:State name="up" />
<s:State name="over" />
<s:State name="down" />
<s:State name="disabled" />
</s:states>
<mx:Image source="@Embed('assets/power.png')"
source.over="@Embed('assets/power-over.png')"
/>
</s:SparkSkin>
@@ -0,0 +1,176 @@
package org.umbraco.desktopmediauploader.util
{
import flash.utils.ByteArray;
public class Base64
{
private static const _encodeChars:Vector.<int> = InitEncoreChar();
private static const _decodeChars:Vector.<int> = InitDecodeChar();
public static function encode(data:ByteArray):String
{
var out:ByteArray = new ByteArray();
//Presetting the length keep the memory smaller and optimize speed since there is no "grow" needed
out.length = (2 + data.length - ((data.length + 2) % 3)) * 4 / 3; //Preset length //1.6 to 1.5 ms
var i:int = 0;
var r:int = data.length % 3;
var len:int = data.length - r;
var c:int; //read (3) character AND write (4) characters
while (i < len)
{
//Read 3 Characters (8bit * 3 = 24 bits)
c = data[i++] << 16 | data[i++] << 8 | data[i++];
//Cannot optimize this to read int because of the positioning overhead. (as3 bytearray seek is slow)
//Convert to 4 Characters (6 bit * 4 = 24 bits)
c = (_encodeChars[c >>> 18] << 24) | (_encodeChars[c >>> 12 & 0x3f] << 16) | (_encodeChars[c >>> 6 & 0x3f] << 8 ) | _encodeChars[c & 0x3f];
//Optimization: On older and slower computer, do one write Int instead of 4 write byte: 1.5 to 0.71 ms
out.writeInt(c);
/*
out.writeByte(_encodeChars[c >> 18] );
out.writeByte(_encodeChars[c >> 12 & 0x3f]);
out.writeByte(_encodeChars[c >> 6 & 0x3f]);
out.writeByte(_encodeChars[c & 0x3f]);
*/
}
if (r == 1) //Need two "=" padding
{
//Read one char, write two chars, write padding
c = data[i];
c = (_encodeChars[c >>> 2] << 24) | (_encodeChars[(c & 0x03) << 4] << 16) | 61 << 8 | 61;
out.writeInt(c);
}
else if (r == 2) //Need one "=" padding
{
c = data[i++] << 8 | data[i];
c = (_encodeChars[c >>> 10] << 24) | (_encodeChars[c >>> 4 & 0x3f] << 16) | (_encodeChars[(c & 0x0f) << 2] << 8 ) | 61;
out.writeInt(c);
}
out.position = 0;
return out.readUTFBytes(out.length);
}
public static function decode(str:String):ByteArray
{
var c1:int;
var c2:int;
var c3:int;
var c4:int;
var i:int;
var len:int;
var out:ByteArray;
len = str.length;
i = 0;
out = new ByteArray();
var byteString:ByteArray = new ByteArray();
byteString.writeUTFBytes(str);
while (i < len)
{
//c1
do
{
c1 = _decodeChars[byteString[i++]];
} while (i < len && c1 == -1);
if (c1 == -1) break;
//c2
do
{
c2 = _decodeChars[byteString[i++]];
} while (i < len && c2 == -1);
if (c2 == -1) break;
out.writeByte((c1 << 2) | ((c2 & 0x30) >> 4));
//c3
do
{
c3 = byteString[i++];
if (c3 == 61) return out;
c3 = _decodeChars[c3];
} while (i < len && c3 == -1);
if (c3 == -1) break;
out.writeByte(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2));
//c4
do {
c4 = byteString[i++];
if (c4 == 61) return out;
c4 = _decodeChars[c4];
} while (i < len && c4 == -1);
if (c4 == -1) break;
out.writeByte(((c3 & 0x03) << 6) | c4);
}
return out;
}
public static function encodeString(value : String) : String
{
const source : ByteArray = new ByteArray();
source.writeUTFBytes(value);
return encode(source);
}
public static function decodeToString(str : String) : String
{
return decode(str).toString();
}
public static function InitEncoreChar() : Vector.<int>
{
var encodeChars:Vector.<int> = new Vector.<int>();
// We could push the number directly, but i think it's nice to see the characters (with no overhead on encode/decode)
var chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (var i:int = 0; i < 64; i++)
{
encodeChars.push(chars.charCodeAt(i));
}
/*
encodeChars.push(
65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 43, 47);
*/
return encodeChars;
}
public static function InitDecodeChar() : Vector.<int>
{
var decodeChars:Vector.<int> = new Vector.<int>();
decodeChars.push(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
return decodeChars;
}
}
}
@@ -0,0 +1,47 @@
package org.umbraco.desktopmediauploader.util
{
import flash.display.Stage;
import flash.events.Event;
public class StageHelper
{
private static var _stage:Stage;
private static var _resizeListenerSet:Boolean = false;
[Bindable]
public static var stageWidth:int = 0;
[Bindable]
public static var stageHeight:int = 0;
public function StageHelper()
{ }
public static function set stage(value:Stage):void
{
_stage = value;
addResizeListener();
stage_resize();
}
private static function addResizeListener():void
{
if (_resizeListenerSet)
return;
if(!_stage)
return;
_stage.addEventListener(Event.RESIZE, stage_resize);
_resizeListenerSet = true;
}
private static function stage_resize(e:Event = null):void
{
stageWidth = _stage.stageWidth;
stageHeight = _stage.stageHeight;
}
}
}
@@ -0,0 +1,16 @@
package org.umbraco.desktopmediauploader.util
{
import mx.utils.*;
public class StringHelper
{
public static function cleanXmlString(str:String):String
{
// Remove any Byte Order Markers
str = str.replace(String.fromCharCode(65279), "");
// Trim whitespace
return StringUtil.trim(str);
}
}
}
@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="100%" height="100%"
show="vwSignIn_ShowHandler(event);">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.net.*;
import org.umbraco.desktopmediauploader.util.*;
import mx.controls.Alert;
import mx.managers.*;
import mx.events.FlexEvent;
public function init():void
{
NativeApplication.nativeApplication.addEventListener(BrowserInvokeEvent.BROWSER_INVOKE, app_BrowserInvoke);
reset();
if(chkAutoSignIn.selected)
{
doSignIn();
}
}
protected function vwSignIn_ShowHandler(event:FlexEvent):void
{
reset();
}
protected function app_BrowserInvoke(e:BrowserInvokeEvent):void
{
var encLaunchArg:String = unescape(e.arguments[0]);
var launchArg:String = Base64.decodeToString(encLaunchArg);
var launchArgs:Array = launchArg.split(";");
Model.url = parseUrl(launchArgs[0]);
Model.username = launchArgs[1];
Model.password = "";
Model.ticket = launchArgs[2];
// Ok, time to hit the server
CursorManager.setBusyCursor();
this.enabled = false;
// Authenticate credentials
// NB: As every request authenticates anyway, just load config
// and if it fails, assume login was invalid
DmuRequest.makeRequest(DmuRequestAction.CONFIG,
configRequest_Success,
configRequest_Error);
}
protected function reset():void
{
chkRememberMe.selected = (getEncryptedValue("dmu_rememberme") == "true");
chkRememberPassword.selected = (getEncryptedValue("dmu_rememberpassword") == "true");
chkAutoSignIn.selected = (getEncryptedValue("dmu_autosignin") == "true");
if (chkRememberMe.selected)
{
txtUrl.text = getEncryptedValue("dmu_url");
txtUsername.text = getEncryptedValue("dmu_username");
if (chkRememberPassword.selected)
{
txtPassword.text = getEncryptedValue("dmu_password");
}
}
}
protected function txtPassword_Enter(event:Event):void
{
doSignIn();
}
protected function btnSignIn_clickHandler(event:MouseEvent=null):void
{
doSignIn();
}
protected function configRequest_Success(event:DmuRequestEvent):void
{
this.enabled = true;
CursorManager.removeBusyCursor();
var xml:XML = event.result;
// Store config
Model.displayName = xml.displayName;
Model.umbracoPath = xml.umbracoPath;
Model.maxRequestLength = Number(xml.maxRequestLength);
// Remember login
if(!Model.ticket || Model.ticket == "")
{
setEncryptedValue("dmu_url", (chkRememberMe.selected)? Model.url : null);
setEncryptedValue("dmu_username", (chkRememberMe.selected)? Model.username : null);
setEncryptedValue("dmu_password", (chkRememberMe.selected && chkRememberPassword.selected) ? Model.password : null);
setEncryptedValue("dmu_rememberme", chkRememberMe.selected.toString());
setEncryptedValue("dmu_rememberpassword", chkRememberPassword.selected.toString());
setEncryptedValue("dmu_autosignin", chkAutoSignIn.selected.toString());
}
dispatchEvent(new SignedInEvent(SignedInEvent.SIGNED_IN));
}
protected function configRequest_Error(event:Event):void
{
this.enabled = true;
CursorManager.removeBusyCursor();
Alert.show("Invalid login", "Ooops!");
}
private function doSignIn():void
{
Model.url = parseUrl(txtUrl.text);
Model.username = txtUsername.text;
Model.password = txtPassword.text;
Model.ticket = "";
// Ok, time to hit the server
CursorManager.setBusyCursor();
this.enabled = false;
// Authenticate credentials
// NB: As every request authenticates anyway, just load config
// and if it fails, assume login was invalid
DmuRequest.makeRequest(DmuRequestAction.CONFIG,
configRequest_Success,
configRequest_Error);
}
private function parseUrl(url:String):String
{
var urlPattern:RegExp = /^((?P<scheme>https?):\/\/)(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?((?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?)?$/gi;
var result:Array = urlPattern.exec(url.toLowerCase());
if (result != null && result.length > 0)
{
var parsedUrl:String = result.scheme + "://" + result.hostname + result.port + result.path + result.filename;
while(parsedUrl.substr(parsedUrl.length - 1) == "/")
{
parsedUrl = parsedUrl.substr(0, parsedUrl.length - 1);
}
return parsedUrl;
}
return url;
}
private function setEncryptedValue(key:String, value:String):void
{
if (value != null)
{
var data:ByteArray = new ByteArray();
data.writeUTFBytes(value);
EncryptedLocalStore.setItem(key, data);
}
else
{
EncryptedLocalStore.removeItem(key);
}
}
private function getEncryptedValue(key:String):String
{
var data:ByteArray = EncryptedLocalStore.getItem(key);
return (data != null) ? data.readUTFBytes(data.length) : null;
}
]]>
</fx:Script>
<fx:Metadata>
[Event(name="signedIn", type="org.umbraco.desktopmediauploader.events.SignedInEvent")]
</fx:Metadata>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<mx:Image horizontalCenter="0" source="@Embed('assets/logo.png')" verticalCenter="-145"/>
<s:VGroup id="grpSignInForm" height="200" bottom="105" left="25" right="25">
<s:Label text="URL" fontWeight="bold"/>
<s:TextInput width="100%" id="txtUrl" text="@{Model.url}"/>
<s:Label text="Username" fontWeight="bold"/>
<s:TextInput width="100%" id="txtUsername" text="@{Model.username}"/>
<s:Label text="Password" fontWeight="bold"/>
<s:TextInput width="100%" id="txtPassword" displayAsPassword="true" text="@{Model.password}" enter="txtPassword_Enter(event)" />
<s:CheckBox label="Remember Me" id="chkRememberMe" change="(!chkRememberMe.selected) ? chkRememberPassword.selected = chkAutoSignIn.selected = false : null"/>
<s:CheckBox label="Remember Password" id="chkRememberPassword" enabled="{chkRememberMe.selected}" change="(!chkRememberPassword.selected) ? chkAutoSignIn.selected = false : null"/>
<s:CheckBox label="Sign In Automaticaly" id="chkAutoSignIn" enabled="{chkRememberPassword.selected}"/>
</s:VGroup>
<mx:Button label="Sign In" bottom="25" id="btnSignIn" click="btnSignIn_clickHandler(event)" left="25" right="25" height="35" useHandCursor="true" buttonMode="true" styleName=""/>
</s:Group>
@@ -0,0 +1,331 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:components="org.umbraco.desktopmediauploader.components.*"
width="100%" height="100%"
creationComplete="vwUpload_CreationCompleteHandler(event)"
show="vwUpload_ShowHandler(event);">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import org.umbraco.desktopmediauploader.components.*;
import org.umbraco.desktopmediauploader.events.*;
import org.umbraco.desktopmediauploader.net.*;
import org.umbraco.desktopmediauploader.util.*;
import flash.desktop.*;
import flash.events.*;
import flash.filesystem.File;
import flash.net.*;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.controls.Alert;
import mx.controls.Menu;
import mx.core.ScrollPolicy;
import mx.events.FlexEvent;
import mx.managers.*;
import spark.events.IndexChangeEvent;
[Bindable] public var currentUploadItem:UploadItem;
[Bindable] public var uploadItems:ArrayCollection;
[Bindable] private var uploading:Boolean = false;
protected function vwUpload_CreationCompleteHandler(event:FlexEvent):void
{
uploadItems = new ArrayCollection();
addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, vwUpload_DragEnter);
addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, vwUpload_DragDrop);
dmuStatus.addEventListener(Event.CANCEL, dmuStatus_Cancel);
}
protected function vwUpload_ShowHandler(event:FlexEvent):void
{
reset();
}
private function vwUpload_DragEnter(e:NativeDragEvent) :void
{
var valid:Boolean = false;
if(e.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT))
{
// Only allow drop if at least 1 file is valid
var files:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
for each (var f:File in files)
{
if (isValidFile(f))
{
valid = true;
break;
}
}
if (valid)
NativeDragManager.acceptDragDrop(this);
}
}
private function vwUpload_DragDrop(e:NativeDragEvent) :void
{
var files:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
addFilesToQueue(files);
// Sort alphabeticlly
var sf:SortField = new SortField("fullPath", true);
var s:Sort = new Sort();
s.fields = [sf];
uploadItems.sort = s;
uploadItems.refresh();
for(var i:int = 0; i < uploadItems.length; i++)
{
grpUploadItemContainer.addElement(uploadItems[i]);
}
}
private function reset():void
{
Model.currentFolder = undefined;
Model.folderId = undefined;
Model.folderName = undefined;
Model.folderPath = undefined;
uploading = false;
currentUploadItem == null;
dmuStatus_Cancel();
}
private function isValidFile(file:File, path:String = ""):Boolean
{
var queued:Boolean = false;
var i:int = uploadItems.length;
while(i--)
{
var uploadItem:UploadItem = uploadItems[i] as UploadItem;
if (uploadItem != null && uploadItem.file.name == file.name && uploadItem.path == path && uploadItem.file.size == file.size)
{
queued = true;
break;
}
}
// TODO: Handle .lnk files?
// TODO: What to do with zip files?
return (!file.isSymbolicLink &&
!file.isPackage &&
!file.isHidden &&
!queued &&
file.size <= (Model.maxRequestLength * 1024));
}
private function addFilesToQueue(files:Array, path:String = ""):void
{
for each (var f:File in files)
{
if(f.isDirectory)
{
addFilesToQueue(f.getDirectoryListing(), path + "/" + f.name)
}
else if (isValidFile(f, path))
{
addFileToQueue(FileReference(f), path);
}
}
}
private function addFileToQueue(file:FileReference, path:String):void
{
var uploadItem:UploadItem = new UploadItem();
uploadItem.file = file;
uploadItem.path = path;
uploadItem.addEventListener(Event.COMPLETE, uploadItem_Complete);
uploadItem.addEventListener(Event.CANCEL, uploadItem_Cancel);
uploadItem.addEventListener(HTTPStatusEvent.HTTP_STATUS, uploadItem_Error);
uploadItem.addEventListener(IOErrorEvent.IO_ERROR, uploadItem_Error);
uploadItem.addEventListener(SecurityErrorEvent.SECURITY_ERROR, uploadItem_Error);
grpUploadItemContainer.addElement(uploadItem);
uploadItems.addItem(uploadItem);
}
protected function ddlConnectedTo_Close(e:Event):void
{
var oldIndex:Number = ddlConnectedTo.selectedIndex;
ddlConnectedTo.selectedIndex = -1;
if (oldIndex >= 0)
{
switch(ddlConnectedTo.dataProvider[oldIndex])
{
case "Launch Site":
navigateToURL(new URLRequest(Model.url));
break;
case "Launch Admin":
navigateToURL(new URLRequest(Model.url + Model.umbracoPath + "/"));
break;
}
}
}
protected function btnSignOut_Click(e:Event):void
{
if (uploading)
Alert.show("Unable to sign out whilst uploading files.", "Ooops!");
else
dispatchEvent(new SignedOutEvent(SignedOutEvent.SIGNED_OUT));
}
protected function uploadItem_Complete(e:Event):void
{
uploadItem_Cancel(e);
uploading = false;
currentUploadItem == null;
if (uploadItems.length > 0)
btnUpload_Click();
else
Alert.show("Upload complete.", "Woo hoo!");
}
protected function uploadItem_Cancel(e:Event):void
{
var uploadItem:UploadItem = e.target as UploadItem;
var i:uint = uploadItems.length;
while(i--)
{
var uploadItem2:UploadItem = uploadItems[i] as UploadItem;
if(uploadItem2.file.name == uploadItem.file.name && uploadItem2.path == uploadItem.path)
{
grpUploadItemContainer.removeElement(uploadItem);
uploadItems.removeItemAt(i);
break;
}
}
}
protected function uploadItem_Error(e:Event):void
{
// TODO: Move item to bottom?
}
protected function dmuStatus_Cancel(event:Event = null):void
{
var i:uint = uploadItems.length;
while(i--)
{
uploadItems[i].cancel();
}
}
protected function btnUploadTo_Click(event:MouseEvent):void
{
var win:FolderPickerDialog = PopUpManager.createPopUp(this, FolderPickerDialog, true) as FolderPickerDialog;
PopUpManager.centerPopUp(win);
}
protected function btnUpload_Click(event:MouseEvent = null):void
{
var uploadItem:UploadItem;
var i:int;
if (!uploading)
{
uploading = false;
currentUploadItem = null;
for(i = 0; i < uploadItems.length; i++)
{
uploadItem = uploadItems[i] as UploadItem;
if (!uploadItem.uploaded)
{
currentUploadItem = uploadItem;
currentUploadItem.upload();
uploading = true;
break;
}
}
}
else
{
for(i = 0; i < uploadItems.length; i++)
{
uploadItem = uploadItems[i] as UploadItem;
if (!uploadItem.uploaded)
{
uploadItem.pause();
}
}
uploading = false;
currentUploadItem = null;
}
}
]]>
</fx:Script>
<fx:Metadata>
[Event(name="signedOut", type="org.umbraco.desktopmediauploader.events.SignedOutEvent")]
</fx:Metadata>
<fx:Declarations>
<fx:Array id="uploadMenuItems">
<fx:Object label="Clear Queue" />
<fx:Object type="separator" />
<fx:Object label="Overwrite existing files" type="check" />
<fx:Object label="Auto extract zip files" type="check" />
</fx:Array>
</fx:Declarations>
<s:BorderContainer top="0" left="0" right="0" height="70" styleName="header">
<mx:Image source="@Embed('assets/icon-48.png')" x="10" y="10" />
<mx:Label id="lblName" text="{Model.displayName}" left="64" y="10" right="50" truncateToFit="true" minWidth="0" />
<s:DropDownList id="ddlConnectedTo" prompt="{Model.url}" close="ddlConnectedTo_Close(event)" x="65" y="33" typicalItem="{Model.url}" maxWidth="{StageHelper.stageWidth - 90}" open="ddlConnectedTo.scroller.setStyle('horizontalScrollPolicy', ScrollPolicy.OFF);" useHandCursor="true" buttonMode="true">
<mx:ArrayCollection>
<fx:String>Launch Site</fx:String>
<fx:String>Launch Admin</fx:String>
</mx:ArrayCollection>
</s:DropDownList>
<s:Button id="btnSignOut" width="13" height="15" top="11" right="25" useHandCursor="true" buttonMode="true" styleName="signOutButton" click="btnSignOut_Click(event)" />
</s:BorderContainer>
<s:VGroup top="90" left="25" right="25" gap="5">
<s:Label text="Upload files to..."/>
<s:Button id="btnUploadTo" label="{(Model.folderPath) ? Model.folderPath.replace(/\//g, ' ') : 'Please select...'}" width="100%" click="btnUploadTo_Click(event)" creationComplete="btnUploadTo.labelDisplay.setStyle('textAlign','left')" height="25" useHandCursor="true" buttonMode="true" />
</s:VGroup>
<s:BorderContainer top="150" left="25" right="25" bottom="100" borderColor="#CCCCCC" backgroundColor="#FFFFFF">
<s:Scroller width="100%" height="100%">
<s:Group id="grpUploadItemContainer">
<s:layout>
<s:VerticalLayout paddingLeft="5" paddingRight="5" paddingTop="5" paddingBottom="5" gap="5"/>
</s:layout>
<components:StatusItem id="dmuStatus" visible="{uploadItems.length &gt; 0}" includeInLayout="{uploadItems.length &gt; 0}" totalItems="{uploadItems.length}" />
<s:Label text="Drag Files and Folders Here To Upload" verticalAlign="middle" textAlign="center"
width="100%" height="100%" fontSize="20" color="#CCCCCC" id="lblInstructions"
paddingLeft="20" paddingRight="20" paddingTop="20" paddingBottom="20"
visible="{uploadItems.length == 0}" includeInLayout="{uploadItems.length == 0}"/>
</s:Group>
</s:Scroller>
</s:BorderContainer>
<s:CheckBox x="25" bottom="73" label="Overwrite existing files with the same filename?" id="chkReplace" selected="@{Model.replaceExisting}" color="#333333"/>
<mx:Button id="btnUpload" label="{!uploading ? 'Upload' : 'Cancel'}" useHandCursor="{btnUpload.enabled}" buttonMode="{btnUpload.enabled}" bottom="25" enabled="{uploadItems.length > 0 &amp;&amp; Model.folderId}" styleName="orange" height="35" left="25" right="25" click="btnUpload_Click(event)"/>
</s:Group>
-2
View File
@@ -230,13 +230,11 @@ namespace SqlCE4Umbraco
commandText, parameters));
}
internal IRecordsReader ExecuteReader(string commandText)
{
return ExecuteReader(commandText, new SqlCEParameter(string.Empty, string.Empty));
}
internal int ExecuteNonQuery(string commandText)
{
return ExecuteNonQuery(commandText, new SqlCEParameter(string.Empty, string.Empty));
+1 -1
View File
@@ -47,7 +47,7 @@ namespace Umbraco.Core
}
/// <summary>
/// Overridable method to execute when All resolvers have been initialized but resolution is not frozen so they can be modified in this method
/// OVerridable method to execute when All resolvers have been initialized but resolution is not frozen so they can be modified in this method
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
@@ -5,7 +5,7 @@ namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("7.2.0");
private static readonly Version Version = new Version("7.1.9");
/// <summary>
/// Gets the current version of Umbraco.
+1 -22
View File
@@ -41,11 +41,6 @@
/// Application alias for the users section.
/// </summary>
public const string Users = "users";
/// <summary>
/// Application alias for the users section.
/// </summary>
public const string Forms = "forms";
}
/// <summary>
@@ -71,26 +66,10 @@
/// <summary>
/// alias for the datatype tree.
/// </summary>
public const string DataTypes = "datatype";
/// <summary>
/// alias for the dictionary tree.
/// </summary>
public const string Dictionary = "dictionary";
public const string DataTypes = "datatype";
//TODO: Fill in the rest!
/// <summary>
/// alias for the media tree.
/// </summary>
public const string Templates = "template";
public const string RelationTypes = "relationTypes";
public const string Xslt = "xslt";
public const string Languages = "languages";
}
}
-12
View File
@@ -11,16 +11,6 @@ namespace Umbraco.Core
/// </summary>
public static class Conventions
{
public static class DataTypes
{
public const string ListViewPrefix = "List View - ";
}
public static class PropertyGroups
{
public const string ListViewGroupName = "umbContainerView";
}
/// <summary>
/// Constants for Umbraco Content property aliases.
/// </summary>
@@ -277,8 +267,6 @@ namespace Umbraco.Core
public const string DefaultAlias = "Member";
public const string SystemDefaultProtectType = "_umbracoSystemDefaultProtectType";
public const string AllMembersListId = "all-members";
}
/// <summary>
@@ -130,12 +130,6 @@ namespace Umbraco.Core
/// </summary>
public const string FolderBrowserAlias = "Umbraco.FolderBrowser";
/// <summary>
/// Alias for the grid datatype.
/// </summary>
public const string GridAlias = "Umbraco.Grid";
/// <summary>
/// Guid for the Image Cropper datatype.
/// </summary>
-4
View File
@@ -22,10 +22,6 @@
/// </summary>
public const int RecycleBinMedia = -21;
public const int DefaultContentListViewDataTypeId = -95;
public const int DefaultMediaListViewDataTypeId = -96;
public const int DefaultMembersListViewDataTypeId = -97;
}
}
}
@@ -5,7 +5,7 @@ namespace Umbraco.Core.Dictionary
/// <summary>
/// Resolves the current CultureDictionaryFactory
/// </summary>
public sealed class CultureDictionaryFactoryResolver : SingleObjectResolverBase<CultureDictionaryFactoryResolver, ICultureDictionaryFactory>
internal sealed class CultureDictionaryFactoryResolver : SingleObjectResolverBase<CultureDictionaryFactoryResolver, ICultureDictionaryFactory>
{
internal CultureDictionaryFactoryResolver(ICultureDictionaryFactory factory)
: base(factory)
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Dictionary
/// <summary>
/// Represents a dictionary based on a specific culture
/// </summary>
public interface ICultureDictionary
internal interface ICultureDictionary
{
/// <summary>
/// Returns the dictionary value based on the key supplied
@@ -1,6 +1,6 @@
namespace Umbraco.Core.Dictionary
{
public interface ICultureDictionaryFactory
internal interface ICultureDictionaryFactory
{
ICultureDictionary CreateDictionary();
}
@@ -41,7 +41,7 @@ namespace Umbraco.Core.Dynamics
foreach (string prop in props)
{
// use reflection (not ComponentModel) to mirror LINQ
PropertyInfo pi = type.GetProperty(prop, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
}
+1 -10
View File
@@ -11,7 +11,6 @@ namespace Umbraco.Core.Events
/// <param name="canCancel"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject, bool canCancel) : base(eventObject, canCancel)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
@@ -20,7 +19,6 @@ namespace Umbraco.Core.Events
/// <param name="eventObject"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject) : base(eventObject)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
@@ -30,7 +28,6 @@ namespace Umbraco.Core.Events
public DeleteEventArgs(TEntity eventObject)
: base(new List<TEntity> { eventObject })
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
@@ -41,7 +38,6 @@ namespace Umbraco.Core.Events
public DeleteEventArgs(TEntity eventObject, bool canCancel)
: base(new List<TEntity> { eventObject }, canCancel)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
@@ -50,12 +46,7 @@ namespace Umbraco.Core.Events
public IEnumerable<TEntity> DeletedEntities
{
get { return EventObject; }
}
/// <summary>
/// A list of media files that can be added to during a deleted operation for which Umbraco will ensure are removed
/// </summary>
public List<string> MediaFilesToDelete { get; private set; }
}
}
public class DeleteEventArgs : CancellableEventArgs
@@ -1,64 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models;
namespace Umbraco.Core.Events
{
public class RecycleBinEventArgs : CancellableEventArgs
{
public RecycleBinEventArgs(Guid nodeObjectType, Dictionary<int, IEnumerable<Property>> allPropertyData, bool emptiedSuccessfully)
: base(false)
{
AllPropertyData = allPropertyData;
NodeObjectType = nodeObjectType;
Ids = AllPropertyData.Select(x => x.Key);
RecycleBinEmptiedSuccessfully = emptiedSuccessfully;
Files = new List<string>();
}
public RecycleBinEventArgs(Guid nodeObjectType, Dictionary<int, IEnumerable<Property>> allPropertyData)
: base(true)
{
AllPropertyData = allPropertyData;
NodeObjectType = nodeObjectType;
Ids = AllPropertyData.Select(x => x.Key);
Files = new List<string>();
}
/// <summary>
/// Backwards compatibility constructor
/// </summary>
/// <param name="nodeObjectType"></param>
/// <param name="allPropertyData"></param>
/// <param name="files"></param>
/// <param name="emptiedSuccessfully"></param>
internal RecycleBinEventArgs(Guid nodeObjectType, Dictionary<int, IEnumerable<Property>> allPropertyData, List<string> files, bool emptiedSuccessfully)
: base(false)
{
AllPropertyData = allPropertyData;
NodeObjectType = nodeObjectType;
Ids = AllPropertyData.Select(x => x.Key);
RecycleBinEmptiedSuccessfully = emptiedSuccessfully;
Files = files;
}
/// <summary>
/// Backwards compatibility constructor
/// </summary>
/// <param name="nodeObjectType"></param>
/// <param name="allPropertyData"></param>
/// <param name="files"></param>
internal RecycleBinEventArgs(Guid nodeObjectType, Dictionary<int, IEnumerable<Property>> allPropertyData, List<string> files)
: base(true)
{
AllPropertyData = allPropertyData;
NodeObjectType = nodeObjectType;
Ids = AllPropertyData.Select(x => x.Key);
Files = files;
}
[Obsolete("Use the other ctor that specifies all property data instead")]
public RecycleBinEventArgs(Guid nodeObjectType, IEnumerable<int> ids, List<string> files, bool emptiedSuccessfully)
: base(false)
{
@@ -68,7 +14,6 @@ namespace Umbraco.Core.Events
RecycleBinEmptiedSuccessfully = emptiedSuccessfully;
}
[Obsolete("Use the other ctor that specifies all property data instead")]
public RecycleBinEventArgs(Guid nodeObjectType, IEnumerable<int> ids, List<string> files)
: base(true)
{
@@ -92,16 +37,8 @@ namespace Umbraco.Core.Events
/// Gets the list of Files that should be deleted as part
/// of emptying the Recycle Bin.
/// </summary>
/// <remarks>
/// This list can be appended to during an event handling operation, generally this is done based on the property data contained in these event args
/// </remarks>
public List<string> Files { get; private set; }
/// <summary>
/// Gets the list of all property data associated with a content id
/// </summary>
public Dictionary<int, IEnumerable<Property>> AllPropertyData { get; private set; }
/// <summary>
/// Boolean indicating whether the Recycle Bin was emptied successfully
/// </summary>
@@ -1,25 +0,0 @@
using System;
namespace Umbraco.Core.Exceptions
{
public class InvalidCompositionException : Exception
{
public string ContentTypeAlias { get; set; }
public string AddedCompositionAlias { get; set; }
public string PropertyTypeAlias { get; set; }
public override string Message
{
get
{
return string.Format(
"InvalidCompositionException - ContentType with alias '{0}' was added as a Compsition to ContentType with alias '{1}', " +
"but there was a conflict on the PropertyType alias '{2}'. " +
"PropertyTypes must have a unique alias across all Compositions in order to compose a valid ContentType Composition.",
AddedCompositionAlias, ContentTypeAlias, PropertyTypeAlias);
}
}
}
}
+2 -2
View File
@@ -5,7 +5,6 @@ using System.IO;
namespace Umbraco.Core.IO
{
//TODO: There is no way to create a directory here without creating a file in a directory and then deleting it
//TODO: Should probably implement a rename?
public interface IFileSystem
{
@@ -16,7 +15,8 @@ namespace Umbraco.Core.IO
void DeleteDirectory(string path, bool recursive);
bool DirectoryExists(string path);
void AddFile(string path, Stream stream);
void AddFile(string path, Stream stream, bool overrideIfExists);
+7 -17
View File
@@ -90,17 +90,15 @@ namespace Umbraco.Core.IO
public void AddFile(string path, Stream stream, bool overrideIfExists)
{
var fsRelativePath = GetRelativePath(path);
var exists = FileExists(fsRelativePath);
var exists = FileExists(path);
if (exists && overrideIfExists == false) throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path));
EnsureDirectory(Path.GetDirectoryName(fsRelativePath));
EnsureDirectory(Path.GetDirectoryName(path));
if (stream.CanSeek)
stream.Seek(0, 0);
using (var destination = (Stream)File.Create(GetFullPath(fsRelativePath)))
using (var destination = (Stream)File.Create(GetFullPath(path)))
stream.CopyTo(destination);
}
@@ -111,14 +109,12 @@ namespace Umbraco.Core.IO
public IEnumerable<string> GetFiles(string path, string filter)
{
var fsRelativePath = GetRelativePath(path);
var fullPath = EnsureTrailingSeparator(GetFullPath(fsRelativePath));
path = EnsureTrailingSeparator(GetFullPath(path));
try
{
if (Directory.Exists(fullPath))
return Directory.EnumerateFiles(fullPath, filter).Select(GetRelativePath);
if (Directory.Exists(path))
return Directory.EnumerateFiles(path, filter).Select(GetRelativePath);
}
catch (UnauthorizedAccessException ex)
{
@@ -171,12 +167,6 @@ namespace Umbraco.Core.IO
public string GetFullPath(string path)
{
//if the path starts with a '/' then it's most likely not a FS relative path which is required so convert it
if (path.StartsWith("/"))
{
path = GetRelativePath(path);
}
return !path.StartsWith(RootPath)
? Path.Combine(RootPath, path)
: path;
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Umbraco.Core
/// <summary>
/// Helper class for mandating values, for example on method parameters.
/// </summary>
public static class Mandate
internal static class Mandate
{
/// <summary>
/// Mandates that the specified parameter is not null.
+2 -5
View File
@@ -45,11 +45,8 @@ namespace Umbraco.Core.Media
var result = new List<ResizedImage>();
var allSizesDictionary = new Dictionary<int,string> {{100,"thumb"}, {500,"big-thumb"}};
//combine the static dictionary with the additional sizes with only unique values
var allSizes = allSizesDictionary.Select(kv => kv.Key)
.Union(additionalThumbSizes.Where(x => x > 0).Distinct());
var allSizes = allSizesDictionary.Select(kv => kv.Key).ToList();
allSizes.AddRange(additionalThumbSizes.Where(x => x > 0).Distinct());
var sizesDictionary = allSizes.ToDictionary(s => s, s => allSizesDictionary.ContainsKey(s) ? allSizesDictionary[s]: "");
foreach (var s in sizesDictionary)
+2 -13
View File
@@ -1,6 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
@@ -365,7 +363,7 @@ namespace Umbraco.Core.Models
/// Returns true if only the entity properties are direty
/// </summary>
/// <returns></returns>
public bool IsEntityDirty()
internal bool IsEntityDirty()
{
return base.IsDirty();
}
@@ -374,20 +372,11 @@ namespace Umbraco.Core.Models
/// Returns true if any of the properties are dirty
/// </summary>
/// <returns></returns>
public bool IsAnyUserPropertyDirty()
internal bool IsAnyUserPropertyDirty()
{
return Properties.Any(x => x.IsDirty());
}
/// <summary>
/// Returns a list of all dirty user defined properties
/// </summary>
/// <returns></returns>
public IEnumerable<string> GetDirtyUserProperties()
{
return Properties.Where(x => x.IsDirty()).Select(x => x.Alias);
}
/// <summary>
/// Resets dirty properties by clearing the dictionary used to track changes.
/// </summary>
+3 -12
View File
@@ -51,7 +51,7 @@ namespace Umbraco.Core.Models
_parentId = new Lazy<int>(() => parentId);
_name = name;
_contentTypeId = contentType.Id;
_contentTypeId = int.Parse(contentType.Id.ToString(CultureInfo.InvariantCulture));
_properties = properties;
_properties.EnsurePropertyTypes(PropertyTypes);
_additionalData = new Dictionary<string, object>();
@@ -75,7 +75,7 @@ namespace Umbraco.Core.Models
_parentId = new Lazy<int>(() => parent.Id);
_name = name;
_contentTypeId = contentType.Id;
_contentTypeId = int.Parse(contentType.Id.ToString(CultureInfo.InvariantCulture));
_properties = properties;
_properties.EnsurePropertyTypes(PropertyTypes);
_additionalData = new Dictionary<string, object>();
@@ -234,16 +234,7 @@ namespace Umbraco.Core.Models
[DataMember]
public virtual int ContentTypeId
{
get
{
//There will be cases where this has not been updated to reflect the true content type ID.
//This will occur when inserting new content.
if (_contentTypeId == 0 && ContentTypeBase != null && ContentTypeBase.HasIdentity)
{
_contentTypeId = ContentTypeBase.Id;
}
return _contentTypeId;
}
get { return _contentTypeId; }
protected set
{
SetPropertyValueAndDetectChanges(o =>
+10 -149
View File
@@ -42,61 +42,6 @@ namespace Umbraco.Core.Models
return dirty.WasPropertyDirty("Published") && entity.Published;
}
/// <summary>
/// Determines if the item should be persisted at all
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
/// <remarks>
/// In one particular case, a content item shouldn't be persisted:
/// * The item exists and is published
/// * A call to ContentService.Save is made
/// * The item has not been modified whatsoever apart from changing it's published status from published to saved
///
/// In this case, there is no reason to make any database changes at all
/// </remarks>
internal static bool RequiresSaving(this IContent entity)
{
var publishedState = ((Content)entity).PublishedState;
return RequiresSaving(entity, publishedState);
}
/// <summary>
/// Determines if the item should be persisted at all
/// </summary>
/// <param name="entity"></param>
/// <param name="publishedState"></param>
/// <returns></returns>
/// <remarks>
/// In one particular case, a content item shouldn't be persisted:
/// * The item exists and is published
/// * A call to ContentService.Save is made
/// * The item has not been modified whatsoever apart from changing it's published status from published to saved
///
/// In this case, there is no reason to make any database changes at all
/// </remarks>
internal static bool RequiresSaving(this IContent entity, PublishedState publishedState)
{
var dirtyEntity = (ICanBeDirty)entity;
var publishedChanged = dirtyEntity.IsPropertyDirty("Published") && publishedState != PublishedState.Unpublished;
//check if any user prop has changed
var propertyValueChanged = ((Content)entity).IsAnyUserPropertyDirty();
//We need to know if any other property apart from Published was changed here
//don't create a new version if the published state has changed to 'Save' but no data has actually been changed
if (publishedChanged && entity.Published == false && propertyValueChanged == false)
{
//at this point we need to check if any non property value has changed that wasn't the published state
var changedProps = ((TracksChangesEntityBase)entity).GetDirtyProperties();
if (changedProps.Any(x => x != "Published") == false)
{
return false;
}
}
return true;
}
/// <summary>
/// Determines if a new version should be created
/// </summary>
@@ -131,12 +76,9 @@ namespace Umbraco.Core.Models
var dirtyEntity = (ICanBeDirty)entity;
//check if the published state has changed or the language
var publishedChanged = dirtyEntity.IsPropertyDirty("Published") && publishedState != PublishedState.Unpublished;
var langChanged = dirtyEntity.IsPropertyDirty("Language");
var contentChanged = publishedChanged || langChanged;
//check if any user prop has changed
var propertyValueChanged = ((Content)entity).IsAnyUserPropertyDirty();
var contentChanged =
(dirtyEntity.IsPropertyDirty("Published") && publishedState != PublishedState.Unpublished)
|| dirtyEntity.IsPropertyDirty("Language");
//return true if published or language has changed
if (contentChanged)
@@ -144,6 +86,8 @@ namespace Umbraco.Core.Models
return true;
}
//check if any user prop has changed
var propertyValueChanged = ((Content)entity).IsAnyUserPropertyDirty();
//check if any content prop has changed
var contentDataChanged = ((Content)entity).IsEntityDirty();
@@ -190,7 +134,7 @@ namespace Umbraco.Core.Models
//If Published state has changed then previous versions should have their publish state reset.
//If state has been changed to unpublished the previous versions publish state should also be reset.
if (entity.IsPropertyDirty("Published") && (entity.Published || publishedState == PublishedState.Unpublished))
if (((ICanBeDirty)entity).IsPropertyDirty("Published") && (entity.Published || publishedState == PublishedState.Unpublished))
{
return true;
}
@@ -582,58 +526,29 @@ namespace Umbraco.Core.Models
#endregion
#region User/Profile methods
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this media item.
/// </summary>
[Obsolete("Use the overload that declares the IUserService to use")]
public static IProfile GetCreatorProfile(this IMedia media)
{
return ApplicationContext.Current.Services.UserService.GetProfileById(media.CreatorId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this media item.
/// </summary>
public static IProfile GetCreatorProfile(this IMedia media, IUserService userService)
{
return userService.GetProfileById(media.CreatorId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this content item.
/// </summary>
[Obsolete("Use the overload that declares the IUserService to use")]
public static IProfile GetCreatorProfile(this IContentBase content)
{
return ApplicationContext.Current.Services.UserService.GetProfileById(content.CreatorId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this content item.
/// </summary>
public static IProfile GetCreatorProfile(this IContentBase content, IUserService userService)
{
return userService.GetProfileById(content.CreatorId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Writer of this content.
/// </summary>
[Obsolete("Use the overload that declares the IUserService to use")]
public static IProfile GetWriterProfile(this IContent content)
{
return ApplicationContext.Current.Services.UserService.GetProfileById(content.WriterId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Writer of this content.
/// </summary>
public static IProfile GetWriterProfile(this IContent content, IUserService userService)
{
return userService.GetProfileById(content.WriterId);
}
#endregion
/// <summary>
@@ -779,16 +694,14 @@ namespace Umbraco.Core.Models
#endregion
#region XML methods
/// <summary>
/// Creates the full xml representation for the <see cref="IContent"/> object and all of it's descendants
/// </summary>
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
internal static XElement ToDeepXml(this IContent content, IPackagingService packagingService)
internal static XElement ToDeepXml(this IContent content)
{
return packagingService.Export(content, true, raiseEvents: false);
return ApplicationContext.Current.Services.PackagingService.Export(content, true, raiseEvents: false);
}
/// <summary>
@@ -796,54 +709,29 @@ namespace Umbraco.Core.Models
/// </summary>
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
[Obsolete("Use the overload that declares the IPackagingService to use")]
public static XElement ToXml(this IContent content)
{
return ApplicationContext.Current.Services.PackagingService.Export(content, raiseEvents: false);
}
/// <summary>
/// Creates the xml representation for the <see cref="IContent"/> object
/// </summary>
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IContent content, IPackagingService packagingService)
{
return packagingService.Export(content, raiseEvents: false);
}
/// <summary>
/// Creates the xml representation for the <see cref="IMedia"/> object
/// </summary>
/// <param name="media"><see cref="IContent"/> to generate xml for</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
[Obsolete("Use the overload that declares the IPackagingService to use")]
public static XElement ToXml(this IMedia media)
{
return ApplicationContext.Current.Services.PackagingService.Export(media, raiseEvents: false);
}
/// <summary>
/// Creates the xml representation for the <see cref="IMedia"/> object
/// </summary>
/// <param name="media"><see cref="IContent"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IMedia media, IPackagingService packagingService)
{
return packagingService.Export(media, raiseEvents: false);
}
/// <summary>
/// Creates the full xml representation for the <see cref="IMedia"/> object and all of it's descendants
/// </summary>
/// <param name="media"><see cref="IMedia"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <returns>Xml representation of the passed in <see cref="IMedia"/></returns>
internal static XElement ToDeepXml(this IMedia media, IPackagingService packagingService)
internal static XElement ToDeepXml(this IMedia media)
{
return packagingService.Export(media, true, raiseEvents: false);
return ApplicationContext.Current.Services.PackagingService.Export(media, true, raiseEvents: false);
}
/// <summary>
@@ -852,7 +740,6 @@ namespace Umbraco.Core.Models
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <param name="isPreview">Boolean indicating whether the xml should be generated for preview</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
[Obsolete("Use the overload that declares the IPackagingService to use")]
public static XElement ToXml(this IContent content, bool isPreview)
{
//TODO Do a proper implementation of this
@@ -860,41 +747,15 @@ namespace Umbraco.Core.Models
return content.ToXml();
}
/// <summary>
/// Creates the xml representation for the <see cref="IContent"/> object
/// </summary>
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <param name="isPreview">Boolean indicating whether the xml should be generated for preview</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IContent content, IPackagingService packagingService, bool isPreview)
{
//TODO Do a proper implementation of this
//If current IContent is published we should get latest unpublished version
return content.ToXml(packagingService);
}
/// <summary>
/// Creates the xml representation for the <see cref="IMember"/> object
/// </summary>
/// <param name="member"><see cref="IMember"/> to generate xml for</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
[Obsolete("Use the overload that declares the IPackagingService to use")]
public static XElement ToXml(this IMember member)
{
return ((PackagingService)(ApplicationContext.Current.Services.PackagingService)).Export(member);
}
/// <summary>
/// Creates the xml representation for the <see cref="IMember"/> object
/// </summary>
/// <param name="member"><see cref="IMember"/> to generate xml for</param>
/// <param name="packagingService"></param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IMember member, IPackagingService packagingService)
{
return ((PackagingService)(packagingService)).Export(member);
}
#endregion
}
}
+3 -14
View File
@@ -19,7 +19,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Constuctor for creating a ContentType with the parent's id.
/// </summary>
/// <remarks>Only use this for creating ContentTypes at the root (with ParentId -1).</remarks>
/// <remarks>You usually only want to use this for creating ContentTypes at the root.</remarks>
/// <param name="parentId"></param>
public ContentType(int parentId) : base(parentId)
{
@@ -31,22 +31,11 @@ namespace Umbraco.Core.Models
/// </summary>
/// <remarks>Use this to ensure inheritance from parent.</remarks>
/// <param name="parent"></param>
public ContentType(IContentType parent) : this(parent, null)
public ContentType(IContentType parent) : base(parent)
{
_allowedTemplates = new List<ITemplate>();
}
/// <summary>
/// Constuctor for creating a ContentType with the parent as an inherited type.
/// </summary>
/// <remarks>Use this to ensure inheritance from parent.</remarks>
/// <param name="parent"></param>
/// <param name="alias"></param>
public ContentType(IContentType parent, string alias)
: base(parent, alias)
{
_allowedTemplates = new List<ITemplate>();
}
private static readonly PropertyInfo DefaultTemplateSelector = ExpressionHelper.GetPropertyInfo<ContentType, int>(x => x.DefaultTemplateId);
private static readonly PropertyInfo AllowedTemplatesSelector = ExpressionHelper.GetPropertyInfo<ContentType, IEnumerable<ITemplate>>(x => x.AllowedTemplates);
+6 -14
View File
@@ -48,22 +48,17 @@ namespace Umbraco.Core.Models
_additionalData = new Dictionary<string, object>();
}
protected ContentTypeBase(IContentTypeBase parent) : this(parent, null)
protected ContentTypeBase(IContentTypeBase parent)
{
}
Mandate.ParameterNotNull(parent, "parent");
protected ContentTypeBase(IContentTypeBase parent, string alias)
{
Mandate.ParameterNotNull(parent, "parent");
_alias = alias;
_parentId = new Lazy<int>(() => parent.Id);
_allowedContentTypes = new List<ContentTypeSort>();
_propertyGroups = new PropertyGroupCollection();
_parentId = new Lazy<int>(() => parent.Id);
_allowedContentTypes = new List<ContentTypeSort>();
_propertyGroups = new PropertyGroupCollection();
_propertyTypes = new PropertyTypeCollection();
_propertyTypes.CollectionChanged += PropertyTypesChanged;
_additionalData = new Dictionary<string, object>();
}
}
private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, string>(x => x.Name);
private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, int>(x => x.ParentId);
@@ -375,9 +370,6 @@ namespace Umbraco.Core.Models
/// This list aggregates PropertyTypes across the PropertyGroups.
/// </summary>
/// <remarks>
///
/// The setter is used purely to set the property types that DO NOT belong to a group!
///
/// Marked as DoNotClone because the result of this property is not the natural result of the data, it is
/// a union of data so when auto-cloning if the setter is used it will be setting the unnatural result of the
/// data. We manually clone this instead.
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Exceptions;
namespace Umbraco.Core.Models
{
@@ -22,16 +21,11 @@ namespace Umbraco.Core.Models
}
protected ContentTypeCompositionBase(IContentTypeComposition parent)
: this(parent, null)
: base(parent)
{
AddContentType(parent);
}
protected ContentTypeCompositionBase(IContentTypeComposition parent, string alias)
: base(parent, alias)
{
AddContentType(parent);
}
private static readonly PropertyInfo ContentTypeCompositionSelector =
ExpressionHelper.GetPropertyInfo<ContentTypeCompositionBase, IEnumerable<IContentTypeComposition>>(
x => x.ContentTypeComposition);
@@ -81,27 +75,8 @@ namespace Umbraco.Core.Models
if (contentType.ContentTypeComposition.Any(x => x.CompositionAliases().Any(ContentTypeCompositionExists)))
return false;
if (string.IsNullOrEmpty(Alias) == false && Alias.Equals(contentType.Alias))
return false;
if (ContentTypeCompositionExists(contentType.Alias) == false)
{
//Before we actually go ahead and add the ContentType as a Composition we ensure that we don't
//end up with duplicate PropertyType aliases - in which case we throw an exception.
var conflictingPropertyTypeAliases = CompositionPropertyTypes.SelectMany(
x => contentType.CompositionPropertyTypes
.Where(y => y.Alias.Equals(x.Alias, StringComparison.InvariantCultureIgnoreCase))
.Select(p => p.Alias)).ToList();
if (conflictingPropertyTypeAliases.Any())
throw new InvalidCompositionException
{
AddedCompositionAlias = contentType.Alias,
ContentTypeAlias = Alias,
PropertyTypeAlias =
string.Join(", ", conflictingPropertyTypeAliases)
};
_contentTypeComposition.Add(contentType);
OnPropertyChanged(ContentTypeCompositionSelector);
return true;
@@ -118,17 +93,8 @@ namespace Umbraco.Core.Models
{
if (ContentTypeCompositionExists(alias))
{
var contentTypeComposition = ContentTypeComposition.FirstOrDefault(x => x.Alias == alias);
if (contentTypeComposition == null)//You can't remove a composition from another composition
return false;
var contentTypeComposition = ContentTypeComposition.First(x => x.Alias == alias);
RemovedContentTypeKeyTracker.Add(contentTypeComposition.Id);
//If the ContentType we are removing has Compositions of its own these needs to be removed as well
var compositionIdsToRemove = contentTypeComposition.CompositionIds().ToList();
if(compositionIdsToRemove.Any())
RemovedContentTypeKeyTracker.AddRange(compositionIdsToRemove);
OnPropertyChanged(ContentTypeCompositionSelector);
return _contentTypeComposition.Remove(contentTypeComposition);
}
@@ -2,7 +2,7 @@
namespace Umbraco.Core.Models.EntityBase
{
public interface IUmbracoEntity : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IUmbracoEntity : IAggregateRoot
{
/// <summary>
/// Profile of the user who created this Entity
@@ -14,12 +14,6 @@ namespace Umbraco.Core.Models.EntityBase
[DataContract(IsReference = true)]
public abstract class TracksChangesEntityBase : IRememberBeingDirty
{
//TODO: This needs to go on to ICanBeDirty http://issues.umbraco.org/issue/U4-5662
public virtual IEnumerable<string> GetDirtyProperties()
{
return _propertyChangedInfo.Where(x => x.Value).Select(x => x.Key);
}
/// <summary>
/// Tracks the properties that have changed
/// </summary>
@@ -145,12 +139,11 @@ namespace Umbraco.Core.Models.EntityBase
/// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set
/// to the same value, so it's really not dirty.
/// </remarks>
internal virtual bool SetPropertyValueAndDetectChanges<T>(Func<T, T> setValue, T value, PropertyInfo propertySelector)
internal bool SetPropertyValueAndDetectChanges<T>(Func<T, T> setValue, T value, PropertyInfo propertySelector)
{
var initVal = value;
var newVal = setValue(value);
if (Equals(initVal, newVal) == false)
if (!Equals(initVal, newVal))
{
OnPropertyChanged(propertySelector);
return true;
+1 -1
View File
@@ -6,7 +6,7 @@ using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
public interface IDictionaryItem : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IDictionaryItem : IAggregateRoot
{
/// <summary>
/// Gets or Sets the Parent Id of the Dictionary Item
+1 -1
View File
@@ -5,7 +5,7 @@ using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
public interface ILanguage : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface ILanguage : IAggregateRoot
{
/// <summary>
/// Gets or sets the Iso Code for the Language
+1 -1
View File
@@ -7,7 +7,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Defines a Macro
/// </summary>
public interface IMacro : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IMacro : IAggregateRoot
{
/// <summary>
/// Gets or sets the alias of the Macro
+1 -1
View File
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Represents a member type
/// </summary>
public interface IMemberGroup : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IMemberGroup : IAggregateRoot
{
/// <summary>
/// The name of the member group
+1 -1
View File
@@ -3,7 +3,7 @@ using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
{
public interface IRelation : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IRelation : IAggregateRoot
{
/// <summary>
/// Gets or sets the Parent Id of the Relation (Source)
+1 -1
View File
@@ -4,7 +4,7 @@ using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
{
public interface IRelationType : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface IRelationType : IAggregateRoot
{
/// <summary>
/// Gets or sets the Name of the RelationType
+1 -1
View File
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Represents a Tag, which is composed of a Text, Group and NodeCount property.
/// </summary>
public interface ITag : IAggregateRoot, IRememberBeingDirty, ICanBeDirty
public interface ITag : IAggregateRoot
{
[DataMember]
string Text { get; set; }
+2 -4
View File
@@ -1,11 +1,9 @@
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
namespace Umbraco.Core.Models
{
/// <summary>
/// Defines a Template File (Masterpage or Mvc View)
/// </summary>
public interface ITemplate : IFile, IRememberBeingDirty, ICanBeDirty
public interface ITemplate : IFile
{
/// <summary>
/// Returns the <see cref="RenderingEngine"/> that corresponds to the template file
+2 -13
View File
@@ -13,7 +13,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Constuctor for creating a MediaType with the parent's id.
/// </summary>
/// <remarks>Only use this for creating MediaTypes at the root (with ParentId -1).</remarks>
/// <remarks>You usually only want to use this for creating MediaTypes at the root.</remarks>
/// <param name="parentId"></param>
public MediaType(int parentId) : base(parentId)
{
@@ -24,21 +24,10 @@ namespace Umbraco.Core.Models
/// </summary>
/// <remarks>Use this to ensure inheritance from parent.</remarks>
/// <param name="parent"></param>
public MediaType(IMediaType parent) : this(parent, null)
public MediaType(IMediaType parent) : base(parent)
{
}
/// <summary>
/// Constuctor for creating a MediaType with the parent as an inherited type.
/// </summary>
/// <remarks>Use this to ensure inheritance from parent.</remarks>
/// <param name="parent"></param>
/// <param name="alias"></param>
public MediaType(IMediaType parent, string alias)
: base(parent, alias)
{
}
/// <summary>
/// Method to call when Entity is being saved
/// </summary>
+1 -4
View File
@@ -543,10 +543,7 @@ namespace Umbraco.Core.Models
base.AddingEntity();
if (Key == Guid.Empty)
{
Key = Guid.NewGuid();
ProviderUserKey = Key;
}
}
/// <summary>
@@ -571,7 +568,7 @@ namespace Umbraco.Core.Models
[IgnoreDataMember]
internal string ShortStringPropertyValue { get; set; }
[IgnoreDataMember]
internal int IntegerPropertyValue { get; set; }
internal int IntegerropertyValue { get; set; }
[IgnoreDataMember]
internal bool BoolPropertyValue { get; set; }
[IgnoreDataMember]
+2 -10
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
@@ -20,12 +21,7 @@ namespace Umbraco.Core.Models
MemberTypePropertyTypes = new Dictionary<string, MemberTypePropertyProfileAccess>();
}
public MemberType(IContentTypeComposition parent) : this(parent, null)
{
}
public MemberType(IContentTypeComposition parent, string alias)
: base(parent, alias)
public MemberType(IContentTypeComposition parent) : base(parent)
{
MemberTypePropertyTypes = new Dictionary<string, MemberTypePropertyProfileAccess>();
}
@@ -46,10 +42,6 @@ namespace Umbraco.Core.Models
// leading underscores which we don't want in this case.
// see : http://issues.umbraco.org/issue/U4-3968
//TODO: BUT, I'm pretty sure we could do this with regards to underscores now:
// .ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase)
// Need to ask Stephen
SetPropertyValueAndDetectChanges(o =>
{
_alias = value == "_umbracoSystemDefaultProtectType"

Some files were not shown because too many files have changed in this diff Show More