Compare commits

...

62 Commits

Author SHA1 Message Date
Per Ploug fcaa4ad8d6 JsDocs comments on listviewhelper (U4-7185) 2016-04-14 11:36:24 +02:00
Sebastiaan Janssen bf70e208ad U4-8325 XSLT macro rendering logs too much in Info mode (after upgrade 7.1.4 => 7.4.0) 2016-04-14 09:34:53 +02:00
Shannon Deminick 26f705b129 Merge pull request #1224 from 0xc0dec/dev-v7
Fixed logger context class
2016-04-13 20:18:21 +02:00
Aleksey Fedotov 9e3941e8e1 Fixed logger context class 2016-04-13 22:14:21 +05:00
Stephan 7886b7814d U4-8312 - models generation false error (#1222) 2016-04-13 15:57:27 +02:00
Claus cf7756a96d Merge pull request #1217 from umbraco/temp-U4-8298
Fixes: U4-8298 CacheRefresher authorization logic reversed - traditio…
2016-04-12 13:19:59 +02:00
Claus 20347c1ccd Fixing typo. 2016-04-12 13:17:41 +02:00
Shannon 36255709e6 U4-8297 Custom MembershipProvider search doesn't work in the listview 2016-04-07 18:16:03 +02:00
Shannon 506ed9f866 U4-8286 Add OWIN startup events to the UmbracoDefaultOwinStartup class 2016-04-07 17:51:09 +02:00
Shannon f87bec398d U4-8239 DisableBrowserCacheAttribute causing YSOD when a previous exceptions is thrown before the filter kicks in 2016-04-07 16:44:45 +02:00
Shannon 1e5b6a6a0f Fixes: U4-8298 CacheRefresher authorization logic reversed - traditional load balancing will not work 2016-04-07 15:42:51 +02:00
Warren Buckley a2f8e92098 Merge pull request #1087 from bjarnef/dev-v7-U4-6425
U4-6425 - Maximum property for Related Links
2016-04-07 08:47:01 +01:00
bjarnef 9d5af4ad5e Merge branch 'dev-v7' of git://github.com/umbraco/Umbraco-CMS into dev-v7-U4-6425
Conflicts:
	src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.controller.js
	src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.html
2016-04-06 20:20:22 +02:00
bjarnef ae154885e4 Ensure icon has a value. 2016-04-06 19:52:21 +02:00
bjarnef 2c29e422bc Add icons for internal links. 2016-04-06 19:47:05 +02:00
bjarnef 2d6b8712d5 Limit this to listview, so it doesn't affect other property editors. 2016-04-06 19:44:09 +02:00
Warren Buckley 81aad6fc64 Merge pull request #1205 from bjarnef/dev-v7-U4-8248
U4-8248 - Add tooltip for listview layout + cursor style for listview table row
2016-04-06 15:45:31 +01:00
Claus 58280e7d63 Merge pull request #1209 from greystate/fix-U4-8260
Fix for U4-8260
2016-04-06 11:12:43 +02:00
Sebastiaan Janssen c856795cb7 Fix hilariously wrong copy/pasted TODO comments.. 2016-04-05 08:03:47 +02:00
madden-tom 2d514ac09e Added check for publish permissions to remove option for Publish At a…
U4-287 "Publish at" circumvents "Send for approval/publishing"
2016-04-05 08:01:05 +02:00
Sebastiaan Janssen 8e8b8bdea1 Revert "Removes old obsoleted ping.aspx"
This reverts commit 453efc02a5.

Conflicts:
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj

U4-8274 '/umbraco/ping.aspx' is missing
2016-04-04 09:20:59 +02:00
Sebastiaan Janssen d8c781f97f Make the file exclusion filter more readable 2016-04-03 13:39:05 +02:00
Sebastiaan Janssen 6502470708 U4-8265 Listview list and listview grid does not handle acceptedFileTypes in same way 2016-04-03 12:08:25 +02:00
Sebastiaan Janssen 680396daab Localize server-side error message for disallowed file uploads 2016-04-03 12:08:23 +02:00
Asbjørn Riis-Knudsen 4e4ea59433 * Only restrict to image files when onlyImages is active* Handle disallowed filetypes as per other upload controls
* Only restrict to image files when onlyImages is active
* Handle disallowed filetypes as per other upload controls
2016-04-02 19:07:35 +02:00
bjarnef 40f7e87e04 Fix issues when using custom font icons in backoffice. 2016-04-02 13:36:55 +02:00
Warren Buckley fbce20d0c3 Merge pull request #1158 from umbraco/temp-U4-8016
Fixes: U4-8016 Pick only images from media
2016-04-01 13:54:37 +01:00
Shannon Deminick 982fa26b7e Merge pull request #1210 from umbraco/temp-U4-8103
U4-8103
2016-03-31 18:26:09 +02:00
Stephan c3055ca43f U4-8103 - fix DisableBrowserCacheAttribute to handle exceptions 2016-03-31 16:37:16 +02:00
Stephan 4cca364511 U4-8103 - refactor YSOD overlay to display inner exceptions 2016-03-31 16:36:36 +02:00
Stephan 9e0ed94d77 Fix typo in lang xml files 2016-03-31 12:56:24 +02:00
Warren Buckley 374147a1a0 Merge pull request #1208 from umbraco/temp-U4-2954
U4-2954 - refresh domain cache when emptying recycle bin
2016-03-31 10:28:31 +01:00
Chriztian Steinmeier 5f0fe69c82 Update links to https 2016-03-30 21:11:29 +02:00
Chriztian Steinmeier e325e06efc Update link to Our on Backoffice sections 2016-03-30 21:10:41 +02:00
Chriztian Steinmeier 5e7db1047b Add the missing 't' 2016-03-30 21:09:14 +02:00
Stephan 61fe0a4a93 U4-2954 - refresh domain cache when emptying recycle bin 2016-03-30 17:56:34 +02:00
Warren Buckley aa1aabef3a Merge pull request #1204 from umbraco/temp-U4-7862
U4-7862 Brackets cause issues in the stylesheet editor
2016-03-30 16:11:15 +01:00
bjarnef d1c865480f Add tooltip for listview layout + cursor style for listview table row. 2016-03-29 23:22:42 +02:00
Claus c427c51053 U4-7862 Brackets cause issues in the stylesheet editor 2016-03-29 14:29:27 +02:00
paulsterling 08070e319a Update number of sites running 2016-03-28 16:46:31 -07:00
Warren Buckley ac2ebc4071 Merge pull request #1193 from umbraco/temp-U4-8220
U4-8220 ModelState and ViewData is not carried through when using the…
2016-03-23 12:10:05 +00:00
Shannon d4c79a0915 Fixes tests, adds more asserts 2016-03-23 11:02:27 +01:00
Shannon 61f9845db0 bumps version 2016-03-23 10:06:53 +01:00
Shannon 43e23829ae updates EnsurePartialViewMacroViewContextFilterAttribute to check for child actions 2016-03-23 10:06:13 +01:00
Stephan 5774ce68c7 GitIgnore Umbraco.Tests/media 2016-03-22 14:37:22 +01:00
Shannon b9af6f631a U4-8220 ModelState and ViewData is not carried through when using the obsolete Content.GetGridHtml method 2016-03-22 11:23:09 +01:00
Shannon cd401f5e37 U4-8216 Hijacked controller actions fail with custom RenderModel subclass due to ModelBinding error 2016-03-21 16:12:34 +01:00
Sebastiaan Janssen effe7c1669 Fixes unit test 2016-03-10 11:20:44 +01:00
Mads Rasmussen 87667ec2d1 Fixes: U4-8016 Pick only images from media 2016-03-08 20:56:24 +01:00
bjarnef 4bcee1df71 Change property to maximum 2016-02-03 02:42:47 +01:00
bjarnef 8e2716d300 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-02-03 02:29:30 +01:00
bjarnef b8c7b09d25 Update styles + adjust sort of table row 2016-02-03 02:29:21 +01:00
bjarnef 741057b7d6 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-02-02 15:21:34 +01:00
bjarnef 769b74afef Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-02-02 15:15:49 +01:00
bjarnef 6d4364a8b9 Modify sortable table row 2016-02-02 03:47:10 +01:00
bjarnef efb7bc7689 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-02-01 22:02:42 +01:00
bjarnef 6536286ffa Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-02-01 13:34:22 +01:00
bjarnef 6f07898979 Max config adjustments 2016-02-01 02:13:05 +01:00
bjarnef 7cf4c33d15 Fix max number in config and other adjustments 2016-02-01 01:52:51 +01:00
bjarnef d75ebed53d Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-01-31 14:57:08 +01:00
bjarnef 3136981043 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7-U4-6425 2016-01-28 20:05:33 +01:00
bjarnef 893ca14859 Config for max items 2016-01-28 01:01:06 +01:00
57 changed files with 905 additions and 333 deletions
+135 -134
View File
@@ -1,134 +1,135 @@
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
.DS_Store
._.DS_Store
[Bb]in
[Db]ebug*/
obj/
[Rr]elease*/
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.suo
[sS]ource
[sS]andbox
umbraco.config
*.vs10x
App_Data/TEMP/*
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
[Uu]mbraco/[Pp]resentation/[Ss]cripts/*
[Uu]mbraco/[Pp]resentation/[Ff]onts/*
[Uu]mbraco/[Pp]resentation/[Cc]ss/*
src/Umbraco.Web.UI/[Cc]ss/*
src/Umbraco.Web.UI/App_Code/*
src/Umbraco.Web.UI/App_Data/*
src/Umbraco.Tests/App_Data/*
src/Umbraco.Web.UI/[Mm]edia/*
src/Umbraco.Web.UI/[Mm]aster[Pp]ages/*
src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/*
!src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/[Ww]eb.[Cc]onfig
src/Umbraco.Web.UI/[Xx]slt/*
src/Umbraco.Web.UI/[Ii]mages/*
src/Umbraco.Web.UI/[Ss]cripts/*
src/Umbraco.Web.UI/Web.*.config.transformed
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
_BuildOutput/*
*.ncrunchsolution
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
src/Umbraco.Web.UI/web.config
*.orig
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config
src/Umbraco.Web.UI/[Vv]iews/*
src/packages/
src/packages/repositories.config
src/Umbraco.Web.UI/[Ww]eb.config
*.transformed
webpihash.txt
node_modules
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.dev.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.dev.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
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI.Client/[Bb]uild/*
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
build/_BuildOutput/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
tools/NDepend/
src/Umbraco.Web.UI/App_Plugins/*
src/*.psess
src/*.vspx
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js.*
NDependOut/*
*.ndproj
QueryResult.htm
*.ndproj
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
src/Umbraco.Web.UI/umbraco/plugins/*
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/.vs/
src/Umbraco.Web.UI/umbraco/js/install.loader.js
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
.DS_Store
._.DS_Store
[Bb]in
[Db]ebug*/
obj/
[Rr]elease*/
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.suo
[sS]ource
[sS]andbox
umbraco.config
*.vs10x
App_Data/TEMP/*
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
[Uu]mbraco/[Pp]resentation/[Ss]cripts/*
[Uu]mbraco/[Pp]resentation/[Ff]onts/*
[Uu]mbraco/[Pp]resentation/[Cc]ss/*
src/Umbraco.Web.UI/[Cc]ss/*
src/Umbraco.Web.UI/App_Code/*
src/Umbraco.Web.UI/App_Data/*
src/Umbraco.Tests/App_Data/*
src/Umbraco.Web.UI/[Mm]edia/*
src/Umbraco.Web.UI/[Mm]aster[Pp]ages/*
src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/*
!src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/[Ww]eb.[Cc]onfig
src/Umbraco.Web.UI/[Xx]slt/*
src/Umbraco.Web.UI/[Ii]mages/*
src/Umbraco.Web.UI/[Ss]cripts/*
src/Umbraco.Web.UI/Web.*.config.transformed
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
_BuildOutput/*
*.ncrunchsolution
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
src/Umbraco.Web.UI/web.config
*.orig
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config
src/Umbraco.Web.UI/[Vv]iews/*
src/packages/
src/packages/repositories.config
src/Umbraco.Web.UI/[Ww]eb.config
*.transformed
webpihash.txt
node_modules
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.dev.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.dev.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
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI.Client/[Bb]uild/*
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
build/_BuildOutput/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
tools/NDepend/
src/Umbraco.Web.UI/App_Plugins/*
src/*.psess
src/*.vspx
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js.*
NDependOut/*
*.ndproj
QueryResult.htm
*.ndproj
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
src/Umbraco.Web.UI/umbraco/plugins/*
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/.vs/
src/Umbraco.Web.UI/umbraco/js/install.loader.js
src/Umbraco.Tests/media
+2 -2
View File
@@ -13,11 +13,11 @@ If you're interested in making changes to Belle make sure to read the [Belle Rea
## Umbraco - the simple, flexible and friendly ASP.NET CMS ##
**More than 177,000 sites trust Umbraco**
**More than 350,000 sites trust Umbraco**
For the first time on the Microsoft platform, there is a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports ASP.NET MVC or Web Forms, including User and Custom Controls, out of the box. It's a developer's dream and your users will love it too.
Used by more than 177,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)), you can be sure that the technology is proven, stable and scales.
Used by more than 350,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)), you can be sure that the technology is proven, stable and scales.
To view more examples, please visit [http://umbraco.com/why-umbraco/#caseStudies](http://umbraco.com/why-umbraco/#caseStudies)
+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.4.2
7.4.3
+2 -2
View File
@@ -11,5 +11,5 @@ using System.Resources;
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("7.4.2")]
[assembly: AssemblyInformationalVersion("7.4.2")]
[assembly: AssemblyFileVersion("7.4.3")]
[assembly: AssemblyInformationalVersion("7.4.3")]
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("7.4.2");
private static readonly Version Version = new Version("7.4.3");
/// <summary>
/// Gets the current version of Umbraco.
+24
View File
@@ -1380,6 +1380,30 @@ namespace Umbraco.Core
*/
}
public static string EscapeRegexSpecialCharacters(this string text)
{
var regexSpecialCharacters = new Dictionary<string, string>
{
{".", @"\."},
{"(", @"\("},
{")", @"\)"},
{"]", @"\]"},
{"[", @"\["},
{"{", @"\{"},
{"}", @"\}"},
{"?", @"\?"},
{"!", @"\!"},
{"$", @"\$"},
{"^", @"\^"},
{"+", @"\+"},
{"*", @"\*"},
{"|", @"\|"},
{"<", @"\<"},
{">", @"\>"}
};
return ReplaceMany(text, regexSpecialCharacters);
}
public static bool ContainsAny(this string haystack, IEnumerable<string> needles, StringComparison comparison = StringComparison.CurrentCulture)
{
if (haystack == null) throw new ArgumentNullException("haystack");
@@ -39,7 +39,7 @@ namespace Umbraco.Core.Strings.Css
public static string ReplaceRule(string input, string oldRuleName, StylesheetRule rule)
{
var contents = input;
var ruleRegex = new Regex(string.Format(RuleRegexFormat, oldRuleName), RegexOptions.IgnoreCase | RegexOptions.Singleline);
var ruleRegex = new Regex(string.Format(RuleRegexFormat, oldRuleName.EscapeRegexSpecialCharacters()), RegexOptions.IgnoreCase | RegexOptions.Singleline);
contents = ruleRegex.Replace(contents, rule != null ? rule.ToString() : "");
return contents;
}
@@ -72,6 +72,11 @@ namespace Umbraco.Core
/// <summary>
/// Override init and raise the event
/// </summary>
/// <remarks>
/// DID YOU KNOW? The Global.asax Init call is the thing that initializes all of the httpmodules, ties up a bunch of stuff with IIS, etc...
/// Therefore, since OWIN is an HttpModule when running in IIS/ASP.Net the OWIN startup is not executed until this method fires and by that
/// time, Umbraco has performed it's bootup sequence.
/// </remarks>
public override void Init()
{
base.Init();
@@ -20,18 +20,22 @@ namespace Umbraco.Tests.Web.Mvc
{
var binder = new RenderModelBinder();
var found = binder.GetBinder(typeof (IPublishedContent));
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(IRenderModel));
Assert.IsNotNull(found);
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(RenderModel));
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(DynamicPublishedContent));
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(MyContent));
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(RenderModel<MyContent>));
Assert.IsNotNull(found);
found = binder.GetBinder(typeof(MyOtherContent));
Assert.IsNull(found);
found = binder.GetBinder(typeof(MyCustomRenderModel));
Assert.IsNull(found);
found = binder.GetBinder(typeof(IRenderModel));
Assert.IsNull(found);
}
[Test]
@@ -142,6 +146,16 @@ namespace Umbraco.Tests.Web.Mvc
Assert.AreEqual(content, result);
}
public class MyCustomRenderModel : RenderModel
{
public MyCustomRenderModel(IPublishedContent content, CultureInfo culture) : base(content, culture)
{
}
public MyCustomRenderModel(IPublishedContent content) : base(content)
{
}
}
public class MyOtherContent
{
@@ -118,6 +118,13 @@ Use this directive to generate a thumbnail grid of media items.
var item = scope.items[i];
setItemData(item);
setOriginalSize(item, itemMaxHeight);
// remove non images when onlyImages is set to true
if(scope.onlyImages === "true" && !item.isFolder && !item.thumbnail){
scope.items.splice(i, 1);
i--;
}
}
if (scope.items.length > 0) {
@@ -265,7 +272,8 @@ Use this directive to generate a thumbnail grid of media items.
itemMaxWidth: "@",
itemMaxHeight: "@",
itemMinWidth: "@",
itemMinHeight: "@"
itemMinHeight: "@",
onlyImages: "@"
},
link: link
};
@@ -1,3 +1,47 @@
/**
@ngdoc service
* @name umbraco.services.listViewHelper
*
*
* @description
* Service for performing operations against items in the list view UI. Used by the built-in internal listviews
* as well as custom listview.
*
* A custom listview is always used inside a wrapper listview, so there are a number of inherited values on its
* scope by default:
*
* **$scope.selection**: Array containing all items currently selected in the listview
*
* **$scope.items**: Array containing all items currently displayed in the listview
*
* **$scope.folders**: Array containing all folders in the current listview (only for media)
*
* **$scope.options**: configuration object containing information such as pagesize, permissions, order direction etc.
*
* **$scope.model.config.layouts**: array of available layouts to apply to the listview (grid, list or custom layout)
*
* ##Usage##
* To use, inject listViewHelper into custom listview controller, listviewhelper expects you
* to pass in the full collection of items in the listview in several of its methods
* this collection is inherited from the parent controller and is available on $scope.selection
*
* <pre>
* angular.module("umbraco").controller("my.listVieweditor". function($scope, listViewHelper){
*
* //current items in the listview
* var items = $scope.items;
*
* //current selection
* var selection = $scope.selection;
*
* //deselect an item , $scope.selection is inherited, item is picked from inherited $scope.items
* listViewHelper.deselectItem(item, $scope.selection);
*
* //test if all items are selected, $scope.items + $scope.selection are inherited
* listViewhelper.isSelectedAll($scope.items, $scope.selection);
* });
* </pre>
*/
(function () {
'use strict';
@@ -6,6 +50,19 @@
var firstSelectedIndex = 0;
var localStorageKey = "umblistViewLayout";
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#getLayout
* @methodOf umbraco.services.listViewHelper
*
* @description
* Method for internal use, based on the collection of layouts passed, the method selects either
* any previous layout from local storage, or picks the first allowed layout
*
* @param {Number} nodeId The id of the current node displayed in the content editor
* @param {Array} availableLayouts Array of all allowed layouts, available from $scope.model.config.layouts
*/
function getLayout(nodeId, availableLayouts) {
var storedLayouts = [];
@@ -28,6 +85,19 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#setLayout
* @methodOf umbraco.services.listViewHelper
*
* @description
* Changes the current layout used by the listview to the layout passed in. Stores selection in localstorage
*
* @param {Number} nodeID Id of the current node displayed in the content editor
* @param {Object} selectedLayout Layout selected as the layout to set as the current layout
* @param {Array} availableLayouts Array of all allowed layouts, available from $scope.model.config.layouts
*/
function setLayout(nodeId, selectedLayout, availableLayouts) {
var activeLayout = {};
@@ -54,6 +124,18 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#saveLayoutInLocalStorage
* @methodOf umbraco.services.listViewHelper
*
* @description
* Stores a given layout as the current default selection in local storage
*
* @param {Number} nodeId Id of the current node displayed in the content editor
* @param {Object} selectedLayout Layout selected as the layout to set as the current layout
*/
function saveLayoutInLocalStorage(nodeId, selectedLayout) {
var layoutFound = false;
var storedLayouts = [];
@@ -84,6 +166,17 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#getFirstAllowedLayout
* @methodOf umbraco.services.listViewHelper
*
* @description
* Returns currently selected layout, or alternatively the first layout in the available layouts collection
*
* @param {Array} layouts Array of all allowed layouts, available from $scope.model.config.layouts
*/
function getFirstAllowedLayout(layouts) {
var firstAllowedLayout = {};
@@ -99,6 +192,23 @@
return firstAllowedLayout;
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#selectHandler
* @methodOf umbraco.services.listViewHelper
*
* @description
* Helper method for working with item selection via a checkbox, internally it uses selectItem and deselectItem.
* Working with this method, requires its triggered via a checkbox which can then pass in its triggered $event
* When the checkbox is clicked, this method will toggle selection of the associated item so it matches the state of the checkbox
*
* @param {Object} selectedItem Item being selected or deselected by the checkbox
* @param {Number} selectedIndex Index of item being selected/deselected, usually passed as $index
* @param {Array} items All items in the current listview, available as $scope.items
* @param {Array} selection All selected items in the current listview, available as $scope.selection
* @param {Event} $event Event triggered by the checkbox being checked to select / deselect an item
*/
function selectHandler(selectedItem, selectedIndex, items, selection, $event) {
var start = 0;
@@ -143,6 +253,18 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#selectItem
* @methodOf umbraco.services.listViewHelper
*
* @description
* Selects a given item to the listview selection array, requires you pass in the inherited $scope.selection collection
*
* @param {Object} item Item to select
* @param {Array} selection Listview selection, available as $scope.selection
*/
function selectItem(item, selection) {
var isSelected = false;
for (var i = 0; selection.length > i; i++) {
@@ -157,6 +279,18 @@
}
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#deselectItem
* @methodOf umbraco.services.listViewHelper
*
* @description
* Deselects a given item from the listviews selection array, requires you pass in the inherited $scope.selection collection
*
* @param {Object} item Item to deselect
* @param {Array} selection Listview selection, available as $scope.selection
*/
function deselectItem(item, selection) {
for (var i = 0; selection.length > i; i++) {
var selectedItem = selection[i];
@@ -167,6 +301,20 @@
}
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#clearSelection
* @methodOf umbraco.services.listViewHelper
*
* @description
* Removes a given number of items and folders from the listviews selection array
* Folders can only be passed in if the listview is used in the media section which has a concept of folders.
*
* @param {Array} items Items to remove, can be null
* @param {Array} folders Folders to remove, can be null
* @param {Array} selection Listview selection, available as $scope.selection
*/
function clearSelection(items, folders, selection) {
var i = 0;
@@ -180,7 +328,7 @@
}
}
if (angular.isArray(items)) {
if(angular.isArray(folders)) {
for (i = 0; folders.length > i; i++) {
var folder = folders[i];
folder.selected = false;
@@ -188,6 +336,20 @@
}
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#selectAllItems
* @methodOf umbraco.services.listViewHelper
*
* @description
* Helper method for toggling the select state on all items in the active listview
* Can only be used from a checkbox as a checkbox $event is required to pass in.
*
* @param {Array} items Items to toggle selection on, should be $scope.items
* @param {Array} selection Listview selection, available as $scope.selection
* @param {$event} $event Event passed from the checkbox being toggled
*/
function selectAllItems(items, selection, $event) {
var checkbox = $event.target;
@@ -219,6 +381,20 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#isSelectedAll
* @methodOf umbraco.services.listViewHelper
*
* @description
* Method to determine if all items on the current page in the list has been selected
* Given the current items in the view, and the current selection, it will return true/false
*
* @param {Array} items Items to test if all are selected, should be $scope.items
* @param {Array} selection Listview selection, available as $scope.selection
* @returns {Boolean} boolean indicate if all items in the listview have been selected
*/
function isSelectedAll(items, selection) {
var numberOfSelectedItem = 0;
@@ -242,10 +418,35 @@
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#setSortingDirection
* @methodOf umbraco.services.listViewHelper
*
* @description
* *Internal* method for changing sort order icon
* @param {String} col Column alias to order after
* @param {String} direction Order direction `asc` or `desc`
* @param {Object} options object passed from the parent listview available as $scope.options
*/
function setSortingDirection(col, direction, options) {
return options.orderBy.toUpperCase() === col.toUpperCase() && options.orderDirection === direction;
}
/**
* @ngdoc method
* @name umbraco.services.listViewHelper#setSorting
* @methodOf umbraco.services.listViewHelper
*
* @description
* Method for setting the field on which the listview will order its items after.
*
* @param {String} field Field alias to order after
* @param {Boolean} allow Determines if the user is allowed to set this field, normally true
* @param {Object} options Options object passed from the parent listview available as $scope.options
*/
function setSorting(field, allow, options) {
if (allow) {
options.orderBy = field;
@@ -257,12 +458,12 @@
}
}
}
//This takes in a dictionary of Ids with Permissions and determines
// the intersect of all permissions to return an object representing the
// listview button permissions
function getButtonPermissions(unmergedPermissions, currentIdsWithPermissions) {
if (currentIdsWithPermissions == null) {
currentIdsWithPermissions = {};
}
@@ -286,26 +487,28 @@
canCopy: _.contains(intersectPermissions, 'O'), //Magic Char = O
canCreate: _.contains(intersectPermissions, 'C'), //Magic Char = C
canDelete: _.contains(intersectPermissions, 'D'), //Magic Char = D
canMove: _.contains(intersectPermissions, 'M'), //Magic Char = M
canMove: _.contains(intersectPermissions, 'M'), //Magic Char = M
canPublish: _.contains(intersectPermissions, 'U'), //Magic Char = U
canUnpublish: _.contains(intersectPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish)
canUnpublish: _.contains(intersectPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish)
};
}
var service = {
getLayout: getLayout,
getFirstAllowedLayout: getFirstAllowedLayout,
setLayout: setLayout,
saveLayoutInLocalStorage: saveLayoutInLocalStorage,
selectHandler: selectHandler,
selectItem: selectItem,
deselectItem: deselectItem,
clearSelection: clearSelection,
selectAllItems: selectAllItems,
isSelectedAll: isSelectedAll,
setSortingDirection: setSortingDirection,
setSorting: setSorting,
getButtonPermissions: getButtonPermissions
getLayout: getLayout,
getFirstAllowedLayout: getFirstAllowedLayout,
setLayout: setLayout,
saveLayoutInLocalStorage: saveLayoutInLocalStorage,
selectHandler: selectHandler,
selectItem: selectItem,
deselectItem: deselectItem,
clearSelection: clearSelection,
selectAllItems: selectAllItems,
isSelectedAll: isSelectedAll,
setSortingDirection: setSortingDirection,
setSorting: setSorting,
getButtonPermissions: getButtonPermissions
};
return service;
@@ -26,7 +26,9 @@
justify-content: center;
}
.umb-content-grid__icon {
.umb-content-grid__icon,
.umb-content-grid__icon[class^="icon-"],
.umb-content-grid__icon[class*=" icon-"] {
font-size: 40px;
color: lighten(@gray, 20%);
}
@@ -37,7 +37,9 @@
align-items: center;
}
.umb-folder-grid__folder-icon {
.umb-folder-grid__folder-icon,
.umb-folder-grid__folder-icon[class^="icon-"],
.umb-folder-grid__folder-icon[class*=" icon-"] {
font-size: 20px;
margin-right: 15px;
color: @black;
@@ -51,7 +51,9 @@
border: 1px solid @blue;
}
.umb-layout-selector__dropdown-item-icon {
.umb-layout-selector__dropdown-item-icon,
.umb-layout-selector__dropdown-item-icon[class^="icon-"],
.umb-layout-selector__dropdown-item-icon[class*=" icon-"] {
font-size: 20px;
color: @gray;
text-align: center;
@@ -85,7 +85,7 @@ input.umb-table__input {
.umb-table-body .umb-table-row {
color: fade(@gray, 75%);
border-top: 1px solid @grayLight;
cursor: pointer;
font-size: 13px;
&:hover {
@@ -101,16 +101,21 @@ input.umb-table__input {
}
}
.umb-table-body__icon {
.umb-table-body__icon,
.umb-table-body__icon[class^="icon-"],
.umb-table-body__icon[class*=" icon-"] {
margin: 0 auto;
font-size: 22px;
line-height: 22px;
color: @blueDark;
}
.umb-table-body__checkicon {
.umb-table-body__checkicon,
.umb-table-body__checkicon[class^="icon-"],
.umb-table-body__checkicon[class*=" icon-"] {
display: none;
font-size: 16px;
line-height: 22px;
}
.umb-table-body .umb-table__name {
@@ -205,8 +210,6 @@ input.umb-table__input {
overflow: hidden;
white-space: nowrap; //NOTE Disable/Enable this to keep textstring on one line
text-overflow: ellipsis;
cursor: default;
}
.umb-table-cell:first-of-type {
@@ -243,7 +243,8 @@
background-color: @grayLighter
}
.table-striped tbody i:hover {
/* don't hide all icons, e.g. for a sortable handle */
.umb-listview .table-striped tbody i:not(.handle):hover {
display: none !important
}
@@ -714,7 +714,45 @@ ul.color-picker li a {
}
//
// tags
// Related links
// --------------------------------------------------
.umb-relatedlinks table > tr > td { word-wrap:break-word; word-break: break-all; border-bottom: 1px solid transparent; }
.umb-relatedlinks .handle { cursor:move; }
.umb-relatedlinks table > tbody > tr.unsortable .handle { cursor:default; }
.umb-relatedlinks table td.col-sort { width: 20px; }
.umb-relatedlinks table td.col-caption { min-width: 200px; }
.umb-relatedlinks table td.col-link { min-width: 200px; }
.umb-relatedlinks table td.col-actions { min-width: 120px; }
.umb-relatedlinks table td.col-caption .control-wrapper,
.umb-relatedlinks table td.col-link .control-wrapper { display: flex; }
.umb-relatedlinks table td.col-caption .control-wrapper input[type="text"],
.umb-relatedlinks table td.col-link .control-wrapper input[type="text"] { width: auto; flex: 1; }
/* sortable placeholder */
.umb-relatedlinks .sortable-placeholder {
background-color: @tableBackgroundAccent;
display: table-row;
}
.umb-relatedlinks .sortable-placeholder > td {
display: table-cell;
padding: 8px;
}
.umb-relatedlinks .ui-sortable-helper {
display: table-row;
background-color: @white;
opacity: 0.7;
}
.umb-relatedlinks .ui-sortable-helper > td {
display: table-cell;
border-bottom: 1px solid @tableBorder;
}
//
// Tags
// --------------------------------------------------
.umb-tags{border: @grayLighter solid 1px; padding: 10px; font-size: 13px; text-shadow: none;}
.umb-tags .tag{cursor: pointer; margin: 7px; padding: 7px; background: @blue}
+5 -2
View File
@@ -418,9 +418,9 @@ div.locked:before{
padding-left: 10px;
}
.umb-actions-child li .menu-label {
font-size: 12px;
font-size: 14px;
color: #000;
margin-left: 20px;
margin-left: 10px;
}
.umb-actions-child li .menu-label small {
@@ -436,6 +436,9 @@ div.locked:before{
}
.umb-actions-child i {
font-size: 32px;
min-width: 32px;
text-align: center;
line-height: 24px; /* set line-height to ensure all icons use same line-height */
}
.umb-actions-child li.add {
@@ -16,7 +16,12 @@ angular.module("umbraco")
$scope.startNodeId = dialogOptions.startNodeId ? dialogOptions.startNodeId : -1;
$scope.cropSize = dialogOptions.cropSize;
$scope.lastOpenedNode = $cookieStore.get("umbLastOpenedMediaNodeId");
$scope.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
if($scope.onlyImages){
$scope.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
}
else {
$scope.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
}
$scope.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
$scope.model.selectedImages = [];
@@ -80,7 +80,8 @@
item-max-width="150"
item-max-height="150"
item-min-width="100"
item-min-height="100">
item-min-height="100"
only-images={{onlyImages}}>
</umb-media-grid>
</div>
@@ -10,4 +10,16 @@ angular.module("umbraco")
$scope.model.error.data.StackTrace = $scope.model.error.data.StackTrace.trim();
}
if ($scope.model.error && $scope.model.error.data) {
$scope.model.error.data.InnerExceptions = [];
var ex = $scope.model.error.data.InnerException;
while (ex) {
if (ex.StackTrace) {
ex.StackTrace = ex.StackTrace.trim();
}
$scope.model.error.data.InnerExceptions.push(ex);
ex = ex.InnerException;
}
}
});
@@ -16,4 +16,12 @@
</h5>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{model.error.data.StackTrace}}</pre>
</div>
<div class="umb-control-group" ng-repeat="e in model.error.data.InnerExceptions">
<h5>
<localize key="defaultdialogs_innerException">Inner Exception:</localize>
</h5>
<div>{{e.ExceptionType}}: {{e.ExceptionMessage}}</div>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{e.StackTrace}}</pre>
</div>
</div>
@@ -9,7 +9,7 @@
<i ng-if="item.selected" class="icon-check umb-content-grid__checkmark"></i>
<div class="umb-content-grid__icon-container">
<i class="{{ item.icon }} umb-content-grid__icon" ng-class="{'-light': !item.published}"></i>
<i class="umb-content-grid__icon {{ item.icon }}" ng-class="{'-light': !item.published}"></i>
</div>
<div class="umb-content-grid__content">
@@ -5,10 +5,9 @@
</div>
<div ng-if="layoutDropDownIsOpen" class="umb-layout-selector__dropdown shadow-depth-3 animated -half-second fadeIn" on-outside-click="closeLayoutDropdown()">
<div ng-repeat="layout in layouts | filter:{selected:true}" class="umb-layout-selector__dropdown-item" ng-click="pickLayout(layout)" ng-class="{'-active': layout.active }">
<i class="{{ layout.icon }} umb-layout-selector__dropdown-item-icon"></i>
</div>
<div ng-repeat="layout in layouts | filter:{selected:true}" class="umb-layout-selector__dropdown-item" ng-click="pickLayout(layout)" ng-class="{'-active': layout.active }" ng-attr-title="{{layout.name}}">
<i class="{{ layout.icon }} umb-layout-selector__dropdown-item-icon"></i>
</div>
</div>
@@ -78,12 +78,12 @@
<strong>{{ file.name }}</strong>
<span class="file-error" ng-if="file.$error">
<span ng-if="file.$error === 'pattern'" class="errorMessage color-red">(<localize key="media_onlyAllowedFiles"></localize>: "{{ accept }}")</span>
<span ng-if="file.$error === 'maxSize'" class="errorMessage color-red">(<localize key="media_maxFileSize"></localize> "{{maxFileSize}}")</span>
<span ng-if="file.$error === 'pattern'" class="errorMessage color-red"><localize key="media_disallowedFileType"></localize></span>
<span ng-if="file.$error === 'maxSize'" class="errorMessage color-red"><localize key="media_maxFileSize"></localize> "{{maxFileSize}}"</span>
</span>
<span class="file-error" ng-if="file.serverErrorMessage">
<span class="errorMessage color-red">({{file.serverErrorMessage}})</span>
<span class="errorMessage color-red">{{file.serverErrorMessage}}</span>
</span>
</div>
@@ -1,13 +1,13 @@
<h3>Start here</h3>
<h4>This section contains the building blocks for your Umbraco site</h4>
<p>Follow the below links to find out more about working with the items in the Setings section:</p>
<p>Follow the below links to find out more about working with the items in the Settings section:</p>
<h4>Find out more:</h4>
<ul>
<li>Read more about working with the Items in Settings <a class="btn-link -underline" href="http://our.umbraco.org/wiki/umbraco-help/settings" target="_blank">in the Community Wiki</a></li>
<li>Download the <a class="btn-link -underline" href="http://our.umbraco.org/projects/website-utilities/umbraco-7-editors-manual" target="_blank">Editors Manual</a> for details on working with the Umbraco UI</li>
<li>Ask a question in the <a class="btn-link -underline" href="http://our.umbraco.org/" target="_blank">Community Forum</a></li>
<li>Read more about working with the Items in Settings <a class="btn-link -underline" href="https://our.umbraco.org/documentation/Getting-Started/Backoffice/Sections/" target="_blank">in the Documentation section</a> of Our Umbraco</li>
<li>Download the <a class="btn-link -underline" href="https://our.umbraco.org/projects/website-utilities/umbraco-7-editors-manual" target="_blank">Editors Manual</a> for details on working with the Umbraco UI</li>
<li>Ask a question in the <a class="btn-link -underline" href="https://our.umbraco.org/" target="_blank">Community Forum</a></li>
<li>Watch our <a class="btn-link -underline" href="http://umbraco.tv" target="_blank">tutorial videos</a> (some are free, some require a subscription)</li>
<li>Find out about our <a class="btn-link -underline" href="http://umbraco.com/products" target="_blank">productivity boosting tools and commercial support</a></li>
<li>Find out about real-life <a class="btn-link -underline" href="http://umbraco.com/products/training/schedule" target="_blank">training and certification</a> opportunities</li>
@@ -145,7 +145,8 @@
contentTypeHelper.generateModels().then(function (result) {
if (result.success) {
// generateModels() returns the dashboard content
if (!result.lastError) {
//re-check model status
contentTypeHelper.checkModelsBuilderStatus().then(function(statusResult) {
@@ -14,10 +14,8 @@
var vm = this;
vm.nodeId = $scope.contentId;
//vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
//instead of passing in a whitelist, we pass in a blacklist by adding ! to the ext
vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles).replace(/\./g, "!.");
//we pass in a blacklist by adding ! to the file extensions, allowing everything EXCEPT for disallowedUploadFiles
vm.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
vm.activeDrag = false;
vm.mediaDetailsTooltip = {};
@@ -6,9 +6,8 @@
var vm = this;
vm.nodeId = $scope.contentId;
//vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
//instead of passing in a whitelist, we pass in a blacklist by adding ! to the ext
vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles).replace(/./g, "!.");
//we pass in a blacklist by adding ! to the file extensions, allowing everything EXCEPT for disallowedUploadFiles
vm.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
vm.activeDrag = false;
vm.isRecycleBin = $scope.contentId === '-21' || $scope.contentId === '-20';
@@ -12,10 +12,10 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
$scope.model.config.startNodeId = userData.startMediaId;
});
}
function setupViewModel() {
$scope.images = [];
$scope.ids = [];
$scope.ids = [];
if ($scope.model.value) {
var ids = $scope.model.value.split(',');
@@ -30,16 +30,16 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
entityResource.getByIds(ids, "Media").then(function (medias) {
_.each(medias, function (media, i) {
//only show non-trashed items
if (media.parentId >= -1) {
if (!media.thumbnail) {
if (!media.thumbnail) {
media.thumbnail = mediaHelper.resolveFileFromEntity(media, true);
}
$scope.images.push(media);
$scope.ids.push(media.id);
$scope.ids.push(media.id);
}
});
@@ -67,6 +67,7 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
title: "Select media",
startNodeId: $scope.model.config.startNodeId,
multiPicker: multiPicker,
onlyImages: onlyImages,
show: true,
submit: function(model) {
@@ -93,8 +94,8 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
$scope.sortableOptions = {
update: function(e, ui) {
var r = [];
//TODO: Instead of doing this with a half second delay would be better to use a watch like we do in the
// content picker. THen we don't have to worry about setting ids, render models, models, we just set one and let the
//TODO: Instead of doing this with a half second delay would be better to use a watch like we do in the
// content picker. THen we don't have to worry about setting ids, render models, models, we just set one and let the
// watch do all the rest.
$timeout(function(){
angular.forEach($scope.images, function(value, key){
@@ -1,16 +1,19 @@
angular.module("umbraco")
.controller("Umbraco.PropertyEditors.RelatedLinksController",
function ($rootScope, $scope, dialogService) {
function ($rootScope, $scope, dialogService, iconHelper) {
if (!$scope.model.value) {
$scope.model.value = [];
}
$scope.model.config.max = isNumeric($scope.model.config.max) && $scope.model.config.max !== 0 ? $scope.model.config.max : Number.MAX_VALUE;
$scope.newCaption = '';
$scope.newLink = 'http://';
$scope.newNewWindow = false;
$scope.newInternal = null;
$scope.newInternalName = '';
$scope.newInternalIcon = null;
$scope.addExternal = true;
$scope.currentEditLink = null;
$scope.hasError = false;
@@ -72,7 +75,6 @@
}
$scope.model.value[idx].edit = true;
};
$scope.saveEdit = function (idx) {
$scope.model.value[idx].title = $scope.model.value[idx].caption;
@@ -107,6 +109,7 @@
this.edit = false;
this.isInternal = true;
this.internalName = $scope.newInternalName;
this.internalIcon = $scope.newInternalIcon;
this.type = "internal";
this.title = $scope.newCaption;
};
@@ -117,7 +120,7 @@
$scope.newNewWindow = false;
$scope.newInternal = null;
$scope.newInternalName = '';
$scope.newInternalIcon = null;
}
$event.preventDefault();
};
@@ -141,23 +144,73 @@
$scope.model.value[index + direction] = temp;
};
//helper for determining if a user can add items
$scope.canAdd = function () {
return $scope.model.config.max <= 0 || $scope.model.config.max > countVisible();
}
//helper that returns if an item can be sorted
$scope.canSort = function () {
return countVisible() > 1;
}
$scope.sortableOptions = {
containment: 'parent',
axis: 'y',
handle: '.handle',
cursor: 'move',
cancel: '.no-drag',
containment: 'parent',
placeholder: 'sortable-placeholder',
forcePlaceholderSize: true,
helper: function (e, ui) {
// When sorting <trs>, the cells collapse. This helper fixes that: http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/
// When sorting table rows, the cells collapse. This helper fixes that: http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/
ui.children().each(function () {
$(this).width($(this).width());
});
return ui;
},
items: '> tr',
items: '> tr:not(.unsortable)',
tolerance: 'pointer',
update: function (e, ui) {
// Get the new and old index for the moved element (using the URL as the identifier)
var newIndex = ui.item.index();
var movedLinkUrl = ui.item.attr('data-link');
var originalIndex = getElementIndexByUrl(movedLinkUrl);
// Move the element in the model
var movedElement = $scope.model.value[originalIndex];
$scope.model.value.splice(originalIndex, 1);
$scope.model.value.splice(newIndex, 0, movedElement);
},
start: function (e, ui) {
//ui.placeholder.html("<td colspan='5'></td>");
// Build a placeholder cell that spans all the cells in the row: http://stackoverflow.com/questions/25845310/jquery-ui-sortable-and-table-cell-size
var cellCount = 0;
$('td, th', ui.helper).each(function () {
// For each td or th try and get it's colspan attribute, and add that or 1 to the total
var colspan = 1;
var colspanAttr = $(this).attr('colspan');
if (colspanAttr > 1) {
colspan = colspanAttr;
}
cellCount += colspan;
});
// Add the placeholder UI - note that this is the item's content, so td rather than tr - and set height of tr
ui.placeholder.html('<td colspan="' + cellCount + '"></td>').height(ui.item.height());
}
};
//helper to count what is visible
function countVisible() {
return $scope.model.value.length;
}
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
function getElementIndexByUrl(url) {
for (var i = 0; i < $scope.model.value.length; i++) {
if ($scope.model.value[i].link == url) {
@@ -172,10 +225,12 @@
if ($scope.currentEditLink != null) {
$scope.currentEditLink.internal = data.id;
$scope.currentEditLink.internalName = data.name;
$scope.currentEditLink.internalIcon = iconHelper.convertFromLegacyIcon(data.icon);
$scope.currentEditLink.link = data.id;
} else {
$scope.newInternal = data.id;
$scope.newInternalName = data.name;
$scope.newInternalIcon = iconHelper.convertFromLegacyIcon(data.icon);
}
}
});
@@ -11,68 +11,79 @@
</tr>
</thead>
<tbody ui-sortable="sortableOptions" ng-model="model.value">
<tr ng-repeat="link in model.value" data-link="{{link.link}}">
<td style="width: 20px"><i class="icon icon-navigation handle"></i></td>
<td style="word-wrap:break-word; word-break: break-all">
<tr ng-repeat="link in model.value" data-link="{{link.link}}" ng-class="{ 'unsortable': model.value.length <= 1 }">
<td class="col-sort"><i class="icon icon-navigation handle" ng-show="canSort()"></i></td>
<td class="col-caption">
<span ng-show="!link.edit">{{link.caption}}</span>
<input type="text" ng-model="link.caption" ng-show="link.edit" />
<div class="control-wrapper">
<input type="text" ng-model="link.caption" ng-show="link.edit" />
</div>
</td>
<td style="word-wrap:break-word; word-break: break-all">
<td class="col-link">
<div ng-show="!link.edit">
<i class="icon {{link.internalIcon}}" ng-show="link.internalIcon"></i>
<a href="{{link.link}}" target="_blank" ng-show="!link.isInternal">{{link.link}}</a>
<a href="#/content/content/edit/{{link.internal}}" target="_blank" ng-show="link.isInternal" ng-bind="link.internalName"></a>
</div>
<div ng-show="link.edit">
<div ng-show="!link.isInternal">
<input type="text" ng-model="link.link" /><br />
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
</div>
<div class="control-wrapper">
<input type="text" ng-model="link.link" />
</div>
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
</div>
<div ng-show="link.isInternal">
<i class="icon {{link.internalIcon}}" ng-show="link.internalIcon"></i>
<span ng-bind="link.internalName"></span> <a href="#" ng-click="selectInternal($event,link)"><localize key="choose">Choose</localize></a><br />
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
</div>
</div>
</td>
<td>
<td class="col-newwindow">
<span ng-show="!link.edit">{{link.newWindow}}</span>
<input type="checkbox" ng-model="link.newWindow" ng-show="link.edit" />
</td>
<td>
<td class="col-actions">
<div class="btn-group" ng-show="!link.edit">
<button type="button" class="btn btn-default" ng-click="edit($index)"><localize key="edit">Edit</localize></button>
<button type="button" class="btn btn-default" ng-click="delete($index)"><localize key="delete">Delete</localize></button>
</div>
<div class="btn-group" ng-show="link.edit">
<div class="btn-group" ng-show="link.edit" style="margin-left: 0;">
<button type="button" class="btn btn-default" ng-click="saveEdit($index)"><localize key="buttons_save">Save</localize></button>
</div>
</td>
</tr>
</tbody>
<tfoot>
<tfoot ng-show="canAdd()">
<tr>
<td></td>
<td><input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="{{hasError}}" /></td>
<td>
<div ng-show="addExternal">
<td class="col-sort"></td>
<td class="col-caption">
<div class="control-wrapper">
<input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="hasError" />
</div>
</td>
<td class="col-link">
<div ng-show="addExternal">
<div class="control-wrapper">
<input type="text" ng-model="newLink" localize="placeholder" placeholder="@relatedlinks_externalLinkPlaceholder" />
<br /> <localize key="or">or</localize>
<a href="#" ng-click="switch($event)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
</div>
<localize key="or">or</localize>
<a href="#" ng-click="switch($event)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
</div>
<div ng-show="!addExternal">
<span ng-bind="newInternalName"></span> <a href="#" ng-click="internal($event)"><localize key="choose">Choose</localize></a><br />
<localize key="or">or</localize> <a href="#" ng-click="switch($event)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
</div>
</td>
<td><input type="checkbox" ng-model="newNewWindow" /> </td>
<td>
<div class="btn-group">
<button class="btn btn-default" ng-click="add($event)"><localize key="general_add">Add</localize></button>
</div>
</td>
<div ng-show="!addExternal">
<i class="icon {{newInternalIcon}}" ng-show="newInternalIcon"></i>
<span ng-bind="newInternalName"></span> <a href="#" ng-click="internal($event)"><localize key="choose">Choose</localize></a><br />
<localize key="or">or</localize> <a href="#" ng-click="switch($event)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
</div>
</td>
<td class="col-newwindow"><input type="checkbox" ng-model="newNewWindow" /></td>
<td class="col-actions">
<div class="btn-group">
<button class="btn btn-default" ng-click="add($event)" ng-disabled="newCaption == '' || !canAdd()" ng-show="canAdd()"><localize key="general_add">Add</localize></button>
</div>
</td>
</tr>
</tfoot>
</table>
@@ -84,4 +95,4 @@
position="right">
</umb-overlay>
</div>
</div>
+5 -2
View File
@@ -2241,6 +2241,9 @@
<Content Include="Umbraco\Members\EditMemberGroup.aspx">
<SubType>Form</SubType>
</Content>
<Content Include="Umbraco\ping.aspx">
<SubType>Form</SubType>
</Content>
<Content Include="Umbraco\publishStatus.aspx" />
<Content Include="Umbraco\Settings\EditDictionaryItem.aspx" />
<Content Include="Umbraco\Settings\editLanguage.aspx" />
@@ -2411,9 +2414,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>7420</DevelopmentServerPort>
<DevelopmentServerPort>7430</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:7420</IISUrl>
<IISUrl>http://localhost:7430</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
@@ -10,7 +10,7 @@ NOTES:
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
* A new version will invalidate both client and server cache and create new persisted files
-->
<clientDependency version="433963333" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<clientDependency version="386225312" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<!--
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
@@ -271,7 +271,8 @@
<key alias="externalLoginProviders">External login providers</key>
<key alias="exceptionDetail">Exception Details</key>
<key alias="stracktrace">Stacktrace</key>
<key alias="stacktrace">Stacktrace</key>
<key alias="innerException">Inner Exception</key>
<key alias="linkYour">Link your</key>
<key alias="unLinkYour">Un-Link your</key>
@@ -175,6 +175,7 @@
<key alias="urls">Link to media</key>
<key alias="orClickHereToUpload">or click here to choose files</key>
<key alias="onlyAllowedFiles">Only allowed file types are</key>
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
<key alias="maxFileSize">Max file size is</key>
</area>
<area alias="member">
@@ -271,7 +272,8 @@
<key alias="externalLoginProviders">External login providers</key>
<key alias="exceptionDetail">Exception Details</key>
<key alias="stracktrace">Stacktrace</key>
<key alias="stacktrace">Stacktrace</key>
<key alias="innerException">Inner Exception</key>
<key alias="linkYour">Link your</key>
<key alias="unLinkYour">Un-Link your</key>
+13 -12
View File
@@ -242,7 +242,7 @@
<key alias="treepicker">項目の選択</key>
<key alias="viewCacheItem">キャッシュされている項目の表示</key>
<key alias="createFolder">フォルダーの作成...</key>
<key alias="relateToOriginalLabel">オリジナルに関連付ける</key>
<key alias="theFriendliestCommunity">フレンドリーなコミュニティ</key>
@@ -267,7 +267,8 @@
<key alias="externalLoginProviders">外部ログイン プロバイダー</key>
<key alias="exceptionDetail">例外の詳細</key>
<key alias="stracktrace">スタックトレース</key>
<key alias="stacktrace">スタックトレース</key>
<key alias="innerException">Inner Exception</key>
<key alias="linkYour">次をリンク:</key>
<key alias="unLinkYour">次をリンク解除:</key>
@@ -475,7 +476,7 @@
<key alias="move">移動</key>
<key alias="embed">埋め込み</key>
</area>
<area alias="colors">
<key alias="black">ブラック</key>
<key alias="green">グリーン</key>
@@ -484,7 +485,7 @@
<key alias="blue">ブルー</key>
<key alias="red">レッド</key>
</area>
<area alias="shortcuts">
<key alias="addTab">タブの追加</key>
<key alias="addProperty">プロパティの追加</key>
@@ -503,7 +504,7 @@
<key alias="toggleListView">リスト ビューの切り替え</key>
<key alias="toggleAllowAsRoot">ルートとして許可に切り替え</key>
</area>
<area alias="graphicheadline">
<key alias="backgroundcolor">背景色</key>
<key alias="bold">太字</key>
@@ -537,7 +538,7 @@
<strong>アップグレード</strong>ボタンを押すとUmbraco %0% 用にデータベースをアップグレードします。</p>
<p>
心配ありません。 - コンテントが消える事はありませんし、後で続けることもできます。
</p>
</p>
]]></key>
<key alias="databaseUpgradeDone"><![CDATA[データベースはバージョン %0% 用にアップグレードされました。<br /><strong>次へ</strong>
を押して続行してください。]]></key>
@@ -583,7 +584,7 @@
]]></key>
<key alias="runwayFromScratch">スクラッチから始めたい</key>
<key alias="runwayFromScratchText"><![CDATA[
ウェブサイトはさしあたり完全に空っぽで、必要なドキュメント型やテンプレートを作成するところから始められます。
ウェブサイトはさしあたり完全に空っぽで、必要なドキュメント型やテンプレートを作成するところから始められます。
(<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">どうしたらいいの?</a>)
後からRunwayをインストールする事もできます。そうしたくなった時は、Developerセクションのパッケージへどうぞ。
]]></key>
@@ -597,8 +598,8 @@
<key alias="runwaySimpleSite">簡単なウェブサイトから始めたい</key>
<key alias="runwaySimpleSiteText"><![CDATA[
<p>
"Runway"(≈滑走路)は幾つかの基本的なテンプレートから簡単なウェブサイトを用意します。このインストーラーは自動的にRnwayをセットアップできますが、
これを編集したり、拡張したり、削除する事も簡単にできます。もしUmbracoを完璧に使いこなせるならばこれは不要です。とはいえ、
"Runway"(≈滑走路)は幾つかの基本的なテンプレートから簡単なウェブサイトを用意します。このインストーラーは自動的にRnwayをセットアップできますが、
これを編集したり、拡張したり、削除する事も簡単にできます。もしUmbracoを完璧に使いこなせるならばこれは不要です。とはいえ、
Runwayを使う事は、手間なく簡単にUmbracoを始める為には良い選択肢です。
Runwayをインストールすれば、必要に応じてRunwayによる基本的な構成のページをRunwayのモジュールから選択できます。
</p>
@@ -692,7 +693,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<p>ユーザー <strong>'%3%'</strong> によりページ <a href="http://%4%/actions/preview.aspx?id=%5%"><strong>'%2%'</strong></a> 上のタスク <strong>'%1%'</strong> から自動的にメールします。</p>
<div style="margin: 8px 0; padding: 8px; display: block;">
<br />
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;編集&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;編集&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<br />
</div>
<p>
@@ -704,7 +705,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<div style="margin: 8px 0; padding: 8px; display: block;">
<br />
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;編集&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;編集&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<br />
</div>
@@ -1064,7 +1065,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
<key alias="thisEditorUpdateSettings">このエディターを使用すると新しい設定で更新されます</key>
</area>
<area alias="templateEditor">
<key alias="alternativeField">代替フィールド</key>
<key alias="alternativeText">代替テキスト</key>
+30 -29
View File
@@ -189,10 +189,10 @@
<key alias="inheritedFrom">Унаследован от</key>
<key alias="addProperty">Добавить свойство</key>
<key alias="requiredLabel">Обязательная метка</key>
<key alias="enableListViewHeading">Представление в формате списка</key>
<key alias="enableListViewDescription">Устанавливает представление документа данного типа в виде сортируемого списка дочерних документов с функцией поиска, в отличие от обычного представления дочерних документов в виде дерева</key>
<key alias="allowedTemplatesHeading">Допустимые шаблоны</key>
<key alias="allowedTemplatesDescription">Выберите перечень допустимых шаблонов для сопоставления документам данного типа</key>
<key alias="allowAsRootHeading">Разрешить в качестве корневого</key>
@@ -206,31 +206,31 @@
<key alias="compositionsDescription">Унаследовать вкладки и свойства из уже существующего типа документов. Вкладки будут либо добавлены в создаваемый тип, либо в случае совпадения названий вкладок будут добавлены наследуемые свойства.</key>
<key alias="compositionInUse">Этот тип документов уже участвует в композиции другого типа, поэтому сам не может быть композицией.</key>
<key alias="noAvailableCompositions">В настоящее время нет типов документов, допустимых для построения композиции.</key>
<key alias="availableEditors">Доступные редакторы</key>
<key alias="reuse">Переиспользовать</key>
<key alias="editorSettings">Установки редактора</key>
<key alias="configuration">Конфигурирование</key>
<key alias="yesDelete">ДА, удалить</key>
<key alias="movedUnderneath">была перемещена внутрь</key>
<key alias="folderToMove">Выбрать папку для перемещения</key>
<key alias="structureBelow">в структуре дерева</key>
<key alias="allDocumentTypes">Все типы документов</key>
<key alias="allDocuments">Все документы</key>
<key alias="allMediaItems">Все медиа-элементы</key>
<key alias="usingThisDocument">, использующие этот тип документов, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
<key alias="usingThisMedia">, использующие этот тип медиа, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
<key alias="usingThisMember">, использующие этот тип участников, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
<key alias="andAllDocuments">и все документы, использующие данный тип</key>
<key alias="andAllMediaItems">и все медиа-элементы, использующие данный тип</key>
<key alias="andAllMembers">и все участники, использующие данный тип</key>
<key alias="thisEditorUpdateSettings">, использующие этот редактор, будут обновлены с применением этих установок</key>
<key alias="memberCanEdit">Участник может изменить</key>
@@ -302,18 +302,18 @@
<key alias="treepicker">Выберите элемент</key>
<key alias="viewCacheItem">Просмотр элемента кэша</key>
<key alias="createFolder">Создать папку...</key>
<key alias="relateToOriginalLabel">Связать с оригиналом</key>
<key alias="theFriendliestCommunity">Самое дружелюбное сообщество</key>
<key alias="linkToPage">Ссылка на страницу</key>
<key alias="openInNewWindow">Открывает документ по ссылке в новом окне или вкладке браузера</key>
<key alias="openInFullBody">Открывает документ по ссылке в полноэкранном режиме</key>
<key alias="openInParentFrame">Открывает документ по ссылке в родительском фрейме</key>
<key alias="linkToMedia">Ссылка на медиа-файл</key>
<key alias="selectMedia">Выбрать медиа</key>
<key alias="selectIcon">Выбрать значок</key>
<key alias="selectItem">Выбрать элемент</key>
@@ -322,23 +322,24 @@
<key alias="selectContent">Выбрать содержимое</key>
<key alias="selectMember">Выбрать участника</key>
<key alias="selectMemberGroup">Выбрать группу участников</key>
<key alias="noMacroParams">Это макрос без параметров</key>
<key alias="externalLoginProviders">Провайдеры аутентификации</key>
<key alias="exceptionDetail">Подробное сообщение об ошибке</key>
<key alias="stracktrace">Трассировка стека</key>
<key alias="stacktrace">Трассировка стека</key>
<key alias="innerException">Inner Exception</key>
<key alias="linkYour">Связать</key>
<key alias="unLinkYour">Разорвать связь</key>
<key alias="account">учетную запись</key>
<key alias="selectEditor">Выбрать редактор</key>
</area>
<area alias="dictionaryItem">
<key alias="description"><![CDATA[
Ниже Вы можете указать различные переводы данной статьи словаря '<em>%0%</em>'<br/>Добавить другие языки можно, воспользовавшись пунктом 'Языки' в меню слева
Ниже Вы можете указать различные переводы данной статьи словаря '<em>%0%</em>'<br/>Добавить другие языки можно, воспользовавшись пунктом 'Языки' в меню слева
]]></key>
<key alias="displayName">Название языка (культуры)</key>
</area>
@@ -397,7 +398,7 @@
<key alias="macroErrorLoadingCustomControl">Ошибка загрузки внешнего типа (сборка: %0%, тип: '%1%')</key>
<key alias="macroErrorLoadingMacroEngineScript">Ошибка загрузки макроса (файл: %0%)</key>
<key alias="macroErrorParsingXSLTFile">"Ошибка разбора кода XSLT в файле: %0%</key>
<key alias="macroErrorReadingXSLTFile">"Ошибка чтения XSLT-файла: %0%</key>
<key alias="macroErrorReadingXSLTFile">"Ошибка чтения XSLT-файла: %0%</key>
<key alias="missingPropertyEditorErrorMessage">Ошибка в конфигурации типа данных, используемого для свойства, проверьте тип данных</key>
<key alias="missingTitle">Укажите заголовок</key>
<key alias="missingType">Выберите тип</key>
@@ -876,7 +877,7 @@
]]></key>
<key alias="contentPublishedFailedExpired"><![CDATA[
Документ %0% не может быть опубликован, так как текущая информация в нем устарела.
]]></key>
]]></key>
<key alias="contentPublishedFailedByParent"><![CDATA[
Документ %0% не может быть опубликован, так как не опубликован его родительский документ.
]]></key>
@@ -959,14 +960,14 @@
<key alias="addTemplate">Добавить шаблон</key>
<key alias="addChildNode">Добавить дочерний узел</key>
<key alias="addChild">Добавить дочерний</key>
<key alias="editDataType">Изменить тип данных</key>
<key alias="navigateSections">Навигация по разделам</key>
<key alias="shortcut">Ярлыки</key>
<key alias="showShortcuts">показать ярлыки</key>
<key alias="toggleListView">В формате списка</key>
<key alias="toggleAllowAsRoot">Разрешить в качестве корневого</key>
</area>
@@ -1108,7 +1109,7 @@
http://%3%.
Удачи!
Генератор уведомлений Umbraco.
]]></key>
<key alias="mailSubject">[%0%] Задание по переводу %1%</key>
+2
View File
@@ -0,0 +1,2 @@
<%@ Page language="c#" AutoEventWireup="True" %>
I'm alive!
@@ -28,6 +28,12 @@ namespace Umbraco.Web.Cache
get { return "Domain cache refresher"; }
}
public override void RefreshAll()
{
ClearCache();
base.RefreshAll();
}
public override void Refresh(int id)
{
ClearCache();
+1 -1
View File
@@ -571,7 +571,7 @@ namespace Umbraco.Web.Editors
{
tempFiles.Notifications.Add(new Notification(
Services.TextService.Localize("speechBubbles/operationFailedHeader"),
"Cannot upload file " + file.Headers.ContentDisposition.FileName + ", it is not an approved file type",
Services.TextService.Localize("media/disallowedFileType"),
SpeechBubbleIcon.Warning));
}
}
+18 -1
View File
@@ -103,7 +103,24 @@ namespace Umbraco.Web.Editors
else
{
int totalRecords;
var members = _provider.GetAllUsers((pageNumber - 1), pageSize, out totalRecords);
MembershipUserCollection members;
if (filter.IsNullOrWhiteSpace())
{
members = _provider.GetAllUsers((pageNumber - 1), pageSize, out totalRecords);
}
else
{
//we need to search!
//try by name first
members = _provider.FindUsersByName(filter, (pageNumber - 1), pageSize, out totalRecords);
if (totalRecords == 0)
{
//try by email then
members = _provider.FindUsersByEmail(filter, (pageNumber - 1), pageSize, out totalRecords);
}
}
if (totalRecords == 0)
{
return new PagedResult<MemberBasic>(0, 0, 0);
@@ -173,19 +173,23 @@ namespace Umbraco.Web.Models.Mapping
Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
View = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
},
new ContentPropertyDisplay
new ContentPropertyDisplay
{
Alias = string.Format("{0}releasedate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = localizedText.Localize("content/releaseDate"),
Value = display.ReleaseDate.HasValue ? display.ReleaseDate.Value.ToIsoString() : null,
View = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
},
//Not editible for people without publish permission (U4-287)
View = display.AllowedActions.Contains('P') ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
//TODO: Fix up hard coded datepicker
} ,
new ContentPropertyDisplay
{
Alias = string.Format("{0}expiredate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = localizedText.Localize("content/unpublishDate"),
Value = display.ExpireDate.HasValue ? display.ExpireDate.Value.ToIsoString() : null,
View = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
//Not editible for people without publish permission (U4-287)
View = display.AllowedActions.Contains('P') ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
//TODO: Fix up hard coded datepicker
},
new ContentPropertyDisplay
{
@@ -13,6 +13,13 @@ namespace Umbraco.Web.Mvc
{
base.OnActionExecuted(filterContext);
// could happens if exception (but afaik this wouldn't happen in MVC)
if (filterContext.HttpContext == null || filterContext.HttpContext.Response == null ||
filterContext.HttpContext.Response.Cache == null)
{
return;
}
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetMaxAge(TimeSpan.Zero);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
@@ -21,20 +21,46 @@ namespace Umbraco.Web.Mvc
/// </remarks>
internal class EnsurePartialViewMacroViewContextFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// Ensures the custom ViewContext datatoken is set before the RenderController action is invoked,
/// this ensures that any calls to GetPropertyValue with regards to RTE or Grid editors can still
/// render any PartialViewMacro with a form and maintain ModelState
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//ignore anything that is not IRenderController
if ((filterContext.Controller is IRenderController) == false)
if ((filterContext.Controller is IRenderController) == false && filterContext.IsChildAction == false)
return;
SetViewContext(filterContext);
}
/// <summary>
/// Ensures that the custom ViewContext datatoken is set after the RenderController action is invoked,
/// this ensures that any custom ModelState that may have been added in the RenderController itself is
/// passed onwards in case it is required when rendering a PartialViewMacro with a form
/// </summary>
/// <param name="filterContext">The filter context.</param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//ignore anything that is not IRenderController
if ((filterContext.Controller is IRenderController) == false && filterContext.IsChildAction == false)
return;
SetViewContext(filterContext);
}
private void SetViewContext(ControllerContext controllerContext)
{
var viewCtx = new ViewContext(
filterContext.Controller.ControllerContext,
new DummyView(),
filterContext.Controller.ViewData, filterContext.Controller.TempData,
controllerContext,
new DummyView(),
controllerContext.Controller.ViewData, controllerContext.Controller.TempData,
new StringWriter());
//set the special data token
filterContext.RequestContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = viewCtx;
controllerContext.RequestContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = viewCtx;
}
private class DummyView : IView
+9 -3
View File
@@ -174,9 +174,15 @@ namespace Umbraco.Web.Mvc
public IModelBinder GetBinder(Type modelType)
{
return TypeHelper.IsTypeAssignableFrom<IRenderModel>(modelType) || TypeHelper.IsTypeAssignableFrom<IPublishedContent>(modelType)
? this
: null;
// can bind to RenderModel (exact type match)
if (modelType == typeof(RenderModel)) return this;
// can bind to RenderModel<TContent> (exact generic type match)
if (modelType.IsGenericType && modelType.GetGenericTypeDefinition() == typeof(RenderModel<>)) return this;
// can bind to TContent where TContent : IPublishedContent (any IPublishedContent implementation)
if (typeof(IPublishedContent).IsAssignableFrom(modelType)) return this;
return null;
}
}
}
@@ -120,9 +120,13 @@ namespace Umbraco.Web.Mvc
base.InitializePage();
if (ViewContext.IsChildAction == false)
{
//always ensure the special data token is set - this is used purely for partial view macros that contain forms
// and mostly just when rendered within the RTE
ViewContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = ViewContext;
//this is used purely for partial view macros that contain forms
// and mostly just when rendered within the RTE - This should already be set with the
// EnsurePartialViewMacroViewContextFilterAttribute
if (ViewContext.RouteData.DataTokens.ContainsKey(Constants.DataTokenCurrentViewContext) == false)
{
ViewContext.RouteData.DataTokens.Add(Constants.DataTokenCurrentViewContext, ViewContext);
}
}
}
@@ -0,0 +1,15 @@
using System;
using Owin;
namespace Umbraco.Web
{
public class OwinMiddlewareConfiguredEventArgs : EventArgs
{
public OwinMiddlewareConfiguredEventArgs(IAppBuilder appBuilder)
{
AppBuilder = appBuilder;
}
public IAppBuilder AppBuilder { get; private set; }
}
}
@@ -11,5 +11,15 @@ namespace Umbraco.Web.PropertyEditors
[PropertyEditor(Constants.PropertyEditors.RelatedLinksAlias, "Related links", "relatedlinks", ValueType ="JSON", Icon="icon-thumbnail-list", Group="pickers")]
public class RelatedLinksPropertyEditor : PropertyEditor
{
protected override PreValueEditor CreatePreValueEditor()
{
return new RelatedLinksPreValueEditor();
}
internal class RelatedLinksPreValueEditor : PreValueEditor
{
[PreValueField("max", "Maximum number of links", "number", Description = "Enter the maximum amount of links to be added, enter 0 for unlimited")]
public int Maximum { get; set; }
}
}
}
+1 -1
View File
@@ -32,7 +32,7 @@ namespace Umbraco.Web.Scheduling
// ensure we do not run if not main domain, but do NOT lock it
if (_appContext.MainDom.IsMainDom == false)
{
LogHelper.Debug<ScheduledPublishing>("Does not run if not MainDom.");
LogHelper.Debug<KeepAlive>("Does not run if not MainDom.");
return false; // do NOT repeat, going down
}
@@ -24,10 +24,31 @@ namespace Umbraco.Web.Security.Identity
{
public static class AppBuilderExtensions
{
/// <summary>
/// Called at the end of configuring middleware
/// </summary>
/// <param name="app"></param>
/// <remarks>
/// This could be used for something else in the future - maybe to inform Umbraco that middleware is done/ready, but for
/// now this is used to raise the custom event
///
/// This is an extension method in case developer entirely replace the UmbracoDefaultOwinStartup class, in which case they will
/// need to ensure they call this extension method in their startup class.
///
/// TODO: Move this method in v8, it doesn't belong in this namespace/extension class
/// </remarks>
public static void FinalizeMiddlewareConfiguration(this IAppBuilder app)
{
UmbracoDefaultOwinStartup.OnMiddlewareConfigured(new OwinMiddlewareConfiguredEventArgs(app));
}
/// <summary>
/// Sets the OWIN logger to use Umbraco's logging system
/// </summary>
/// <param name="app"></param>
/// <remarks>
/// TODO: Move this method in v8, it doesn't belong in this namespace/extension class
/// </remarks>
public static void SetUmbracoLoggerFactory(this IAppBuilder app)
{
app.SetLoggerFactory(new OwinLoggerFactory());
+4
View File
@@ -349,6 +349,7 @@
<Compile Include="Mvc\ModelBindingException.cs" />
<Compile Include="Mvc\RenderIndexActionSelectorAttribute.cs" />
<Compile Include="Mvc\ValidateMvcAngularAntiForgeryTokenAttribute.cs" />
<Compile Include="OwinMiddlewareConfiguredEventArgs.cs" />
<Compile Include="PropertyEditors\DatePreValueEditor.cs" />
<Compile Include="PropertyEditors\DecimalPropertyEditor.cs" />
<Compile Include="PropertyEditors\ValueConverters\ImageCropDataSetConverter.cs" />
@@ -1088,6 +1089,9 @@
<Compile Include="umbraco.presentation\umbraco\tree.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="umbraco.presentation\umbraco\ping.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="umbraco.presentation\umbraco\create\PartialViewMacrosTasks.cs" />
<Compile Include="umbraco.presentation\umbraco\create\PartialViewTasks.cs" />
<Compile Include="umbraco.presentation\umbraco\developer\Macros\editMacro.aspx.cs">
+15 -2
View File
@@ -1,4 +1,5 @@
using System.Web;
using System;
using System.Web;
using Microsoft.Owin;
using Microsoft.Owin.Extensions;
using Microsoft.Owin.Logging;
@@ -59,12 +60,24 @@ namespace Umbraco.Web
app
.UseUmbracoBackOfficeCookieAuthentication(ApplicationContext, PipelineStage.Authenticate)
.UseUmbracoBackOfficeExternalCookieAuthentication(ApplicationContext, PipelineStage.Authenticate)
.UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize);
.UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize)
.FinalizeMiddlewareConfiguration();
}
/// <summary>
/// Raised when the middelware has been configured
/// </summary>
public static event EventHandler<OwinMiddlewareConfiguredEventArgs> MiddlewareConfigured;
protected virtual ApplicationContext ApplicationContext
{
get { return ApplicationContext.Current; }
}
internal static void OnMiddlewareConfigured(OwinMiddlewareConfiguredEventArgs args)
{
var handler = MiddlewareConfigured;
if (handler != null) handler(null, args);
}
}
}
@@ -1,15 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using Umbraco.Core;
namespace Umbraco.Web.WebApi.Filters
{
@@ -24,6 +15,13 @@ namespace Umbraco.Web.WebApi.Filters
base.OnActionExecuted(actionExecutedContext);
// happens if exception
if (actionExecutedContext == null || actionExecutedContext.Response == null ||
actionExecutedContext.Response.Headers == null)
{
return;
}
//NOTE: Until we upgraded to WebApi 2, this didn't work correctly and we had to revert to using
// HttpContext.Current responses. I've changed this back to what it should be now since it works
// and now with WebApi2, the HttpContext.Current responses dont! Anyways, all good now.
@@ -42,9 +40,6 @@ namespace Umbraco.Web.WebApi.Filters
//Mon, 01 Jan 1990 00:00:00 GMT
new DateTimeOffset(1990, 1, 1, 0, 0, 0, TimeSpan.Zero);
}
}
}
}
@@ -1589,7 +1589,7 @@ namespace umbraco
//Trace out to profiling... doesn't actually profile, just for informational output.
if (excludeProfiling == false)
{
using (ApplicationContext.Current.ProfilingLogger.TraceDuration<macro>(string.Format("{0}", message)))
using (ApplicationContext.Current.ProfilingLogger.DebugDuration<macro>(string.Format("{0}", message)))
{
}
}
@@ -0,0 +1,38 @@
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace umbraco.presentation
{
[Obsolete("This class will be removed in future versions.")]
[EditorBrowsable(EditorBrowsableState.Never)]
public partial class ping : System.Web.UI.Page
{
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
#endregion
}
}
@@ -60,7 +60,7 @@ namespace umbraco.presentation.webservices
return jsonRefresher;
}
private bool NotAutorized(string login, string rawPassword)
private bool Authorized(string login, string rawPassword)
{
//TODO: This technique of passing the raw password in is a legacy idea and isn't really
// a very happy way to secure this webservice. To prevent brute force attacks, we need
@@ -92,7 +92,7 @@ namespace umbraco.presentation.webservices
[WebMethod]
public void BulkRefresh(RefreshInstruction[] instructions, string appId, string login, string password)
{
if (NotAutorized(login, password)) return;
if (Authorized(login, password) == false) return;
if (SelfMessage(appId)) return; // do not process self-messages
// only execute distinct instructions - no sense in running the same one more than once
@@ -131,29 +131,29 @@ namespace umbraco.presentation.webservices
[WebMethod]
public void RefreshAll(Guid uniqueIdentifier, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
if (Authorized(Login, Password) == false) return;
GetRefresher(uniqueIdentifier).RefreshAll();
}
[WebMethod]
public void RefreshByGuid(Guid uniqueIdentifier, Guid Id, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
if (Authorized(Login, Password) == false) return;
GetRefresher(uniqueIdentifier).Refresh(Id);
}
[WebMethod]
public void RefreshById(Guid uniqueIdentifier, int Id, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
if (Authorized(Login, Password) == false) return;
GetRefresher(uniqueIdentifier).Refresh(Id);
}
[WebMethod]
public void RefreshByIds(Guid uniqueIdentifier, string jsonIds, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
var refresher = GetRefresher(uniqueIdentifier);
if (Authorized(Login, Password) == false) return;
var refresher = GetRefresher(uniqueIdentifier);
foreach (var id in JsonConvert.DeserializeObject<int[]>(jsonIds))
refresher.Refresh(id);
}
@@ -161,21 +161,21 @@ namespace umbraco.presentation.webservices
[WebMethod]
public void RefreshByJson(Guid uniqueIdentifier, string jsonPayload, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
if (Authorized(Login, Password) == false) return;
GetJsonRefresher(uniqueIdentifier).Refresh(jsonPayload);
}
[WebMethod]
public void RemoveById(Guid uniqueIdentifier, int Id, string Login, string Password)
{
if (NotAutorized(Login, Password)) return;
if (Authorized(Login, Password) == false) return;
GetRefresher(uniqueIdentifier).Remove(Id);
}
[WebMethod]
public XmlDocument GetRefreshers(string Login, string Password)
{
if (NotAutorized(Login, Password)) return null;
if (Authorized(Login, Password) == false) return null;
var xd = new XmlDocument();
xd.LoadXml("<cacheRefreshers/>");