Compare commits

...

1655 Commits

Author SHA1 Message Date
Sebastiaan Janssen 5a07e34fb4 Bump version to 8.0.2 2019-04-26 15:15:17 +02:00
Stephan 1b5d614f5a Fix recycle bin moves
(cherry picked from commit 173df80e3d)

# Conflicts:
#	src/Umbraco.Core/Services/Implement/MediaService.cs
2019-04-26 15:03:09 +02:00
Sebastiaan Janssen abb08260eb v8: Imagepicker prevalue and grid setting/styles as infinite editor (#4971)
(cherry picked from commit f82dff597b)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js
2019-04-25 13:43:03 +02:00
Stephan 57c567c570 Fix paging error in NuCache
(cherry picked from commit 5d0010a993)
2019-04-23 14:08:19 +02:00
Stephan 424f4601ae Merge commit 'a2a247b413' into v8/8.0 2019-04-23 13:51:29 +02:00
Shannon a2a247b413 removes the enforcement of non duplicate property type aliases for now 2019-04-17 21:00:15 +10:00
Shannon 0b6a369047 When removing a property group, we need to first remove the group and then re-assign the property types so that duplicates are not added 2019-04-17 17:12:34 +10:00
Shannon 522fdefb8c Ensures that ALL membership properties are created by the installer, removes the logic that updates a membertype while fetching it, fixes the logic of mapping membership properties when fetching and they don't exist. 2019-04-17 16:42:17 +10:00
Shannon 4d8d10f07a adds comments, ignores test for now 2019-04-17 16:03:36 +10:00
Shannon 6f17129364 Make DropDownFlexibleConfiguration class public to allow configuration to be set when creating a new data type 2019-04-17 15:23:35 +10:00
Shannon 6f44e4fd09 Fixes INotifyCollectionChanged collections to raise the correct events, ensures that no duplicate property type aliases can be added/updated to 2019-04-16 17:37:42 +10:00
Shannon 02ddf80014 Adds a unit test 2019-04-16 15:39:28 +10:00
Shannon 723d9eddd1 unbreaks a ctor change preventing 8.0.2 from being dropped into the bin 2019-04-15 18:15:52 +10:00
Shannon fa655b812c Fix composers ordering 2019-04-15 17:55:22 +10:00
Shannon 576c10cd50 NuCache: fix vanishing content when refreshing content types 2019-04-15 12:56:45 +10:00
Kenn Jacobsen 179afe7e0d Add IsVisible extension on IPublishedElement 2019-04-11 17:44:16 +02:00
Shannon be7f42c454 Don't show the recycle bin in tree pickers/dialogs 2019-04-10 09:52:06 +10:00
Shannon 7e1ee26dee Fix spelling mistake 2019-04-09 10:34:59 +10:00
Stephan 1c9b449c46 Log more details about boot environment 2019-04-07 16:25:06 +02:00
Shannon e38095b727 NuCache: fix loading the media cache from local files, was missing media 2019-04-05 10:49:19 +11:00
Shannon b5796ad237 Enable configuration of NuCache BTree block size #5114 2019-04-05 10:44:36 +11:00
Stephan f985c437b5 Add content.SetValue overload for posted files 2019-04-04 09:28:34 +02:00
Andrew Deans 63fb8f5933 Fix case of query parameter 2019-04-04 09:12:40 +02:00
Shannon eb529783c4 Don't allow move in members listview 2019-04-03 16:22:13 +11:00
Shannon a8265db5f0 Reload listview after moving items 2019-04-03 10:45:04 +11:00
Shannon 7dcf2b1abb infinity editing dim-layer for umb-modelcolumn 2019-04-01 17:05:13 +11:00
Stephan 514452ddb9 Better ServerMessenger configuration 2019-04-01 16:30:37 +11:00
Stephan 1eb55a83c0 Merge branch 'patch-8.0.1' into v8/8.0 2019-03-30 12:13:12 +01:00
Stephan dfe6f2029a NuCache: better fixing, cleanup 2019-03-26 10:25:05 +01:00
Stephan 851c844c8b NuCache: fix panic exception 2019-03-26 10:25:05 +01:00
Stephan 7e413ed406 NuCache: troubleshooting 2019-03-26 10:25:05 +01:00
Stephan c56b8863ee NuCache: reorg some classes 2019-03-26 10:25:05 +01:00
Stephan 13a8548d3a NuCache: rename things 2019-03-26 10:25:05 +01:00
Stephan a70cb51559 NuCache: cleanup scoped objects 2019-03-26 10:25:05 +01:00
Kenn Jacobsen 8a56b3db16 Fix the "Language" dropdown in the "Culture and Hostnames" dialog 2019-03-26 20:10:50 +11:00
Bjarke Berg 4fcf2ce7bd Fixed issue when creating variant content templates, but the properties is invariant. Before this change an exception was thrown 2019-03-26 20:10:03 +11:00
Shannon 080ace90b2 Bugfix: https://github.com/umbraco/Umbraco-CMS/issues/4827 - Fixed MediaPickerValueConverter when config is Only Images 2019-03-26 20:09:12 +11:00
Shannon 2bfa81c707 fixes 4627 + makes front-end validations appear as soon as they are invalid again. 2019-03-26 20:07:42 +11:00
Sebastiaan Janssen 44cb5fd96b Apparently the highest minClientVersion allowed is 4.1.0 for now - see https://github.com/NuGet/NuGetGallery/blob/master/src/NuGetGallery/GalleryConstants.cs#L36 2019-03-19 09:24:41 +01:00
Robert b0b987f9cd Merge pull request #4710 from umbraco/temp8-4708-fix-for-exit-preview-with-null-culture
Fix for exit preview with null culture

(cherry picked from commit 9b25cdaa14)
2019-03-14 13:21:28 +01:00
Sebastiaan Janssen 3961e2533d Fix JS unit tests 2019-03-11 15:50:16 +01:00
Stephan b46f842400 Do not inject IEnumerable but Collection in UmbracoContextFactory
(cherry picked from commit 7e67bbea13)
2019-03-11 15:41:40 +01:00
Kenn Jacobsen 930acfeb68 Show the content app for media folders with content properties
(cherry picked from commit 9062b400d4)
2019-03-11 14:58:13 +01:00
Shannon b004c616ad Removes faulty CustomRouteUrlProvider
(cherry picked from commit 52beb01110)
2019-03-11 14:54:43 +01:00
Sebastiaan Janssen 9d64c4e551 Bugfix CoreRuntime
(cherry picked from commit 2209b37a4a and 7f31ddc250)
2019-03-11 14:45:48 +01:00
Sebastiaan Janssen 9a0aacd45a Upgrade to ModelsBuilder 8.0.2, support Custom Tool (#4881)
* Upgrade to ModelsBuilder 8.0.2, support Custom Tool

* Upgrade to ModelsBuilder 8.0.3

* Fix controllers

* Upgrade MB

* Fix previous commit

(cherry picked from commit c85c055424)
2019-03-11 14:37:59 +01:00
Kenn Jacobsen 29ff7bc340 Handle checkbox value conversion from Nested Content
(cherry picked from commit 2352b50d97)
2019-03-08 15:09:54 +01:00
Shannon 39a97fb768 Enable adding api controllers 2019-03-07 19:09:13 +11:00
Kenn Jacobsen 0852bd90d0 Always update URLs on save no matter which app is active
(cherry picked from commit 869d088e4b)
2019-03-06 17:26:36 +01:00
Niels Lyngsø e28365a0e5 hack for not using scope() in grid redordering
(cherry picked from commit a67163fd03)
2019-03-06 16:58:57 +01:00
Sebastiaan Janssen 0d16c79d0c Require higher NuGet version so we don't target VS15 any more (unsupported)
Making backups before we upgrade is no longer needed, removed from install.ps1
If people include the bin folder in their solution they will get errors upgrading now, we shouldn't need to try and fix this, there's no reason to include the bin folder in the solution - therefore install.core.ps1 is removed

(cherry picked from commit 82b78c7530)
2019-03-06 14:57:53 +01:00
Sebastiaan Janssen 7cc8983a25 Fix NuCache url segments
(cherry picked from commits 7a0f11bc6f and cfa94b1bb8)
2019-03-06 10:25:21 +01:00
Shannon e7f8baeca4 fixed correct destination url instead of #. 2019-03-05 16:14:06 +11:00
Stephan e716d14a0a Fix distributed cache handler for medias (#4751)
(cherry picked from commit 31b293aa4d)
2019-03-04 16:51:15 +01:00
Robert Foster 4c6a742007 Changed all references of umbracoUseSSL to Umbraco.Core.UseHttps to fix issue #4749
(cherry picked from commit 5aa38c1f43)
2019-03-04 15:33:08 +01:00
Sebastiaan Janssen 410241b61d 4766 fixed up other instances where nodeSelectHandler was being passed incorrect number of arguments
(cherry picked from commit 553bf6d304 and 4503967778)
2019-03-04 15:13:30 +01:00
Kenn Jacobsen 4e47fa9a70 Fix the "selected" checkmark in tree picker search results
(cherry picked from commit 09dc908332)
2019-03-04 15:10:55 +01:00
Robert Foster 9c5fb1fead Fix for Content App badges not being displayed (#4787)
(cherry picked from commit 055f983cbf)
2019-03-04 15:10:09 +01:00
Sebastiaan Janssen dc41db5fc1 Bumps version to 8.0.1 2019-03-04 15:08:23 +01:00
Sebastiaan Janssen 11b6a98df8 Bugfix exception during install, live models collision
(cherry picked from commit aa86dfa956)
2019-03-04 15:05:17 +01:00
Sebastiaan Janssen da9fc1e147 Make it possible to upload the same file twice or more (#4755)
(cherry picked from commit b5bda772af)
2019-03-04 15:04:27 +01:00
Sebastiaan Janssen 319c75757a Bugfix: Don't use ToString :'(
(cherry picked from commit ed6d54e64a)
2019-03-04 15:01:54 +01:00
Pete Duncanson 6e81e57c8e Removed System.Web.WebPages reference in nonodes.aspx as was failing a clean build
(cherry picked from commit f1d1c95709)
2019-03-04 14:58:05 +01:00
Sebastiaan Janssen 9ebe282ba6 Ensure we dont double insert
(cherry picked from commit 578eb8b32c and b86e7dc0e8)
2019-03-04 14:57:13 +01:00
Claus b8db430615 Revert "Fix UmbracoDatabaseFactory"
This reverts commit 716fc582a0.
2019-02-21 21:01:24 +01:00
Sebastiaan Janssen f9d51ba415 fix version 2019-02-21 19:32:11 +01:00
Stephan e07a17db29 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2019-02-21 19:17:01 +01:00
Stephan ad62983327 Introduce ILivePublishedModelFactory 2019-02-21 19:15:35 +01:00
Bjarke Berg fc8ae1b228 Merge remote-tracking branch 'origin/dev-v8' into dev-v8-fix 2019-02-21 16:24:31 +01:00
Stephan 48f27afbc9 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2019-02-21 16:23:20 +01:00
Stephan e1532f9215 Merge branch 'temp8-saving-event-cannot-publish-values' into dev-v8 2019-02-21 16:22:44 +01:00
Bjarke Berg a2279d03f6 Materializing the TypeContentSources before iterating them. 2019-02-21 16:13:21 +01:00
Bjarke Berg e52ff0ea03 merge fix 2019-02-21 14:57:41 +01:00
Bjarke Berg aaa8e881f8 Version number revert 2019-02-21 14:45:12 +01:00
Bjarke Berg 14ec6b8792 Merge branch 'dev-v8' into dev-v8-fix
# Conflicts:
#	src/Umbraco.Core/IO/ShadowWrapper.cs
2019-02-21 14:43:18 +01:00
Stephan 90feb463aa Cleanup 2019-02-21 14:13:37 +01:00
Stephan 73c4e734b3 Move to UniqueMediaPathScheme 2019-02-21 13:48:33 +01:00
Stephan c85b90d65d Combined Guids media path scheme 2019-02-21 13:48:14 +01:00
Stephan e923b940f9 Cleanup Url token encoding 2019-02-21 13:47:10 +01:00
Bjarke Berg d29d629eae Merge pull request #4688 from umbraco/temp8-4674-media-paths
Fix media paths length issues
2019-02-21 13:21:39 +01:00
Stephan 50b076ce38 Merge branch 'dev-v8' into temp8-saving-event-cannot-publish-values 2019-02-21 13:03:36 +01:00
Stephan badb55476b Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2019-02-21 13:03:19 +01:00
Stephan 9ecd63eaed Move to UniqueMediaPathScheme 2019-02-21 12:20:10 +01:00
Stephan 5edd61107f Combined Guids media path scheme 2019-02-21 11:28:51 +01:00
Stephan c21039f1af Fix SqlServer bulk insert / unwrapping commands 2019-02-21 11:17:41 +01:00
Stephan 51f6c639bf Cleanup Url token encoding 2019-02-21 09:35:38 +01:00
Shannon d9a3fa443d fixes test 2019-02-21 15:29:36 +11:00
Shannon 13a1c02507 Fixes content service Saving events so that they are fired before the model's values are published when the service is publishing 2019-02-21 14:46:14 +11:00
Shannon 7a9bc19ffd Adds notes + unit test showing the problem 2019-02-21 12:08:00 +11:00
Stephan 3dfe653ef4 Better throwing on long path in filesystems 2019-02-20 17:04:29 +01:00
Stephan db4dc9006a Shorten filepaths 2019-02-20 17:04:29 +01:00
Stephan 212244b9f2 Hopefully fix PublishedMember 2019-02-20 17:04:29 +01:00
Stephan 12f7492d80 Reorg code 2019-02-20 17:04:29 +01:00
Claus d9d68cf6bf The content service is not returning the invalid properties when publishing fails
(cherry picked from commit d94e383ed7)
2019-02-20 16:17:39 +01:00
Claus d94e383ed7 The content service is not returning the invalid properties when publishing fails 2019-02-20 16:05:42 +01:00
Stephan 716fc582a0 Fix UmbracoDatabaseFactory 2019-02-20 15:52:21 +01:00
Stephan 50c9625cc6 Oops fix previous commit 2019-02-20 15:01:32 +01:00
Stephan 5cbc428590 Fix UserRepository 2019-02-20 15:00:23 +01:00
Stephan db4d88b2dc Shorten shadow filesystems identifiers 2019-02-20 14:10:15 +01:00
Stephan d9d54f7982 Merge branch 'temp8-fixes-published-content-children-method' into dev-v8
(cherry picked from commit 735d759208)
2019-02-20 13:36:10 +01:00
Shannon a61a2b4d97 Removes notes
(cherry picked from commit 717efb6b09)
2019-02-20 13:35:50 +01:00
Stephan 735d759208 Merge branch 'temp8-fixes-published-content-children-method' into dev-v8 2019-02-20 12:56:14 +01:00
Shannon 65f99a9bfd renames the method params to be consistent 2019-02-20 21:06:36 +11:00
Shannon 6c23066fb7 Fixes the Content.Children conundrum with ChildrenOfType method 2019-02-20 21:03:36 +11:00
Shannon 717efb6b09 Removes notes 2019-02-20 20:37:10 +11:00
Sebastiaan Janssen 91c52cffc8 And revert again 2019-02-19 15:57:40 +01:00
Sebastiaan Janssen 03e7779afb Update install screen 2019-02-19 15:57:06 +01:00
Sebastiaan Janssen 15562ec12f Bump version 2019-02-19 15:01:26 +01:00
Sebastiaan Janssen 6e8862954a Bump version 2019-02-19 15:00:58 +01:00
Warren Buckley 9c7ab96c92 Typo FilderedControllerFactory (#4650) 2019-02-19 14:23:26 +01:00
Stephan 49ca4bbc91 Fix MB in nuspec 2019-02-19 09:42:42 +01:00
Stephan 5121142760 Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-19 08:48:59 +01:00
Stephan 4c53604bd0 Merge branch 'temp8-fixes-publishing-new-content' into temp8 2019-02-19 08:48:28 +01:00
Stephan bf329aa431 Merge branch 'temp8' into temp8-fixes-publishing-new-content 2019-02-19 08:45:54 +01:00
Bjarke Berg d456ee9a31 Merge pull request #4632 from umbraco/temp8-4438
Fixes 4438: Local variant picker squeezes the width of node-name-input, to make it scroll instead of disappear behind.
2019-02-19 08:36:33 +01:00
Stephan f06d720dbd Fix SqlServer detection 2019-02-19 08:12:48 +01:00
Bjarke Berg 87839f4f6a Merge pull request #4643 from umbraco/temp8-show-notification-msg-client-validation
v8 - Shows a notification message when client validation fails in the content editor, else it's not clear there are any problems
2019-02-19 07:54:55 +01:00
Shannon 02f8c4a106 Adds TODO note 2019-02-19 16:55:57 +11:00
Shannon 71ad7df787 adds code comments 2019-02-19 12:23:08 +11:00
Shannon 4b7520b6f8 Updates the validation warning for media and members 2019-02-19 12:06:55 +11:00
Shannon c06c996ccf Shows a notification message when client validation fails in the content editor, else it's not clear there are any problems. 2019-02-19 11:46:46 +11:00
Sebastiaan Janssen 9fe4d9c44e Make "add group" shortcut consistent 2019-02-18 22:00:25 +01:00
Carole Rennie Logan 560174a21f V8: Changing tab to group (#4391) 2019-02-18 21:44:32 +01:00
Kenn Jacobsen e34a0ec73b Update/fix the blur handling for the tags editor 2019-02-18 20:54:55 +01:00
Jan Skovgaard 152b318d78 v8: Remove open sans font (#4613) 2019-02-18 20:52:18 +01:00
BatJan 414c6b8788 Remove old preview functionality 2019-02-18 20:50:57 +01:00
Kenn Jacobsen 19fb1a55e3 Add missing dirty checks to mediatypes 2019-02-18 20:34:16 +01:00
Kenn Jacobsen b02a9c3e7a Add missing dirty checks to content type dirty checking 2019-02-18 20:22:19 +01:00
Shannon e6f8309d54 reverts the list view changes so they open normally 2019-02-18 17:01:34 +01:00
Shannon 3ecf4144e7 Fixes publishing new variant content that has validation errors 2019-02-19 02:51:05 +11:00
Sebastiaan Janssen 817dd21155 Allow for unselecting a color in the color picker 2019-02-18 16:42:05 +01:00
Sebastiaan Janssen 34216fd635 Create a valid date picker datatype 2019-02-18 16:16:31 +01:00
Shannon c81ff85b41 Merge branch 'kjac-v8-fix-dont-retain-cculture' into temp8 2019-02-19 01:52:26 +11:00
Shannon ca1ec0e4a3 Merge branch 'v8-fix-dont-retain-cculture' of https://github.com/kjac/Umbraco-CMS into kjac-v8-fix-dont-retain-cculture 2019-02-19 01:49:27 +11:00
Shannon f2ae41ada2 Fixes the culturerequest.interceptor so that it works in tests (and so circular deps aren't caused), internalizes ClientCulture and makes it a little less error prone. 2019-02-19 01:44:00 +11:00
Shannon 90cbd69373 Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-19 01:21:40 +11:00
Shannon 16629c78d2 Merge branch 'kjac-v8-fix-use-client-culture' into temp8 2019-02-19 01:20:03 +11:00
Shannon 04487557d7 Merge branch 'v8-fix-use-client-culture' of https://github.com/kjac/Umbraco-CMS into kjac-v8-fix-use-client-culture 2019-02-19 01:05:11 +11:00
Sebastiaan Janssen 5955ede1dc Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.controller.js
2019-02-18 14:58:49 +01:00
Mathieu Deslauriers 62463ecc21 Issue 4634 : Fixed colorpicker unselection condition
When the user remove the selection the model is set to null.
When the user tries to select another value after that, the condition is trying to check the "value" property for a null object.
2019-02-18 14:52:13 +01:00
Stephan 5a11b1bcac Upgrade ModelsBuilder 2019-02-18 14:43:15 +01:00
Shannon e1c22ef02c bumped to examine 1.0.0 2019-02-19 00:17:23 +11:00
Niels Lyngsø e1d990e6e8 Only show wrapper when it has content to show 2019-02-18 14:13:23 +01:00
Niels Lyngsø ce8b29bfcc Fixes #4438, makes variant-picker push the width of input, moed border of input to input-wrapper. 2019-02-18 13:35:16 +01:00
Kenn Jacobsen 1c554a8770 Add generic section icon in section picker + clean up legacy section icon stuff 2019-02-18 13:35:08 +01:00
Bjarke Berg 4cc68912ce Merge pull request #4630 from umbraco/temp8-sections
Move sections to their own namespace
2019-02-18 12:20:45 +01:00
Bjarke Berg e2baf50364 Removing boostrap2 stuff 2019-02-18 12:02:03 +01:00
Bjarke Berg dbb82cb3f8 Fixed views 2019-02-18 11:32:09 +01:00
Stephan 11506e5548 Merge branch 'temp8' into temp8-sections 2019-02-18 11:24:41 +01:00
Stephan 7185089f1d Move sections to their own namespace 2019-02-18 11:22:25 +01:00
Bjarke Berg 050616f446 nullref fixes 2019-02-18 10:58:06 +01:00
Bjarke Berg 08d4747824 nullref fix 2019-02-18 10:55:13 +01:00
Bjarke Berg ecfc8d819f #4379 - Merged Umbraco.Date into Umbraco.Datetime property editor (#4608) 2019-02-18 09:54:01 +01:00
Stephan 30b5dd4d04 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-18 09:49:05 +01:00
Bjarke Berg 6b8fc66858 Merge pull request #4605 from umbraco/temp8-injection-ihttpcontextaccessor-instead-of-controller
Injecting `IUmbracoContextAccessor` instead `UmbracoContext` in constructors
2019-02-18 09:48:37 +01:00
Stephan d7ce71f6a7 Merge branch 'temp8-fixes-rendering-content-without-template' into temp8 2019-02-18 09:48:34 +01:00
Stephan c2bf3d0d53 Merge branch 'temp8' into temp8-fixes-rendering-content-without-template 2019-02-18 09:47:45 +01:00
Stephan ed6167fb0a Document Serilog per-source level 2019-02-18 09:46:43 +01:00
Bjarke Berg aef83b86d4 Merge branch 'temp8' into temp8-injection-ihttpcontextaccessor-instead-of-controller
# Conflicts:
#	src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs
#	src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs
2019-02-18 09:10:47 +01:00
Shannon 8ea6e2b855 If a content item has no template (i.e. route hijack), it will fail to render 2019-02-18 19:07:51 +11:00
Bjarke Berg 8c9d115986 Merge pull request #4626 from umbraco/temp8-remove-Created-service-events
v8 - removal of "Created" events that shouldn't exist
2019-02-18 08:58:57 +01:00
Shannon 79c67e9c1b Fixes logging message 2019-02-18 18:06:54 +11:00
Shannon aa90e61a97 Forgot to remove the ContentService, MediaService and MemberService Created events - these should have been removed a very long time ago! 2019-02-18 16:38:55 +11:00
Shannon 59f51767b5 Forgot to remove the ContentService, MediaService and MemberService Created events - these should have been removed a very long time ago! 2019-02-18 16:38:37 +11:00
Shannon f079f3d66b Fixes a null ref if a url provider returns null 2019-02-18 16:29:57 +11:00
Shannon Deminick 2958b42b31 Merge pull request #4600 from aaronpowell/temp8-3935-clientdependency
Improved fix for non-web Umbraco hosts
2019-02-18 16:13:28 +11:00
Shannon 876336d9fd Fixes more of #4478 2019-02-18 15:02:38 +11:00
Stephan d8a9bfc22c Bugfix variation context in background tasks 2019-02-16 17:25:24 +01:00
Stephan 7641e7a521 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-15 22:45:46 +01:00
Stephan 834a30b5c7 Fix tests 2019-02-15 22:45:30 +01:00
Stephan 6a5f8c0ab8 Fix #4578 2019-02-15 19:32:13 +01:00
Stephan 4ab6ab1a1f Merge branch 'temp8-umbhelper-vs-umbcontext-cleanup' into temp8 2019-02-15 14:20:39 +01:00
Stephan 94a44a2609 Cleanup 2019-02-15 14:20:31 +01:00
Bjarke Berg 8e29dbd494 #4569 - Rename TinyMCE property editor alias (From TinyMCEv3)
#379 - Rename Label property editor alias (From NoEdit)
2019-02-15 13:52:02 +01:00
Robert a0896f168c Merge pull request #4562 from umbraco/temp8-ui-listview-as-infinity-editing-v2
Temp8 ui listview as infinity editing v2
2019-02-15 11:45:58 +01:00
Robert 0555f0868b Merge remote-tracking branch 'origin/temp8' into temp8-ui-listview-as-infinity-editing-v2 2019-02-15 11:24:26 +01:00
Bjarke Berg 5dc3cf45ec Merge remote-tracking branch 'origin/temp8' into temp8-injection-ihttpcontextaccessor-instead-of-controller 2019-02-15 11:13:18 +01:00
Bjarke Berg 8631136444 Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-15 11:05:41 +01:00
Bjarke Berg 7f764a4557 Bugfix for checkboxlist 2019-02-15 11:03:38 +01:00
Robert e29b47069c Show save and publish in infinite mode 2019-02-15 10:54:00 +01:00
Bjarke Berg 73e0e3547c Merge remote-tracking branch 'origin/temp8' into temp8-injection-ihttpcontextaccessor-instead-of-controller 2019-02-15 10:53:23 +01:00
Stephan 6f0ba2236f Fix IGlobalSettings.LocalTempPath in tests 2019-02-15 10:52:30 +01:00
Stephan a46d40e9ef Fix UmbracoContext issue (with a TODO) 2019-02-15 10:52:30 +01:00
Bjarke Berg 2adec8ee74 Merge pull request #4599 from umbraco/temp8-fix-umbeditornavigation-4478
v8 Fixes umbeditornavigation.directive
2019-02-15 10:35:28 +01:00
Robert 68662e271d Merge remote-tracking branch 'origin/temp8' into temp8-ui-listview-as-infinity-editing-v2
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/components/content/edit.html
2019-02-15 10:28:04 +01:00
Stephan cdae0adf52 Merge branch 'temp8' into temp8-umbhelper-vs-umbcontext-cleanup 2019-02-15 10:17:14 +01:00
Bjarke Berg f0dd69d95c Yet another change from injecting UmbracoContext to IUmbracoContextAccessor 2019-02-15 10:10:20 +01:00
Bjarke Berg 90c1fa4a10 Merge remote-tracking branch 'origin/temp8' into temp8-injection-ihttpcontextaccessor-instead-of-controller 2019-02-15 09:59:17 +01:00
Bjarke Berg eab1e46a4b Bugfix in view after UmbracoContext refactoring 2019-02-15 09:58:54 +01:00
Bjarke Berg a29f7b764f Merge remote-tracking branch 'origin/temp8' into temp8-injection-ihttpcontextaccessor-instead-of-controller
# Conflicts:
#	src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs
#	src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs
#	src/Umbraco.Web/Editors/Filters/UserGroupAuthorizationAttribute.cs
#	src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs
#	src/Umbraco.Web/Mvc/RedirectToUmbracoPageResult.cs
2019-02-15 09:48:55 +01:00
Stephan 47ee3bf3e4 Move things around 2019-02-15 09:47:35 +01:00
Stephan 64154da4e4 Get LocalTempPath in GlobalSettings 2019-02-15 09:45:51 +01:00
Bjarke Berg 4879e7164e Merge pull request #4413 from kjac/v8-fix-invariant-variant-redirect-tracking
V8: Redirect tracking for invariant content under variant content
2019-02-15 09:10:39 +01:00
Bjarke Berg ed0769f74b Fix for invariant previews 2019-02-15 08:51:03 +01:00
Aaron Powell 0aae5c1df1 Lifting up where the hosted test is 2019-02-15 16:41:50 +11:00
Shannon 3223f23ce4 Dont throw if a property editor isn't found, this prevents the user from doing anything (i.e. if a DLL is removed for some reason like package uninstall), instead default to label so that the admin can actually make changes. 2019-02-15 14:41:20 +11:00
Shannon 9292254aa8 Fixes umbeditornavigation.directive which doesn't listen for any changes to the navigation collection which means it can't dynamically resize or show/hide the items 2019-02-15 14:20:42 +11:00
Shannon 52548316aa adds IPublishedMembersCache to the container and updates MembershipHelper to be request based 2019-02-15 13:36:46 +11:00
Shannon 45f7e71787 Merge remote-tracking branch 'origin/temp8' into temp8-umbhelper-vs-umbcontext-cleanup 2019-02-15 13:09:26 +11:00
Shannon Deminick a87ca8fa1e Merge pull request #4577 from umbraco/temp8-contexts
Refactor UmbracoContext
2019-02-15 12:55:29 +11:00
Shannon 6f7e1cac3e Merge branch 'temp8' into temp8-contexts 2019-02-15 12:55:17 +11:00
Shannon Deminick 997b96e9d4 Merge pull request #4557 from umbraco/temp8-no-restart
Use ChangesMonitor to prevent unwanted restarts during install/upgrade
2019-02-15 12:32:48 +11:00
Shannon afbfc0034d Fixes tests 2019-02-15 12:19:42 +11:00
Shannon 02e3a8f19c Removes all inter-dependencies between UmbracoContext, UmbracoHelper and MembershipHelper and moves Html methods to HtmlHelper extensions. This simplifies UmbracoHelper and MembershipHelper to not require huge dependencies and splits the logic in a nicer fashion instead of wrapping everything 2019-02-15 11:43:56 +11:00
Shannon 6a49f1f99d no need for a Current. usage here 2019-02-15 11:27:33 +11:00
Shannon 4fb0414db3 Removes DisposableObject and uses DisposableObjectSlim where necessary, renames Nul to Null 2019-02-15 10:42:02 +11:00
Bjarne Fyrstenborg 9a5d6afaef Update navigation icons in package section 2019-02-14 21:02:31 +01:00
Bjarne Fyrstenborg 90e3b4273a v8: Adjust Umbraco Forms dashboard (#4589) 2019-02-14 21:01:06 +01:00
Kenn Jacobsen 4662b2e5d4 Fix missing crops on images 2019-02-14 20:55:02 +01:00
Sebastiaan Janssen 3704bfcfe8 Update to latest ImageProcessor 2019-02-14 20:45:34 +01:00
Kenn Jacobsen 013fa2e454 Don't let the image cropper reuse crop states between crops 2019-02-14 20:31:12 +01:00
Kenn Jacobsen 8fe8a0dfa3 Make the image crop slider move at 66 hertz 2019-02-14 20:31:03 +01:00
Kenn Jacobsen 4249f3d1ec Fix the initial zoom offset for new crops in the image cropper 2019-02-14 20:29:43 +01:00
Daniël Knippers 759940b48f Fixes typo defualt -> default 2019-02-14 18:22:04 +01:00
Kenn Jacobsen 5cf0a3adb0 Add the missing right hand side margin for name fields 2019-02-14 18:19:12 +01:00
Kenn Jacobsen 19f884e196 Make sure to show the "No allowed types" for applicable media items 2019-02-14 18:17:35 +01:00
Kenn Jacobsen c1de832c4b Fix: Allowed types for creation don't update 2019-02-14 18:17:00 +01:00
Sebastiaan Janssen 5a482a49bf Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs
2019-02-14 18:14:46 +01:00
Rasmus John Pedersen 46b5c18cc5 V8: Multi Url Picker fixes (#4528)
*  Fix not being able to save link with only an anchor

* Don't allow Multi Url Picker as a Macro Parameter Editor

* Fix anchor/querystring not being saved
2019-02-14 18:12:55 +01:00
Rasmus John Pedersen 3a469cdc77 Multi Url Picker fixes (#4527)
*  Fix not being able to save link with only an anchor

* Don't allow Multi Url Picker as a parameter editor
2019-02-14 18:11:44 +01:00
Kenn Jacobsen f4a0546dba V8: Add user state and filter localization (#4510) 2019-02-14 18:07:09 +01:00
Kenn Jacobsen 04525b014e Styling for the item edit link in the media picker 2019-02-14 18:04:32 +01:00
Jan Skovgaard 8079b64684 v8: Remove uneeded vendor prefixes (#4502) 2019-02-14 18:03:30 +01:00
Jan Skovgaard 53e6528e6d v8: Remove IE7 CSS hacks (#4500) 2019-02-14 17:55:42 +01:00
Kenn Jacobsen 8a676947bc Don't show the content navigation dropdown if there is only one group of properties 2019-02-14 17:53:32 +01:00
Jan Skovgaard 177a84273f V8: Simplify font setup (#4475) 2019-02-14 17:35:06 +01:00
Kenn Jacobsen 02281a0ee2 Add "back to list" button on edit user 2019-02-14 17:21:35 +01:00
Bjarne Fyrstenborg 9cf4b7b063 v8: Fix closing infinite editors through Escape key (#4462) 2019-02-14 17:19:42 +01:00
Bjarne Fyrstenborg f130fcc390 v8: inifiteediting hide return to list (#4463) 2019-02-14 17:19:02 +01:00
Kenn Jacobsen 9205d2f514 Don't show all children of a selected node as selected 2019-02-14 17:07:54 +01:00
Bjarne Fyrstenborg d76d9b8bcf v8: Fix dictionary items overview (#4456) 2019-02-14 17:04:11 +01:00
Bjarne Fyrstenborg 20e12644e5 v8: Fix saving infinite spinner (#4453) 2019-02-14 16:48:39 +01:00
Bjarne Fyrstenborg 2f377dbefa v8: Update examine management dashboard (#4447) 2019-02-14 16:40:58 +01:00
Bjarne Fyrstenborg fef604d551 v8: Update NuCache dashboard (#4435) 2019-02-14 16:36:44 +01:00
Bjarne Fyrstenborg 822d6cb4c0 v8: Add no relations message (#4431) 2019-02-14 16:33:09 +01:00
Bjarne Fyrstenborg 0d507612cc v8: Fix package options view (#4424) 2019-02-14 16:30:46 +01:00
Bjarne Fyrstenborg 0d36151e53 v8: Macro partial view picker (#4412) 2019-02-14 16:15:00 +01:00
Bjarne Fyrstenborg 280a6d79b4 v8: Add package contributors (#4385) 2019-02-14 16:00:58 +01:00
Robert 2f68853802 Removed console.log 2019-02-14 15:48:39 +01:00
Kenn Jacobsen a8f4cf73d8 V8: Use "Email" instead of "Username" on the login screen (#4383)
* Use "Email" instead of "Username" on the login screen when using email as username in config

* Fix placeholder too
2019-02-14 15:48:20 +01:00
Warren Buckley a7afb2784c Update main UmbracoCms NuSpec for ModelsBuilder update - SK uses the main UmbracoCMS nuget pkg in the example site & wont boot/upgrade without this updated nuspec 2019-02-14 14:28:23 +00:00
Bjarne Fyrstenborg 0a486de6a2 v8: Redirects confirm overlay (#4378) 2019-02-14 15:10:28 +01:00
Kenn Jacobsen 1fe1762724 Retain cculture in breadcrumbs 2019-02-14 15:02:54 +01:00
Stephan 6943be9726 Upgrade ModelsBuilder 2019-02-14 14:23:48 +01:00
Kenn Jacobsen d4a76f1bea V8: Align dialogs in the Settings section (#4344)
* Show the cancel button on macro delete confirm

* Hide "Do something else" when creating folders

* Remove "Do something else" on create relation type
2019-02-14 14:21:21 +01:00
Robert 8cf73e4ecd Merge pull request #4570 from umbraco/temp8-js-test-fixing
v8 - fixing js unit tests + build + CI
2019-02-14 14:18:03 +01:00
Kenn Jacobsen 65670ab539 Merge branch 'temp8' into v8-fix-dont-retain-cculture 2019-02-14 14:01:16 +01:00
Bjarke Berg c4ab4688c7 Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-14 13:50:39 +01:00
Bjarke Berg 92dd1b0f8f Use the url from the object 2019-02-14 13:48:57 +01:00
Stephan 19ac18d13a Really import missing files 2019-02-14 13:48:47 +01:00
Warren Buckley 609786e0c3 Merge pull request #4573 from umbraco/temp8-reorg-composing
Reorganize composition code
2019-02-14 12:44:03 +00:00
Stephan 382a3aba81 Merge branch 'temp8' into temp8-reorg-composing 2019-02-14 13:38:41 +01:00
Warren Buckley de189e506f Merge pull request #4568 from umbraco/temp8-4408-ability-to-add-trees-dynamically
Adds the ability to add tree definitions dynamically on startup
2019-02-14 12:20:06 +00:00
Warren Buckley 29ca926c50 Merge pull request #4574 from umbraco/temp8-4426-fix-for-js-console-error-in-rollback
Added track by $index for `Repeatable Textstrings`
2019-02-14 12:16:58 +00:00
Kenn Jacobsen 684bacb937 V8: Handle element types in the content editor (#4193)
* Don't allow preview for element types

* Don't show the "save and publish" button group for element types + apply primary button state to the "save" button

* Hide templates and URLs for element types

* Fix null error

* Use same notation for negation
2019-02-14 13:13:19 +01:00
matthew-hair 6665695986 Added null check for context.Identity
Signed-off-by: matthew-hair <matthew.hair@sedgwick.gov>
2019-02-14 12:55:56 +01:00
Warren Buckley a643f6d1f0 Merge pull request #4551 from umbraco/temp8-ui-umb-tree-grey-out-icon-when-not-published-or-allowed
grey out icons in umb-tree when not published or allowed
2019-02-14 11:54:01 +00:00
Stephan aef9cb807d Import missing files 2019-02-14 12:51:46 +01:00
Stephan fa9dae93b9 Merge branch 'temp8' into temp8-no-restart 2019-02-14 12:47:12 +01:00
Kenn Jacobsen 7b03bc20cc Support localization of template and content type names in the content mapper 2019-02-14 12:46:27 +01:00
Bjarke Berg 1770a0abec Inject IUmbracoContextAccessor instead of UmbracoContext 2019-02-14 12:40:45 +01:00
Kenn Jacobsen 494bdfef1e Allow invariant languages to be resolved by specific cultures 2019-02-14 12:37:03 +01:00
Kenn Jacobsen 0ac196bec6 Add some missing localization for content info 2019-02-14 12:29:06 +01:00
Stephan d933724e39 Cleanup, document 2019-02-14 12:26:50 +01:00
Stephan 186e8fc58b Introduce IUmbracoContextFactory 2019-02-14 12:11:06 +01:00
Claus 30386cc96e adding some translations. 2019-02-14 11:32:23 +01:00
Claus 1bed04f384 Merge branch 'nathanwoulfe-temp8-4548' into temp8 2019-02-14 10:52:41 +01:00
Stephan e5142e4915 Make IPublishedSnapshot IDisposable 2019-02-14 10:50:08 +01:00
Claus 866fdadbe2 Merge branch 'temp8-4548' of https://github.com/nathanwoulfe/Umbraco-CMS into nathanwoulfe-temp8-4548 2019-02-14 10:49:48 +01:00
Claus 7edd338dd0 Merge branch 'kjac-v8-fix-localize-content-apps' into temp8 2019-02-14 10:44:32 +01:00
Stephan abceda7750 Kill UmbracoContext.Current 2019-02-14 10:39:49 +01:00
Stephan 969c2aa184 Bugfix component collection 2019-02-14 10:39:27 +01:00
Claus a37512ffb4 Merge branch 'v8-fix-localize-content-apps' of https://github.com/kjac/Umbraco-CMS into kjac-v8-fix-localize-content-apps 2019-02-14 10:35:52 +01:00
Kenn Jacobsen 7045eb196c Use InvariantContains instead of Contains when looking for culture in the querystring 2019-02-14 10:14:56 +01:00
Kenn Jacobsen 825d8421ed Don't use a hardcoded /umbraco path 2019-02-14 10:12:59 +01:00
Claus 466642af26 Merge pull request #4565 from kjac/v8-fix-remove-console-log
V8: Remove leftover console.log from #4469
2019-02-14 09:39:56 +01:00
Bjarke Berg 71f128d796 #4426 - Added track by $index for Repeatable Textstrings 2019-02-14 09:39:42 +01:00
Kenn Jacobsen 2927ff0af7 Merge branch 'temp8' into v8-fix-use-client-culture 2019-02-14 09:36:54 +01:00
Claus e098b9c184 removing using statements. 2019-02-14 09:28:15 +01:00
Stephan 7660e9fb25 Reorganize composition code 2019-02-14 09:15:47 +01:00
Stephan fe9b964ffe Cleanup IPublishedCache.GetByContentType 2019-02-14 08:54:00 +01:00
Stephan 01b82ee4e8 Bugfix HttpRequestAppCache locking 2019-02-14 08:48:20 +01:00
Bjarke Berg 026094c1b9 Merge pull request #4558 from umbraco/temp8-implement-GetByContentType-nucache
v8 - the GetByContentType methods for the content cache were not implemented
2019-02-14 08:36:24 +01:00
Shannon 2c34979ee8 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-14 18:25:07 +11:00
Shannon 65ce753925 Fixes issue with loading in the correct view for package options 2019-02-14 18:24:52 +11:00
Stephan 94cb6cb668 Bugfix NuCache #4547 2019-02-14 08:05:50 +01:00
Shannon d1624fab2d Merge branch 'temp8' into temp8-implement-GetByContentType-nucache 2019-02-14 16:51:07 +11:00
Shannon 64df1d040f Fixes how tests are run, fixes up the content picker, removes unecessary tests 2019-02-14 15:09:28 +11:00
Shannon Deminick 7e9d8e5de8 Merge pull request #4534 from aaronpowell/temp8-3935-clientdependency
Removing ClientDependency setup for non-web runtimes
2019-02-14 14:04:27 +11:00
Aaron Powell c50daf87a5 Moving to using IOHelper.IsHosted 2019-02-14 13:44:24 +11:00
Shannon 5e38cadacc publishes js test results to xml so that Azure DevOps can read the results, re-enables js test building, fixes an issue with one of the tests 2019-02-14 12:30:36 +11:00
Shannon f814a80ab7 Fixes the ContentSaveValidationAttribute since it was capturing a request based object in it's ctor when it's a singleton, moves the OnlyLocalRequestsAttribute to the correct namespace, WebSecurity shouldn't be IDisposable 2019-02-14 11:37:27 +11:00
Shannon 6644fc790a dont null check tree title 2019-02-14 11:15:43 +11:00
Shannon fd5a2f355b Also exposes the SearchableTreeCollectionBuilder since that's required to be able to replace the ISearchableTree implementations 2019-02-14 11:08:39 +11:00
Shannon f385e1d01d fixes #4408 2019-02-14 11:01:34 +11:00
Shannon Deminick 9a264a120b Merge pull request #4552 from umbraco/temp8-ui-datepicker-style
UI datepicker style updated
2019-02-14 10:28:08 +11:00
Shannon 286730c65e Merge remote-tracking branch 'origin/temp8' into temp8-ui-datepicker-style 2019-02-14 10:25:14 +11:00
Shannon Deminick 6d372fa609 Merge pull request #4556 from umbraco/temp8-4308-styling-of-doc-type-editor
Dimmed overlay on property preview + removed background from "add pro…
2019-02-14 10:23:03 +11:00
Shannon 672f57de5e Merge branch 'temp8' into temp8-4308-styling-of-doc-type-editor 2019-02-14 10:19:57 +11:00
Shannon Deminick e0fa99ee56 Merge pull request #4561 from umbraco/temp8-4451-default-ordering-of-tinymce-toolbar
Changed the default ordering of toolbar in tinymce
2019-02-14 09:55:12 +11:00
Shannon c62ce2ab4b Merge remote-tracking branch 'origin/temp8' into temp8-implement-GetByContentType-nucache 2019-02-14 09:52:09 +11:00
Kenn Jacobsen 30434eacea Remove leftover console.log from #4469 2019-02-13 18:47:29 +01:00
Robert b3a0cd4dd6 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-13 17:24:21 +01:00
Robert 3e0f3bc782 Fixing some tests up by adding the missing _dataTypeService.Setup. 2019-02-13 17:24:02 +01:00
Kenn Jacobsen 9003314d56 Make sure the sticky sub header do not clash with the actions menu (#4503) 2019-02-13 16:43:13 +01:00
Niels Lyngsø 2001487c1e Dont show back button in infinity mode 2019-02-13 16:16:41 +01:00
Stephan d7c8112a7a Merge branch 'temp8' into temp8-no-restart 2019-02-13 16:12:48 +01:00
Warren Buckley df41813ce2 Update the help drawer/sidebar to work with custom dashboards section targeting user-help. Starterkit is the only thing that seems to use this 2019-02-13 15:12:25 +00:00
Bjarke Berg 2b0cfdb143 #4451 - Changed the default ordering of toolbar in tinymce, to be the same as the ordering in config 2019-02-13 15:33:48 +01:00
Niels Lyngsø 95f154cc59 open item in list view as infinity editors 2019-02-13 14:58:48 +01:00
Warren Buckley 375fc62414 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-13 13:45:26 +00:00
Warren Buckley 0a7a42383d Fixed up build output of nupkg & package ZIP containing the Release config files for serilog 2019-02-13 13:44:26 +00:00
Bjarke Berg fa1c360000 Merge pull request #4553 from umbraco/temp8-post-migrations
Refactor post-migrations
2019-02-13 14:23:39 +01:00
Shannon 3ffeb751b9 Implements GetByContentType in nucache 2019-02-14 00:17:33 +11:00
Shannon Deminick 412c9ffa6e Merge pull request #4484 from umbraco/temp8-sk-installer
V8 Installer Steps for starter kit re-enabled
2019-02-13 23:56:21 +11:00
Shannon b5da6c876b makes sure the package file is removed after install 2019-02-13 23:55:05 +11:00
Robert c318bc55dc Merge pull request #4554 from umbraco/temp8-4542-bugfix-for-edit-property-type
Get the editor from the new dataType instead of the old propertyEditor
2019-02-13 13:50:55 +01:00
Warren Buckley 7aebfce579 Update gitignore to exclude serilog config files 2019-02-13 12:43:26 +00:00
Stephan a9c2ec76f7 Merge remote-tracking branch 'origin/temp8' into temp8-post-migrations 2019-02-13 13:32:09 +01:00
Stephan 0c475aa174 Merge branch 'temp8-post-migrations' of https://github.com/umbraco/Umbraco-CMS into temp8-post-migrations 2019-02-13 13:31:19 +01:00
Stephan d16bcdc841 Bugfix NuCache reload during upgrades 2019-02-13 13:30:13 +01:00
Stephan f2472c321d Use ChangesMonitor to prevent unwanted restarts during install/upgrade 2019-02-13 13:29:27 +01:00
Warren Buckley 3415332504 Remove serilog config files from repo the build in Web.UI CSProj will create them from the Release versions like ClientDependancy does 2019-02-13 12:28:01 +00:00
Warren Buckley 0a4502af60 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-13 12:03:56 +00:00
Warren Buckley 0176e2f2e0 Adds in some .Release.config files for Serilog config files - so the build script in the CSProj will reset the config files back 2019-02-13 12:03:46 +00:00
Robert ac44823ebb Merge pull request #4540 from umbraco/temp8-4440-get-children-for-single-culture-when-only-one-culture-exists
Fix for vary by culture when only one culture exists
2019-02-13 12:35:56 +01:00
Stephan 4443465e74 Merge branch 'temp8' into temp8-post-migrations 2019-02-13 12:04:15 +01:00
Stephan b5a90bf26a Fix SqlServer detection 2019-02-13 12:02:53 +01:00
Bjarke Berg 3e9113f1ef Clean up 2019-02-13 11:39:09 +01:00
Niels Lyngsø ff8f9083ec Dimmed overlay on property preview + removed background from "add property group" + adjust sizes for umb-panel-header and added hovers. 2019-02-13 11:37:09 +01:00
Robert 5d5e411219 Merge pull request #4539 from umbraco/temp8-default-logging
V8 - Default logging set to JSON
2019-02-13 11:23:04 +01:00
Bjarke Berg d0c4e44e9e Rebuild cache after migration 2019-02-13 11:02:07 +01:00
Bjarke Berg 1b6fd92087 #4542 - Get the editor from the new dataType instead of the old propertyEditory 2019-02-13 10:49:32 +01:00
Stephan 3c9770c6b6 Refactor post-migrations 2019-02-13 10:14:01 +01:00
Stephan 169e93ed81 Refactor post-migrations 2019-02-13 09:53:17 +01:00
Claus 4a17702849 Merge pull request #4389 from kjac/v8-fix-repeatable-string-styling
V8: Repeatable string hover + move handle styling
2019-02-13 09:39:24 +01:00
Warren Buckley c6da0f3b96 Merge pull request #4543 from umbraco/temp8-ui-clear-distinguish-property-groups
Temp8 ui clear distinguish property groups
2019-02-13 08:30:33 +00:00
Niels Lyngsø cc50a7a3ba grey out icons in umb-tree when not published or allowed 2019-02-13 09:27:24 +01:00
Bjarke Berg e19cd5f49f Merge pull request #4459 from kjac/v8-fix-rte-code-editor-width
V8: Don't open the RTE code editor in "small" sized overlay
2019-02-13 08:12:57 +01:00
Kenn Jacobsen 730a2f7768 Localize content app names 2019-02-13 08:11:01 +01:00
Nathan Woulfe 3c2b2e2963 fix height of editor sub-nav to prevent vertical overflow of borders 2019-02-13 17:10:43 +10:00
Bjarke Berg 7b36e89bd3 Merge pull request #4457 from kjac/v8-fix-remove-obsolete-translations
V8: Remove weird and unused translations
2019-02-13 07:35:45 +01:00
Nathan Woulfe 7aac3dc1bf notifications are full-width on all screen sizes 2019-02-13 16:33:02 +10:00
Shannon 775ea0de3c Merge branch 'temp8' into temp8-sk-installer 2019-02-13 17:15:30 +11:00
Nathan Woulfe 1f7092e2a8 Merge pull request #2 from umbraco/temp8
Temp8
2019-02-13 15:56:36 +10:00
Shannon ee4c751423 fix typo 2019-02-13 15:30:39 +11:00
Niels Lyngsø f016d04c1f V8 UI - umb-sticky-bar corrected width and height set by JS. 2019-02-12 16:52:52 +01:00
Warren Buckley 44929e5512 Remove InstallPackageFiles function as it was installing the package XML & NOT the files 2019-02-12 15:46:57 +00:00
Warren Buckley d7d37e3d63 Revert "Need to install the physical files from the package that was missing in this installer flow"
This reverts commit 00082a87fa.
2019-02-12 15:28:58 +00:00
Warren Buckley 00082a87fa Need to install the physical files from the package that was missing in this installer flow 2019-02-12 14:22:26 +00:00
Warren Buckley 47aec9768c Set the packagepath when saving the SK file - as need to know the location when we fetch it in next install step 2019-02-12 14:11:47 +00:00
Bjarke Berg 1def9014cd Reload templates when creating a doc type with template 2019-02-12 15:11:07 +01:00
Niels Lyngsø 385a86b3b3 V8: UI datepicker style update 2019-02-12 14:52:21 +01:00
Niels Lyngsø 7d589eb607 V8: datepicker style matching the light interface of v8 2019-02-12 14:39:12 +01:00
Niels Lyngsø 7b5ff7b2eb distinguish property groups from properties 2019-02-12 14:37:12 +01:00
Warren Buckley 22918b40bf Merge branch 'temp8' into temp8-sk-installer 2019-02-12 13:35:01 +00:00
Warren Buckley 06a8569570 Merge pull request #4535 from umbraco/temp8-4490-tours
Updated the tours to match v8
2019-02-12 13:32:09 +00:00
Stephan e6b77cf307 Merge origin/temp8 into temp8 2019-02-12 13:42:27 +01:00
Stephan 88e11396b4 Merge branch 'temp8-drop-xml-tables' into temp8 2019-02-12 13:39:55 +01:00
Warren Buckley 2ca5c1d94a Removed extra lines to make Claus happy :) 2019-02-12 12:28:12 +00:00
Bjarke Berg 0cfe1b8348 Merge pull request #4504 from kjac/v8-fix-media-picker-always-show-folder-names
V8: Always show folder names in the media picker
2019-02-12 12:51:08 +01:00
Claus ca39531f45 Merge pull request #4533 from umbraco/temp8-4477-radiobutton-must-store-text-value
WIP v8 radio buttons and check box list need to store strings, not INT
2019-02-12 12:45:04 +01:00
Bjarke Berg cdef97efba Merge pull request #4514 from umbraco/temp8-4430-grid-settings-to-use-editorservice
#4430 change grid-editor settings to use editorService
2019-02-12 12:39:13 +01:00
Bjarke Berg 786c9ff3cc form horizontal 2019-02-12 12:38:43 +01:00
Bjarke Berg 3820457536 Merge remote-tracking branch 'origin/temp8' into temp8-4430-grid-settings-to-use-editorservice 2019-02-12 12:30:41 +01:00
Robert 7cd600e58a Merge pull request #4532 from umbraco/temp8-remove-list-view-settings-3199
removes/renames list view settings that don't make sense for v8
2019-02-12 12:27:09 +01:00
Warren Buckley f7c37fecdc Merge pull request #4520 from umbraco/temp8-4476-selection-colors-for-users
V8: corrected selection colors for users, fixes #4476
2019-02-12 11:16:47 +00:00
Bjarke Berg 1677442fad #4440 - If we only have one culture, we sets that's culture when requesting children. Fixes issue where a document type is varing by culture, but we don't show the mculture picker. 2019-02-12 11:58:38 +01:00
Niels Lyngsø ddc88af809 Merge branch 'temp8-4476-selection-colors-for-users' of https://github.com/umbraco/Umbraco-CMS into temp8-4476-selection-colors-for-users 2019-02-12 11:58:19 +01:00
Warren Buckley 4a1c36c8d0 Update src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js 2019-02-12 10:57:47 +00:00
Niels Lyngsø 20dc1b5c10 Corrected colors for buttons + disable select-image button in media-picker if nothing is selected 2019-02-12 11:57:43 +01:00
Warren Buckley 810d8fa87a Update src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js 2019-02-12 10:57:39 +00:00
Stephan 11f4e2429a Merge branch 'temp8' into temp8-drop-xml-tables 2019-02-12 11:43:06 +01:00
Bjarke Berg 7b84c755b3 #4477 - Fixed tests 2019-02-12 11:20:10 +01:00
Bjarke Berg bb27a3f42e #4477 - Migration of radio button, checkbox and dropdown to align underlying data structures 2019-02-12 10:36:36 +01:00
Warren Buckley 6593b704d5 Moves the JSON & TXT logging out of the C# setup of the Serilog logger pipeline into the appsetting XML config file - however its not possible to then have both enabled together anymore 2019-02-12 08:59:12 +00:00
Bjarke Berg f4db356511 WIP - Handle migration of Checkbox list data 2019-02-12 08:58:49 +01:00
Bjarke Berg f5d31a4c5a Merge remote-tracking branch 'origin/temp8' into temp8-4477-radiobutton-must-store-text-value 2019-02-12 08:23:38 +01:00
Bjarke Berg fd01f4e7c6 Merge remote-tracking branch 'origin/temp8-4477-radiobutton-must-store-text-value' into temp8-4477-radiobutton-must-store-text-value
# Conflicts:
#	src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs
#	src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RadioButtonAndCheckboxPropertyEditorsMigration.cs
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.controller.js
2019-02-12 08:17:38 +01:00
Bjarke Berg 724eca7575 #4490 - Fixed the TextArea configuration, to match the text in the tour 2019-02-12 08:10:18 +01:00
Bjarke Berg 3f314fe5be #4490 Updated the tour to match v8 2019-02-12 08:09:42 +01:00
Bjarke Berg 7f7afef976 Merge pull request #4522 from umbraco/temp8-Forms-section-reintrodution
Reintroduced the forms section
2019-02-12 07:36:11 +01:00
Shannon c4eb76faad Updates the checkbox html editor to store the string values, not int ids, renames the underlying confg editor and updates comments, updates the migration and we'll need to migrate the checkbox data too. 2019-02-12 15:02:27 +11:00
Shannon ed2743d570 Merge branch 'temp8' into temp8-4477-radiobutton-must-store-text-value
# Conflicts:
#	src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs
2019-02-12 14:59:59 +11:00
Aaron Powell 88a2878cf2 Removing ClientDependency setup for non-web runtimes 2019-02-12 14:48:49 +11:00
Shannon 118e31d647 removes/renames list view settings that don't make sense for v8 2019-02-12 14:03:22 +11:00
Shannon 54aa1924c0 ok, properly fixes dirty tracking on the tags editor 2019-02-12 13:55:50 +11:00
Shannon c00f805ea2 Fixes dirty tracking on tags editor when it's csv format 2019-02-12 13:36:32 +11:00
Shannon 1a1222905b reverts the formsInstaller alias, fixes the ApplicationTreeController to allow full screen sections without trees, removes the forms tree controller 2019-02-12 12:22:36 +11:00
Shannon 77d70c7e7f Fixes test 2019-02-12 11:43:34 +11:00
Shannon 3d729eb2c3 updates umb plan 2019-02-12 10:54:18 +11:00
Shannon 978f59ffe8 Removes the xml cache tables - we don't use them apart from in unit tests 2019-02-12 10:53:30 +11:00
Shannon Deminick f71fe3f78d Merge pull request #4511 from umbraco/temp8-4466-bugfix-for-creating-macros-from-partial-views
Sets the MacroType when created from Partial View Macro Files
2019-02-12 10:17:49 +11:00
Robert 21d1b7c599 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-11 22:13:30 +01:00
Robert b5bd138bf7 Taking composite PropertyType's into consideration when creating content from xml (PackageInstallation) 2019-02-11 22:13:04 +01:00
Shannon 59f437ebf8 update to latest examine 2019-02-12 02:03:21 +11:00
Shannon d8574248fc Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-12 01:58:56 +11:00
Shannon 0d963d3c4d Fixing package installation for content templates 2019-02-12 01:58:42 +11:00
Bjarke Berg 5fb4e40c3b Merge remote-tracking branch 'origin/temp8-Forms-section-reintrodution' into temp8-Forms-section-reintrodution 2019-02-11 15:32:46 +01:00
Bjarke Berg 60ca85fe25 Introduced the forms section in the sections menu. 2019-02-11 15:32:24 +01:00
Bjarke Berg 944c8d59d7 Need to clone the object before removing $-prefixed variables. Otherwise we are modifying the same data as the views are using 2019-02-11 15:30:11 +01:00
Niels Lyngsø e4a492dc57 Disable button dont hide them + dont select current user 2019-02-11 14:30:01 +01:00
Stephan 154b59c84b Fix redirect tracking 2019-02-11 14:11:13 +01:00
Niels Lyngsø a77b0fc51f Merge remote-tracking branch 'origin/temp8' into temp8-4476-selection-colors-for-users 2019-02-11 13:46:25 +01:00
Kenn Jacobsen 64f41541fe Fix the tree item state annotations (#4497) 2019-02-11 13:33:52 +01:00
Bjarne Fyrstenborg a6fc9f4ede v8: Fix users layout switcher (#4458)
* Localize edit link, remove duplicate class attributes and only make remove link red

* Revert "Localize edit link, remove duplicate class attributes and only make remove link red"

This reverts commit 63cc250c0f929b1f7e6f9f05fae2fd302682d418.

* Use built-in $id function for tracky by since users doesn't have name property

* Set active layout to card layout

* Update onLayoutSelect

* Format document
2019-02-11 13:27:50 +01:00
Niels Lyngsø 5342e65f7c V8: update selection colors for users section 2019-02-11 12:46:23 +01:00
Stephan 0bdd1131bb Add missing file 2019-02-11 11:57:36 +01:00
Bjarke Berg 18c8911164 Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-11 11:55:09 +01:00
Bjarke Berg e08a7c3ea8 Need to clone the object before removing $-prefixed variables. Otherwise we are modifying the same data as the views are using 2019-02-11 11:54:51 +01:00
Stephan a892ae1567 Add missing index on UserLogin table (prevents deadlocks) 2019-02-11 11:36:13 +01:00
Bjarke Berg 14f878b690 #4477 - Align Dropdown, checkbox list and radio button list 2019-02-11 10:36:54 +01:00
Niels Lyngsø 153b665d0a #4430 change grid-editor settings to use editorService 2019-02-11 09:39:54 +01:00
Bjarke Berg e62de9561b #4466 - Sets the MacroType when created from Partial View Macro Files snippets 2019-02-11 07:54:39 +01:00
Shannon e35436225f Fixes JS with the content picker 2019-02-11 15:47:13 +11:00
Shannon dd54b0324c fixes up some comments 2019-02-11 14:13:44 +11:00
Kenn Jacobsen 6fdada69eb Always show folder names in the media picker 2019-02-10 18:55:16 +01:00
Stephan 99887cb362 Bugfix IdkMap 2019-02-10 11:25:46 +01:00
Kenn Jacobsen c75ac83c98 Show missing translations as "(name)", not "((name))" 2019-02-09 18:42:55 +01:00
Kenn Jacobsen 0c860e999b Reimplement after merge 2019-02-09 18:26:03 +01:00
Kenn Jacobsen 3587a774f3 Merge with temp8 2019-02-09 18:03:53 +01:00
Kenn Jacobsen 462a6168b3 Don't show the language selector in content pickers (use the current client culture) 2019-02-09 17:56:13 +01:00
Kenn Jacobsen cb33442e7c Tidy up a bit 2019-02-09 17:50:29 +01:00
Kenn Jacobsen 0dd5ba61ab Clean up unused culture attribute 2019-02-09 17:48:45 +01:00
Kenn Jacobsen 89a701c865 Initial PoC 2019-02-09 15:41:30 +01:00
Bjarke Berg 4f53cfc855 #4477 - Added fixme for cache rebuild 2019-02-08 14:18:24 +01:00
Stephan b177607d47 Suspend JS tests - can we build? 2019-02-08 14:14:30 +01:00
Warren Buckley f549522573 Merge pull request #4469 from umbraco/temp8-ui-umb-editor-navigation-content-apps-dropdown
#4359 + #4360 umb editor navigation content apps anchor-dropdown
2019-02-08 13:04:40 +00:00
Warren Buckley 521fc227ba TYPO - Update src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js 2019-02-08 13:04:30 +00:00
Niels Lyngsø 612a63b6bb fix if scrollTween not defined issue 2019-02-08 13:30:20 +01:00
Niels Lyngsø 1860a175d1 remove eventlisteners on destroy 2019-02-08 13:06:56 +01:00
Stephan b5c803b5ed Cleanup TreeEntityPath 2019-02-08 12:42:46 +01:00
Warren Buckley 393b8f08c8 Adds the plumbing back for when the new V8 compat SK is on our.umb 2019-02-08 11:09:09 +00:00
Stephan 8f39cd605a Fix MacroMapperProfile 2019-02-08 11:47:42 +01:00
Warren Buckley 9eaa0361be Merge pull request #4437 from umbraco/temp8-4302-bugfix-for-media-validation
Bugfixes for media validation
2019-02-08 09:50:26 +00:00
Bjarke Berg 354c45e0e2 #4477 - also refresh cache after migration 2019-02-08 10:32:21 +01:00
Stephan 67e90ca21b Cleanup configuration editors 2019-02-08 09:56:24 +01:00
Bjarke Berg 065cc69f51 #4477 - Changed the saved value from the radio button list to the text value. + Migration of old values 2019-02-08 09:45:36 +01:00
Niels Lyngsø 14db9da57c removed proposal comment 2019-02-08 09:45:33 +01:00
Niels Lyngsø e5a27a2108 removed misleading documentation 2019-02-08 09:39:01 +01:00
Stephan 88b0dccfa1 Fix TreeEntityPath 2019-02-08 09:02:27 +01:00
Shannon 73ce546f0c ensures idType in JS is always udi by default instead of int 2019-02-08 16:12:30 +11:00
Shannon 964447d546 fixes up the web.config view file with the right mvc version 2019-02-08 16:08:29 +11:00
Shannon 40097c441a Ensure the same logic for property editors is executed for parameter editors to get the final configuration object 2019-02-08 16:07:03 +11:00
Shannon 63b3c06b3a Ensures the correct DefaultConfiguration values are specified for any editor that is actively overriding ToValueEditor and setting these values there 2019-02-08 16:00:59 +11:00
Shannon ccaaa9ab93 Ensures everything doesn't explode if a non-found property editor alias exists in the db 2019-02-08 16:00:02 +11:00
Shannon b08218240c updates package json ... lets see how the build server does with the new build 2019-02-08 10:26:21 +11:00
Shannon e67bbdc25f Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-08 10:09:39 +11:00
Kenn Jacobsen 2ab3889b23 Don't retain cculture when navigating away from the current content 2019-02-07 18:15:21 +01:00
Warren Buckley d9ac1868e6 Merge pull request #4465 from umbraco/temp8-fix-for-non-root-start-node-for-media
V8: Bugfix for loading paths Ids into TreeEntityPath
2019-02-07 15:25:42 +00:00
Robert a9b7c649ae Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-07 15:44:42 +01:00
Robert 1095948c27 Sets prop's prefixed with "$" to undefined. 2019-02-07 15:44:17 +01:00
Warren Buckley 7bd0a8edc2 Merge pull request #4429 from umbraco/temp8-4398
#4398 - Added validation to the grid editor, such that columns must b…
2019-02-07 14:38:59 +00:00
Niels Lyngsø 5c8fad330e motion added for umb-editor-navigation-item anchor-dropdown 2019-02-07 15:10:31 +01:00
Warren Buckley 4a2b6116f2 Merge pull request #4418 from kjac/v8-feature-allow-all-at-root
V8: Allow all content types at root if none are explicitly allowed
2019-02-07 13:47:33 +00:00
Warren Buckley 2c0fc737a7 Merge pull request #4421 from umbraco/temp8-4405-reload-history-on-rollback
#4405 - Load history on init if the active tab is info
2019-02-07 13:29:52 +00:00
Stephan df53b93ae0 Fix nuspec 2019-02-07 13:59:43 +01:00
Niels Lyngsø 0b19eab5a9 umb-group-panel for umbtabbedcontent 2019-02-07 13:59:20 +01:00
Claus 7c3b5d1086 Merge remote-tracking branch 'origin/temp8-update-deps' into temp8 2019-02-07 13:40:17 +01:00
Niels Lyngsø 42803ff006 V8: umb-editor-navigation anchor-dropdown refined, remembers last active anchor, 2019-02-07 13:26:23 +01:00
Stephan dbd6e0adbb Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-07 13:10:26 +01:00
Stephan c607c7e259 Merge branch 'temp8-contentAndType' into temp8 2019-02-07 13:09:56 +01:00
Stephan 29334ed2d5 Fix ModelsBuilder changes 2019-02-07 12:57:10 +01:00
Stephan 990e82d183 Upgrade ModelsBuilder, cleanup dashboard 2019-02-07 12:37:52 +01:00
Stephan 2092156db3 Cleanup 2019-02-07 12:27:19 +01:00
Bjarke Berg f7ee8c0899 Merge pull request #4411 from kjac/v8-fix-redirect-tracking-composer
V8: Fix the redirect tracking composer
2019-02-07 11:09:22 +01:00
Stephan a9adc4eee5 Merge branch 'temp8' into temp8-contentAndType 2019-02-07 10:10:55 +01:00
Stephan c59ff8d995 Merge branch 'temp8-fix-default-userid-param' into temp8 2019-02-07 10:02:13 +01:00
Stephan 4a8e5935c2 Merge branch 'temp8' into temp8-fix-default-userid-param 2019-02-07 10:01:15 +01:00
Stephan 8ed2dcb8bf Don't capture content caches! 2019-02-07 09:59:16 +01:00
Bjarke Berg fc6548d87b Fix issue where Id was not set when loading all entity paths 2019-02-07 09:56:14 +01:00
Warren Buckley 5944ea20cc Merge remote-tracking branch 'origin/temp8' into temp8-fix-default-userid-param
# Conflicts:
#	src/Umbraco.Core/Services/IContentService.cs
#	src/Umbraco.Core/Services/Implement/ContentService.cs
2019-02-07 08:24:03 +00:00
Niels Lyngsø fb070928f7 V8: umb-editor-navigation-anchor-dropdown first version 2019-02-07 08:57:20 +01:00
Stephan 8329097974 Review PR, adjustments 2019-02-07 08:53:49 +01:00
Stephan d15f20f560 Merge branch 'temp8' into temp8-contentAndType 2019-02-07 08:40:46 +01:00
Bjarke Berg 87c85341fb Merge remote-tracking branch 'origin/temp8' into temp8 2019-02-07 08:20:02 +01:00
Bjarke Berg f6da7e4444 JS error, handle user dialog in the same way as help dialog. Don't close on change of section. Before was a js error with missing method 2019-02-07 08:19:44 +01:00
Stephan d11fd67a09 Bugfix PublishedContentTypeFactory 2019-02-07 08:04:53 +01:00
Shannon 977250dcdd tests as part of build 2019-02-07 17:15:49 +11:00
Shannon 1703c918d9 test pass now 2019-02-07 17:06:50 +11:00
Shannon d76f7db700 fixes the runTest build so that it properly builds the babel js and fixes one of the tests 2019-02-07 16:59:25 +11:00
Shannon 261ddfbcd6 Gets unit tests running again and added a task runTests 2019-02-07 16:22:29 +11:00
Shannon 86b31c2782 fixes test.js to point to the correct karma config 2019-02-07 15:41:20 +11:00
Shannon Deminick cb309e7f9e Merge pull request #4432 from kjac/v8-fix-rename-umbraco-domains-table
V8: Rename umbracoDomains table to umbracoDomain (singular)
2019-02-07 15:28:37 +11:00
Shannon ed5023e431 Adds some null checks to Examine's value set builders in case some of the data is strangely incorrect 2019-02-07 15:13:45 +11:00
Shannon fcec180dc4 Ship with correct skipIIsCustomeerrors setting 2019-02-07 14:54:22 +11:00
Shannon a9045c254e Removes the need to do any lookup for GetNonGroupedProperties, we already know if they belong to a non-group based on the ID 2019-02-07 14:01:00 +11:00
Shannon 03eaf3aa3d So yup ISimpleContentType needs the IUmbracoEntity, so we'll explicitly implement essentially hiding the implementation from the API unless it's explicitly cast 2019-02-07 13:29:01 +11:00
Shannon 3b12e0b72a Updates ContentBase to track the original PropertyType's which means we don't ever need to look them up again, adds notes about this too since it seems it is probably unnecessary to begin with. 2019-02-07 13:28:23 +11:00
Shannon 123daed990 Removes the need for .Current in some places, adds TODO notes to test a theory, removes IUmbracoEntity from ISimpleContentType since all tests seem to pass without it and because the SimpleContentTypeMapper doesn't actually use ISimpleContentType i don't think it's needed, we'll see what the tests say. 2019-02-07 12:43:11 +11:00
Shannon 9df0f384af Removes the need for another .Current and a lookup, simplifies the whole GetUrl for media 2019-02-07 12:02:47 +11:00
Shannon 562855a687 removes fixme, adds comments and null checks 2019-02-07 11:53:43 +11:00
Shannon 030b626350 Removes the need for a .Current, removes an unused method 2019-02-07 11:49:30 +11:00
Shannon 78849bb7ff removes unused methods and internalizes methods we can't expose yet 2019-02-07 11:42:16 +11:00
Shannon c04da30547 Merge branch 'temp8' into temp8-contentAndType
# Conflicts:
#	src/Umbraco.Core/Models/Content.cs
#	src/Umbraco.Core/Models/ContentBase.cs
#	src/Umbraco.Tests/Models/ContentTests.cs
2019-02-07 11:41:06 +11:00
Shannon Deminick 0606d1bc8b Merge pull request #4341 from umbraco/temp8-3640
Support culture in content Saving and Publishing events
2019-02-07 11:26:45 +11:00
Shannon 4655acfdeb Fixes ambiguous call 2019-02-07 11:26:09 +11:00
Kenn Jacobsen 68f34d5643 Don't open the RTE code editor in "small" sized overlay 2019-02-06 22:09:22 +01:00
Kenn Jacobsen 8d305b2c6a Remove weird and unused translations 2019-02-06 19:45:07 +01:00
Stephan 37c130194f Merge branch 'temp8' into temp8-3640 2019-02-06 16:31:04 +01:00
Stephan 162e691828 Bugfix PublishedContentTypeFactory 2019-02-06 16:26:32 +01:00
Warren Buckley 51ad0f75d1 Fix up unit test but also uses constant for -1 as the parent id aka System Root Node Id 2019-02-06 15:16:11 +00:00
Warren Buckley de5b32749e Merge branch 'temp8' into temp8-fix-default-userid-param 2019-02-06 14:56:52 +00:00
Stephan 19d8796c40 Merge branch 'temp8' into temp8-3640 2019-02-06 15:07:49 +01:00
Stephan 0be5ff64bc Be friendly 2019-02-06 15:05:56 +01:00
Warren Buckley 8b4315cd46 🦸🦸 Is it a bird, is it a plane, no it's SuperUser 🦸🦸 2019-02-06 14:01:14 +00:00
Stephan 48e11ab439 Fix 8.0 migration 2019-02-06 14:53:49 +01:00
Shannon f98727e08d fixing tests 2019-02-07 00:15:47 +11:00
Stephan 7863cd3ab7 Refactor OrderedCollectionBuilderBase AppendAfter to InsertAfter 2019-02-06 14:11:33 +01:00
Shannon 34c65a94bf dont allocate an empty object if the collection is empty 2019-02-07 00:07:43 +11:00
Shannon e2c86a96fe Ensures change collections are cleared on clone 2019-02-07 00:05:25 +11:00
Shannon b95b02d0c0 ensure the culture is bumped if a property of that culture is modified, fixes up the AdjustDates method and tests 2019-02-06 23:51:12 +11:00
Shannon bcfbab2add fixing tests 2019-02-06 23:12:01 +11:00
Stephan b260c18056 Refactor IContent vs IContentType 2019-02-06 13:06:31 +01:00
Shannon 5b33416b7b adds fixme notes 2019-02-06 23:02:28 +11:00
Shannon 5b3f21c541 fixes tests 2019-02-06 22:12:00 +11:00
Shannon 3f8efed392 updates nuspecs to have the correct target framework 2019-02-06 21:55:59 +11:00
Shannon 68cdbf50b2 removes old unused dependency from tests 2019-02-06 21:48:33 +11:00
Shannon 47d660041e updates test proj dependencies 2019-02-06 21:47:21 +11:00
Shannon 817ce71e83 updates threading libs 2019-02-06 21:44:12 +11:00
Shannon 4c2ea81c53 updates Light Inject 2019-02-06 21:41:46 +11:00
Shannon 7c21a42804 Update serilog 2019-02-06 21:39:09 +11:00
Shannon e556e39cd1 latest HtmlAgility 2019-02-06 21:31:50 +11:00
Niels Lyngsø c813aafb38 Merge remote-tracking branch 'origin/temp8' into temp8-ui-refactoring-of-umb-editor-navigation 2019-02-06 11:26:52 +01:00
Niels Lyngsø 64d2940c3b refactoring of umb-editor-navigation 2019-02-06 11:26:39 +01:00
Bjarke Berg a4a437a746 Fixed view after UmbracoHelper ctor changes 2019-02-06 11:18:52 +01:00
Shannon 0947a1a109 Automapper upgraded 2019-02-06 21:14:50 +11:00
Shannon b4bf1cb01c puts the profiler back to the right 2019-02-06 19:58:56 +11:00
Shannon 4b9a13c3a1 Updates mini profiler 2019-02-06 19:04:52 +11:00
Niels Lyngsø 2f0d8b75df Merge remote-tracking branch 'origin/temp8' into temp8-ui-refactoring-of-umb-editor-navigation 2019-02-06 08:24:19 +01:00
Bjarke Berg 48531c6193 #4302 - Sets the default values for Media File and Image File as mandatory 2019-02-06 08:07:50 +01:00
Bjarke Berg b82dde240b #4302 - Bugfixes for media validation. 2019-02-06 08:07:04 +01:00
Shannon 5bf0b143d9 another owin update and nuspec fix 2019-02-06 17:08:47 +11:00
Shannon 33bc979cfc Fixes binding of FormDataCollection for GET requests which fixes the compatibility with the latest WebApi 5.2.7 version (cherry picked from https://github.com/umbraco/Umbraco-CMS/pull/3851), fixes a binding redirect 2019-02-06 17:03:23 +11:00
Shannon 50d1b9ddfd Latest MVC, WebApi, Owin and Signalr 2019-02-06 16:53:15 +11:00
Shannon 1bbb9c2b6e updates to latest newtonsoft 2019-02-06 16:43:04 +11:00
Shannon 3b60ffeb28 fixes test 2019-02-06 16:27:19 +11:00
Shannon 92606e7122 Fixes up dirty tracking of cultures and published cultures the same way we handle that with other entities which uses observable collection events. This simplifies the dirty tracking logic and means we dont require lookup the original object, but now we need to figure out the fixme stuff 2019-02-06 16:10:20 +11:00
Stephan 0f85c921e3 Merge pull request #4433 from umbraco/nul800sebastiaan-patch-1
Why so sad! :-)
2019-02-05 20:02:09 +01:00
Stephan f752861e10 Bugfix null timer in CoreRuntime 2019-02-05 20:01:20 +01:00
Stephan b403e9b3b7 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-05 20:00:30 +01:00
Sebastiaan Janssen eafb9a46f7 Why so sad! :-) 2019-02-05 19:59:13 +01:00
Kenn Jacobsen 1e24981576 Rename umbracoDomains table to umbracoDomain (singular) 2019-02-05 19:48:13 +01:00
Warren Buckley 4c79269081 Merge pull request #4422 from umbraco/temp8-ui-refactoring-infinity-editing-to-css-animation
V8: UI refactoring infinity editing to css animation
2019-02-05 15:49:49 +00:00
Warren Buckley a1a3267c0b Merge pull request #4366 from kjac/v8-fix-icon-picker-color-selection
V8: Doctype icon color picker selection is broken
2019-02-05 15:15:23 +00:00
Bjarke Berg 6f9be482be #4398 - Added validation to the grid editor, such that columns must be at least as large as the layouts. 2019-02-05 14:52:02 +01:00
Stephan 29f2f34f9b Refactor IContent vs IContentType 2019-02-05 14:06:48 +01:00
Stephan 6125643c3f Bump copyright year 2019-02-05 13:43:04 +01:00
Robert 9e8e62dc71 Merge pull request #4346 from kjac/v8-fix-nested-content-elements-with-culture-variance
V8: Make Nested Content resilient towards culture variance in elements
2019-02-05 12:57:51 +01:00
Stephan d2692a2ff5 NuCache respects global local temp storage 2019-02-05 12:20:13 +01:00
Stephan d3b0913047 Fix UmbracoHelper preventing upgrades 2019-02-05 12:19:57 +01:00
Bjarke Berg 4290249719 #4405 - Load history on init if the active tab is info 2019-02-05 11:55:10 +01:00
Niels Lyngsø ff497b413e V8: UI, refactoring of infinity editing to use CSS to fix issue regarding stacking of layers. 2019-02-05 11:54:23 +01:00
Robert ea95b4f454 Merge pull request #4345 from kjac/v8-fix-relation-types-editor
V8: Relation type editor crashes for root relations and is using excessive XHR
2019-02-05 10:35:25 +01:00
Robert bec61a00c9 Merge pull request #4336 from kjac/v8-fix-disappearing-thumbnails
V8: Fix disappearing thumbnails in the media grid
2019-02-05 10:05:14 +01:00
Robert 4054e0ab72 Merge pull request #4357 from kjac/v8-fix-media-picker-upload-button
V8: Media picker upload button does nothing
2019-02-05 09:54:01 +01:00
Stephan f07a2715b4 Add assembly-level composer attributes 2019-02-05 08:37:48 +01:00
Kenn Jacobsen 9579b42330 Allow copying/moving any content type to root if none are marked as "AllowAsRoot" 2019-02-05 07:54:59 +01:00
Kenn Jacobsen c9936058b5 Allow creating any content type at root if none are marked as "AllowAsRoot" 2019-02-05 07:54:42 +01:00
Shannon b65dac946f Merge branch 'temp8-IContentService-SaveAndPublish-4324' into temp8-3640
# Conflicts:
#	src/Umbraco.Core/Models/Content.cs
#	src/Umbraco.Core/Models/ContentBase.cs
#	src/Umbraco.Core/Models/IContent.cs
#	src/Umbraco.Tests/Services/ContentServiceTests.cs
2019-02-05 16:14:46 +11:00
Shannon f1b23ba0e9 Merge remote-tracking branch 'origin/temp8' into temp8-3640
# Conflicts:
#	src/Umbraco.Core/Models/Content.cs
2019-02-05 14:27:40 +11:00
Shannon 3dab68b70d adds note 2019-02-05 14:15:03 +11:00
Shannon 9f612465cf Cleans up IContent/IContentBase, no more internal methods or setters, moves manipulation used by the DocumentRepository to ext methods 2019-02-05 14:13:03 +11:00
Kenn Jacobsen b9d554908d Track redirects for invariant content under variant content 2019-02-04 21:03:45 +01:00
Kenn Jacobsen be881ba9ca Fix the redirect tracking composer 2019-02-04 20:09:17 +01:00
Warren Buckley cd566a6397 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-04 17:21:16 +00:00
Warren Buckley 0061f997e9 Fix up logviewer - search error/mesage drodpwon button to search on Goggle, GitHub, Our.Umb etc 2019-02-04 17:12:41 +00:00
Stephan 1e8b8feee8 Make ContainerControllerFactory exceptions more explicit 2019-02-04 17:59:12 +01:00
Stephan 2e5967ff9e Make TypeLoader less verbose 2019-02-04 17:58:36 +01:00
Shannon a5947356e7 Removes WasCulturePublished from IContent 2019-02-05 01:58:18 +11:00
Shannon 09255019b2 removes CommitDocumentChanges from the public interface 2019-02-05 01:22:52 +11:00
Shannon c20e597115 Merge remote-tracking branch 'origin/temp8' into temp8-IContentService-SaveAndPublish-4324 2019-02-05 01:13:43 +11:00
Stephan 3c65770008 Upgrade ModelsBuilder, cleanup 2019-02-04 14:08:35 +01:00
Stephan e636f12459 Fix leak in BackgroundTaskRunner 2019-02-04 13:39:32 +01:00
Niels Lyngsø bd4b4620d4 First part of refactoring umb-editor-navigation 2019-02-04 13:34:26 +01:00
Sebastiaan Janssen d3eb48cef9 Fixes #4388 File uploads no longer has dragover styles 2019-02-04 13:29:02 +01:00
Bjarke Berg 825b07b823 Merge pull request #4332 from umbraco/temp8-macros-dont-render-and-other-macro-bugs
v8 Macros don't render in the RTE and various
2019-02-04 13:23:46 +01:00
Bjarke Berg 2d2862517a Merge pull request #4327 from umbraco/temp8-4229-validation-from-main-variant-does-not-prevent-publishing
#4229 - If the property do not support variantions, we need to valida…
2019-02-04 13:14:14 +01:00
Bjarke Berg 327b820a25 Fixed broken test 2019-02-04 12:59:58 +01:00
Stephan 3c3b9e3946 Fixes 2019-02-04 12:55:04 +01:00
Bjarke Berg dccea19847 Merge pull request #4370 from kjac/v8-fix-default-dropdowns
V8: Fix the default dropdowns
2019-02-04 11:42:37 +01:00
Stephan 23159ce9a6 Merge branch 'temp8' into temp8-4229-validation-from-main-variant-does-not-prevent-publishing 2019-02-04 11:11:34 +01:00
Niels Lyngsø b13be6840b Merge pull request #3485 from dawoe/temp-3434
V8 - #3434 - change checkboxes on property type settings to toggle
2019-02-04 10:19:25 +01:00
Stephan dbab435f1e Merge branch 'temp8-fixes-allocations-for-property-selectors' into temp8 2019-02-04 10:09:43 +01:00
Stephan bc987a825a Cleanup 2019-02-04 10:09:32 +01:00
Stephan d6181b042b Merge branch 'temp8' into temp8-fixes-allocations-for-property-selectors 2019-02-04 09:58:55 +01:00
Shannon 80165c3c0f Fixes allocations of property selectors, with nameof we save a bunch of both memory and initial reflection lookups 2019-02-04 19:52:04 +11:00
Stephan 7fd51a298d Upgrade ModelsBuilder, following changes in Umbraco 2019-02-04 09:47:37 +01:00
Niels Lyngsø 93dbbd6bbe Merge pull request #4384 from kjac/v8-fix-actions-menu
V8: Fix the editor actions menu
2019-02-04 08:37:10 +01:00
Niels Lyngsø 72f6b2fd11 removing comments from temp8-4257-refactoring-of-infinite-editor-layers 2019-02-04 08:12:27 +01:00
Shannon b51d3036e3 Adds overload of SaveAndPublish to accept multiple cultures, renames SavePublishing to CommitDocumentChanges, removes IContent.ChangeContentType 2019-02-04 16:55:35 +11:00
Shannon 30452f0b17 Fixes rte toolbar pinning in the grid 2019-02-04 14:00:01 +11:00
Shannon 9fba7345aa When rendering macro contents, be sure to use the preview published content since the item 2019-02-04 13:48:53 +11:00
Shannon a0cda4075d Fixes issue with rendering macro content when the page doesn't exist 2019-02-04 13:42:07 +11:00
Shannon c5819ca702 Merge branch 'temp8' into temp8-macros-dont-render-and-other-macro-bugs
# Conflicts:
#	src/Umbraco.Web/Editors/EntityController.cs
#	src/Umbraco.Web/Editors/MediaController.cs
#	src/Umbraco.Web/Runtime/WebRuntimeComposer.cs
2019-02-04 12:42:07 +11:00
Shannon 9be6acf449 Oops forgot to remove the IconClosed and IconOpen TreeAttribute props 2019-02-04 12:09:04 +11:00
Kenn Jacobsen 5566afbabb Add move cursor to umb-multiple-textbox move handle 2019-02-03 22:08:40 +01:00
Kenn Jacobsen c045d4774a Add the correct hover style to umb-multiple-textbox 2019-02-03 22:08:20 +01:00
Kenn Jacobsen 6141d88407 Don't set the menu state until the action is about to be carried out. 2019-02-03 17:05:27 +01:00
Kenn Jacobsen 4b69a7859d Make sure the app menu state is set 2019-02-03 13:56:00 +01:00
Kenn Jacobsen 5d15db8468 Make sure the default dropdowns are created correctly 2019-02-02 13:42:24 +01:00
Kenn Jacobsen 6874a5486b Fix selected color 2019-02-01 20:28:27 +01:00
Kenn Jacobsen 90a282c083 Fix the icon color picker 2019-02-01 20:09:54 +01:00
Stephan c53258a7d2 Merge branch 'temp8-oembed-collection' into temp8 2019-02-01 17:57:21 +01:00
Stephan df61a76868 Cleanup PR 2019-02-01 17:52:29 +01:00
Stephan 3a0f80fc7e Merge branch 'temp8' into temp8-oembed-collection 2019-02-01 17:44:53 +01:00
Stephan add9ee73db Merge branch 'feature/IContentType-removale-from-IContent' into temp8 2019-02-01 17:42:32 +01:00
Stephan 132c3c0c8e Cleanup PR, document and rename things 2019-02-01 17:19:12 +01:00
Stephan e88443e549 Merge branch 'temp8' into feature/IContentType-removale-from-IContent 2019-02-01 16:25:36 +01:00
Warren Buckley e17d6df023 It helps if you put in a valid value - it expects Information and not Info as the loglevel 2019-02-01 15:13:41 +00:00
Warren Buckley 0a9bc82551 Merge pull request #4347 from umbraco/temp8-4068-grid-fixes
Grid fixes
2019-02-01 14:13:23 +00:00
Claus 7d17b1be16 Merge pull request #4337 from umbraco/temp8-appsetting-conventions-constants
Web.Config AppSetting key conventions & move to constants class
2019-02-01 15:11:54 +01:00
Niels Lyngsø 59c43fe8cb Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-01 14:54:54 +01:00
Niels Lyngsø d4b2ac3f1e V8: UI — changed color for focus point on medias 2019-02-01 14:54:49 +01:00
Claus 05a40b32c6 Merge pull request #4361 from kjac/v8-media-items-default-property-descriptions
V8: Add descriptions to properties on default media items
2019-02-01 14:35:36 +01:00
Kenn Jacobsen bf87ecb818 Add descriptions to properties on default media items 2019-02-01 14:32:17 +01:00
Bjarke Berg 9acf913872 #3545 - Added IContentTypeServiceBaseFactory to create a IContentTypeServiceBase (E.g. IContentTypeService or IMediaTypeService) based on the type of the IContentBase 2019-02-01 14:07:31 +01:00
Warren Buckley fec046347b Merge pull request #4352 from umbraco/temp8-4257-refactoring-of-infinite-editor-layers
Temp8 4257 refactoring of infinite editor layers
2019-02-01 12:43:31 +00:00
Niels Lyngsø 7261432461 V8: UI — changed look of media-picker upload button 2019-02-01 13:23:09 +01:00
Niels Lyngsø b645cc8e54 Merge pull request #4355 from umbraco/temp8-4354-publish-fix
Fix for javascript's strict equality
2019-02-01 13:21:40 +01:00
Kenn Jacobsen 712a260159 Fix wrong class name in media picker element selector 2019-02-01 13:01:42 +01:00
Bjarke Berg bfc2d53fa4 Merge remote-tracking branch 'origin/temp8' into feature/IContentType-removale-from-IContent
# Conflicts:
#	src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs
2019-02-01 12:52:20 +01:00
Niels Lyngsø 0c34de4524 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-01 12:38:59 +01:00
Niels Lyngsø f5d904c88c V8: add spacing around tabs 2019-02-01 12:38:12 +01:00
Bjarke Berg ab5c33e340 #4354 - Fix for stupid javascript's strict equality 2019-02-01 12:34:56 +01:00
Warren Buckley a6d0449671 Merge pull request #4335 from umbraco/temp8-3648-retain-cculture-in-urls
#3648 - Besides mculture also retain cculture in querystring on navig…
2019-02-01 10:40:17 +00:00
Warren Buckley d1edc45d4d Merge pull request #4304 from umbraco/temp8-3645-change-culture-in-preview
Allow changing culture in the preview bar
2019-02-01 10:27:37 +00:00
Warren Buckley fde9e9b654 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-01 10:14:39 +00:00
Warren Buckley d38dba1660 Update nuspec to include new hosted image/icon for Nuget packages from .com site 2019-02-01 10:14:29 +00:00
Niels Lyngsø 0bb69aeeee V8: preview colors changed for brandcolors 2019 2019-02-01 11:10:20 +01:00
Warren Buckley 3fac16eda8 Fix count bug - so it works with two languages 2019-02-01 09:58:10 +00:00
Niels Lyngsø 979f7b404c V8: refactoring of layers add and removal methods 2019-02-01 10:51:14 +01:00
Niels Lyngsø 4ab42e0dc7 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-01 10:49:22 +01:00
Niels Lyngsø fc6e17f3f9 V8: UI — umb-content-grid color change 2019-02-01 10:49:09 +01:00
Stephan a6d04aa5bb Merge branch 'temp8' into temp8-3640 2019-02-01 10:47:34 +01:00
Bjarke Berg 045020e739 #4068 - Changed save event triggered when save dialog is opened. save is still broadcasted on the actual save.
Changed the grid event listener to only execute on `save` events
2019-02-01 08:37:06 +01:00
Shannon Deminick ed734d0f80 Merge pull request #4232 from umbraco/temp8-member-search-and-tags
Fixes for search of members + Removed fixme in member that apparently…
2019-02-01 17:11:10 +11:00
Shannon c0ab9d9e59 Merge branch 'temp8' into temp8-member-search-and-tags
# Conflicts:
#	src/Umbraco.Web/Editors/MemberController.cs
2019-02-01 16:43:03 +11:00
Shannon bb64141207 removes obsolete method 2019-02-01 16:35:10 +11:00
Shannon ad5b166f3f Fixes tests, simplifies constructors 2019-02-01 15:44:32 +11:00
Shannon 036ca7f1e5 fixing tests 2019-02-01 15:30:38 +11:00
Shannon c2ff32aaab Fixing tests, don't expose UmbracoContext on UmbracoHelper, fixing all of the editor constructors 2019-02-01 15:24:07 +11:00
Shannon 493ee63cb9 Merge branch 'temp8' into temp8-macros-dont-render-and-other-macro-bugs 2019-02-01 14:57:13 +11:00
Shannon c846d69507 Merge branch 'kjac-v8-fix-copy-media-types' into temp8 2019-02-01 14:52:06 +11:00
Shannon e540902ee1 Merge branch 'v8-fix-copy-media-types' of https://github.com/kjac/Umbraco-CMS into kjac-v8-fix-copy-media-types 2019-02-01 14:51:42 +11:00
Shannon d7d82ea98d Allows grid rte to be distraction-free, the parameter was not being passed but it can be configured 2019-02-01 14:02:45 +11:00
Shannon 3eb6cd9e21 Macros are now working inline in the rte with both the Classic and Distraction free modes 2019-02-01 13:50:39 +11:00
Shannon e79e07af77 Merge branch 'temp8' into temp8-macros-dont-render-and-other-macro-bugs 2019-02-01 13:50:10 +11:00
Shannon 7614ba42df Fixes the tag editor and tag suggestions 2019-02-01 13:32:17 +11:00
Shannon dae8dfdc59 fix merge 2019-02-01 11:34:28 +11:00
Shannon 0c4712de56 Merge branch 'temp8' into temp8-macros-dont-render-and-other-macro-bugs
# Conflicts:
#	src/Umbraco.Tests/Testing/TestingTests/MockTests.cs
#	src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs
#	src/Umbraco.Web/Templates/TemplateRenderer.cs
2019-02-01 11:33:13 +11:00
Shannon d8fbbeccfe Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-02-01 11:27:53 +11:00
Shannon 452badab41 Fixes tag editor for proper dirty tracking and model updating, the models weren't being updated correctly 2019-02-01 11:27:40 +11:00
Shannon f74a49f5a3 Gets the macros being able to be updated, now to fix the Classic mode, since this now only works in distraction free mode 2019-02-01 10:18:53 +11:00
Kenn Jacobsen eeaf8d594d Make NC resilient towards culture variance in elements 2019-01-31 19:43:57 +01:00
Bjarke Berg 4a480ab391 #4068 - Added interceptor to remove $ variables from post data 2019-01-31 15:10:19 +01:00
Bjarke Berg 6bf3b19d86 #4068 - Fix for ordering of grid 2019-01-31 15:09:57 +01:00
Stephan 3199aa6693 Support culture in content Saving and Publishing events 2019-01-31 15:06:24 +01:00
Warren Buckley 14c43d76c1 Adds OEmbedProviders to the composition extension to make it easier to add/append the collection 2019-01-31 13:37:47 +00:00
Warren Buckley bc7748aed6 Adds in XML docs summary - still need assitance with a few keys so put in some TODOs 2019-01-31 12:37:54 +00:00
Warren Buckley 3f8f1a215e Merge remote-tracking branch 'origin/temp8' into temp8-appsetting-conventions-constants 2019-01-31 12:06:29 +00:00
Warren Buckley 69f7a1b7b9 Finish up remaining AppSetting keys as Constants 2019-01-31 12:05:56 +00:00
Niels Lyngsø d59bddfe9a Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 12:58:21 +01:00
Niels Lyngsø d45d0a816e V8: UI — changed colors for selection state for rows in list-view 2019-01-31 12:58:17 +01:00
Warren Buckley 34be548aec Start work on adding AppSettings keys into a constants class & use new prefix of Umbraco.Core. 2019-01-31 10:56:09 +00:00
Kenn Jacobsen 1a64c0a803 Fix disappearing media thumbnails 2019-01-31 11:45:08 +01:00
Warren Buckley 14b97b6abe Fix up JS as the API model had changed 2019-01-31 10:24:15 +00:00
Warren Buckley 8d55340325 Fix up youtube URL regex matching 2019-01-31 10:23:54 +00:00
Bjarke Berg 92d53eb527 #3648 - Besides mculture also retain cculture in querystring on navigation 2019-01-31 11:10:27 +01:00
Stephan a6f9598a23 Introduce IPublishedRouter 2019-01-31 11:07:45 +01:00
Kenn Jacobsen 26e0c6cb79 Don't break for root relations + minimize number of XHR 2019-01-31 10:43:34 +01:00
Warren Buckley ad9c4ec9a5 Merge remote-tracking branch 'origin/temp8' into temp8-oembed-collection 2019-01-31 09:34:10 +00:00
Warren Buckley a36b1962c6 Last of providers moved across & the old config file gone 2019-01-31 09:32:50 +00:00
Niels Lyngsø b65e042b4c Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 10:13:11 +01:00
Niels Lyngsø b558023f9e V8: UI interact vs. select 2019-01-31 10:13:07 +01:00
Bjarke Berg 169221a5da Merge pull request #4188 from umbraco/v8/bugfix/temp8-fe-infinityediting-fixing-contentapps-after-edit-doctype
V8/bugfix/temp8 fe infinityediting fixing contentapps after edit doctype
2019-01-31 09:52:23 +01:00
Warren Buckley 160d01e783 Merge remote-tracking branch 'origin/temp8' into temp8-oembed-collection 2019-01-31 08:50:34 +00:00
Bjarke Berg 228480a2ef Merge remote-tracking branch 'origin/temp8' into v8/bugfix/temp8-fe-infinityediting-fixing-contentapps-after-edit-doctype 2019-01-31 09:50:30 +01:00
Bjarke Berg 9d9597dbc3 Merge remote-tracking branch 'origin/temp8' into v8/bugfix/temp8-fe-infinityediting-fixing-contentapps-after-edit-doctype
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js
2019-01-31 09:39:43 +01:00
Niels Lyngsø 01ecd49256 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 09:37:14 +01:00
Niels Lyngsø 2ab391eb69 V8: UI select colors 2019-01-31 09:37:04 +01:00
Sebastiaan Janssen a1f72826c7 Remove duplicate css class 2019-01-31 08:39:59 +01:00
Bjarne Fyrstenborg 3ba32dafa5 Localize edit link, remove duplicate class attributes and only make remove link red 2019-01-31 08:34:54 +01:00
Bjarne Fyrstenborg d55262b322 Revert "Localize edit link, remove duplicate class attributes and only make remove link red"
This reverts commit 63cc250c0f929b1f7e6f9f05fae2fd302682d418.
2019-01-31 08:34:54 +01:00
Bjarne Fyrstenborg 7b3623a9d9 Localize edit link, remove duplicate class attributes and only make remove link red 2019-01-31 08:34:54 +01:00
Shannon 9abd72f623 gets macro content loading on rte load 2019-01-31 17:12:44 +11:00
Shannon f9e673ca4c Updates tinymce, adds back the styles for the rendered macro in the rte, properly uses tinymce's noneditable plugin and removes a ton of code relating to the old work arounds we had, now just need to get the macro re-rendering 2019-01-31 16:54:17 +11:00
Shannon 2f1c39ab96 Removes the old/strange "pageElements" thing, it's no longer needed 2019-01-31 15:44:39 +11:00
Shannon 7b55d2f1b2 New IMacroRenderer and ITemplateRenderer and hides underlying logic for these in internal classes. Massively cleans up the macro rendering logic (almost makes sense now), removes unused macro code, injects UmbracoHelper wherever it's needed (not creating manually), fixes UmbracoHelper to have it's services injected, no more empty services, allows setting the AssignedContentItem on the UmbracoHelper and ensures it's lifespan is Transient, updates all corresponding ctors. Fixes macro rendering, ensures the correct culture variation is assigned, and that we can render macros for any given IPublishedContent, not just the one assigned in the request. 2019-01-31 15:09:31 +11:00
Shannon Deminick 7f9ca716e7 Merge pull request #4210 from umbraco/temp8-fixme-get-all-entities-with-postfilter
Fixme - Handle not implemented exception on pick of macro
2019-01-31 14:51:55 +11:00
Shannon d9cb605f22 Fixing getting the macro to render in the rte, incorrect params being set 2019-01-31 14:48:43 +11:00
Shannon 8c813fa40d Merge branch 'temp8' into temp8-fixme-get-all-entities-with-postfilter 2019-01-31 11:10:01 +11:00
Shannon 0e9eae6f73 removes a bunch of console.log that was recently added 2019-01-31 11:05:41 +11:00
Shannon dcacff0124 Updates user section routing so that it has nice urls 2019-01-31 11:03:25 +11:00
Warren Buckley fe9700b3f7 A handful more providers moved across & removed any that no longer supported 2019-01-30 21:52:12 +00:00
Callum Whyte 2036da5e84 V8: kill usercontrol support, cleanup macros (#4329) 2019-01-30 18:37:07 +01:00
Sebastiaan Janssen 74a1bb9123 Update .net version, don't insert examine nor defaultuilanguage 2019-01-30 18:02:48 +01:00
Sebastiaan Janssen 781f63b805 There is no log4net.config 2019-01-30 18:01:16 +01:00
Sebastiaan Janssen b7a788e219 There is no trees.config 2019-01-30 18:01:01 +01:00
Sebastiaan Janssen 396fa73283 There is no UI.xml 2019-01-30 18:00:40 +01:00
Warren Buckley 880faeebd3 Adds a few more providers to the collection 2019-01-30 16:50:08 +00:00
Sebastiaan Janssen 1a298be9fa Removes obsoleted settings that prevent v8 startup 2019-01-30 17:47:54 +01:00
Sebastiaan Janssen 2353863092 Fix merge error 2019-01-30 17:35:06 +01:00
Sebastiaan Janssen 5ebe1b19ee Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 17:28:07 +01:00
Sebastiaan Janssen 8be93f91ba Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Core/Services/Implement/MemberGroupService.cs
#	src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html
2019-01-30 17:27:34 +01:00
Warren Buckley 74dcaea879 Merge remote-tracking branch 'origin/temp8' into temp8-oembed-collection 2019-01-30 16:02:02 +00:00
Kenn Jacobsen f2e1978ddb Support start node IDs for media picker in infinite editing 2019-01-30 16:46:33 +01:00
Kenn Jacobsen 4dd51f645a Make sure the color picker label is stored on first select (#4325) 2019-01-30 16:12:50 +01:00
Shannon f8fd255239 Last cleanup of unused umbraco settings 2019-01-31 01:37:38 +11:00
Shannon 6b2831c606 kill more useless umbraco settings 2019-01-31 01:30:17 +11:00
Shannon 2a54b2931c Removes providers section from umbraco settings 2019-01-31 01:20:19 +11:00
Shannon f28c60ced3 Removes all irrelevant logging settings from umbraco settings 2019-01-31 01:11:15 +11:00
Shannon a20c75d3c7 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 00:57:39 +11:00
Shannon 1c8b4412e3 Removes scheduled tasks 2019-01-31 00:57:10 +11:00
Bjarke Berg 5561029e07 Merge pull request #4070 from kjac/v8-fix-redirects-search-box-styling
V8: Fix the styling of the search box on the Redirect URL Management dashboard
2019-01-30 14:41:19 +01:00
Shannon 7a50856d32 Removes AutoLegacy routing and the legacy UseDomainPrefixes from umbraco settings 2019-01-31 00:33:02 +11:00
Shannon d1d9779a71 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 00:30:44 +11:00
Shannon 9571f48bd3 Removes AutoLegacy routing and the legacy UseDomainPrefixes from umbraco settings 2019-01-31 00:30:28 +11:00
Bjarne Fyrstenborg 0016962bc2 v8: Edit macro parameters (#4317) 2019-01-30 14:27:58 +01:00
Shannon 82ba360435 removes defaultDocumentTypeProperty from umbraco settings 2019-01-31 00:16:15 +11:00
Shannon 36d7c26120 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 00:09:46 +11:00
Shannon d852422328 removes CloneXmlContent from umbraco settings 2019-01-31 00:09:30 +11:00
Kenn Jacobsen 14a216778e V8: Align delete dialogs with the other dialogs (take two) (#4288) 2019-01-30 14:08:50 +01:00
Shannon 06cf8abfee Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-31 00:03:20 +11:00
Shannon 357da8ac6e removes PropertyContextHelpOption from umbraco settings 2019-01-31 00:03:03 +11:00
Stephan c8d9e59436 Fix SqlServer version detection 2019-01-30 14:02:45 +01:00
Bjarne Fyrstenborg 69af591b78 v8: Fix general localization (#4274) 2019-01-30 14:01:22 +01:00
Shannon f1b168fc46 removes ForceSafeAliases from umbraco settings, etc... 2019-01-30 23:58:54 +11:00
Bjarke Berg fe2af90caa #4229 - If the property do not support variantions, we need to validate the default language 2019-01-30 13:56:50 +01:00
Shannon 3dce2c870e removes XmlCacheEnabled, ContinouslyUpdateXmlDiskCache, XmlContentCheckForDiskChanges from umb settings 2019-01-30 23:52:35 +11:00
Shannon a123bc7084 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 23:42:39 +11:00
Shannon fccfa4f412 Removes umbraco settings: ImageTagAllowedAttributes, UploadAllowDirectories, ensureUniqueNaming, ImageTagAllowedAttributes, ScriptEditorDisable, ScriptFolderPath, UploadAllowDirectories 2019-01-30 23:42:25 +11:00
Kenn Jacobsen 31765a7a47 Remove the tooltip position flickering 2019-01-30 13:26:21 +01:00
Warren Buckley 88eb29e199 Removes EmbedProviders.config & moves into C# types (As its a config file that is rarely ammended IMO) 2019-01-30 11:46:15 +00:00
Callum Whyte 0cdccc1a9b V8: Removing legacy content tree menu items (#4278) 2019-01-30 12:01:57 +01:00
Shannon 19633b8d70 Merge branch 'temp8' into temp8-fixme-get-all-entities-with-postfilter 2019-01-30 20:41:37 +11:00
Shannon a331632800 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 20:33:26 +11:00
Shannon 90eae73d9b By default allow all trees to support both main and dialog usages 2019-01-30 20:33:14 +11:00
Shannon 7bb0eb109a moves class to separate file 2019-01-30 20:31:44 +11:00
Shannon c213408b92 Changes OperatorFactory to internal 2019-01-30 20:24:42 +11:00
Niels Lyngsø 0b0371af7e Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 10:17:05 +01:00
Bjarke Berg b1b71a4444 Merge pull request #4300 from kjac/v8-fix-respect-template-casing
V8: Respect the name casing when creating a new template
2019-01-30 10:16:40 +01:00
Niels Lyngsø ab77623248 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 10:16:36 +01:00
Niels Lyngsø bf7372c6ba V8: Color corrections for several components 2019-01-30 10:16:32 +01:00
Shannon 273441a2fb Merge branch 'temp8' into temp8-fixme-get-all-entities-with-postfilter
# Conflicts:
#	src/Umbraco.Web/Editors/EntityController.cs
2019-01-30 20:09:07 +11:00
Shannon 6ff787046b Fixing trees regression issue 2019-01-30 19:52:24 +11:00
Shannon df5c685bc2 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-30 19:48:55 +11:00
Shannon 6c0321ce72 Fixing trees regression issue 2019-01-30 19:48:42 +11:00
Stephan aa20584588 Merge branch 'temp8-move-xml-published-cache-to-tests' into temp8 2019-01-30 08:40:08 +01:00
Stephan 99ec2d18f2 Merge branch 'temp8' into temp8-move-xml-published-cache-to-tests 2019-01-30 08:37:42 +01:00
Stephan 7ba4fd7ad1 Cleanup Umbraco module 2019-01-30 08:35:50 +01:00
Bjarke Berg 2287c0e402 #3645 - remove badge again in preview mode + added spinner 2019-01-30 08:24:47 +01:00
Shannon Deminick e960d06449 Merge pull request #4298 from umbraco/temp8-fix-partialview-templates
PartialView & PartialViewMacros template generation fix
2019-01-30 18:10:26 +11:00
Shannon 134cc176ff Moves the Xml published cache to the tests project since that is the only place it is used, removes the xml data integrity check since it's not needed, removes the xml published cache benchmark since it's not needed. Now we don't include the old xml published cache at all in the shipped product. 2019-01-30 17:50:13 +11:00
Bjarke Berg 126c91fe51 Merge remote-tracking branch 'origin/temp8' into temp8-3645-change-culture-in-preview 2019-01-30 07:50:02 +01:00
Bjarke Berg cf0095dc1c #3645 - removed viewmodel and uses ILanguage directly in the view 2019-01-30 07:49:45 +01:00
Shannon 3371dbaa48 Merge remote-tracking branch 'origin/temp8-remove-legacy-controls' into temp8 2019-01-30 17:40:00 +11:00
Shannon Deminick f11d22f43a Merge pull request #4249 from umbraco/temp8-remove-unused-filesystem-config
V8 Remove unused filesystemproviders.config
2019-01-30 17:37:38 +11:00
Shannon f02da1fdd2 nucache bug fix 2019-01-30 17:36:33 +11:00
Shannon 08a886b724 nucache bug fix 2019-01-30 17:35:57 +11:00
Bjarke Berg ae9141f9e7 Merge remote-tracking branch 'origin/temp8' into temp8-3645-change-culture-in-preview
# Conflicts:
#	src/Umbraco.Web/Editors/PreviewController.cs
2019-01-30 07:34:19 +01:00
Shannon f49516ff13 fix csproj building 2019-01-30 17:14:04 +11:00
Shannon c2f82d184f Merge branch 'temp8' into temp8-remove-unused-filesystem-config
# Conflicts:
#	src/Umbraco.Web.UI/web.Template.config
2019-01-30 16:58:57 +11:00
Shannon 35b78cc224 Adds notes 2019-01-30 16:56:14 +11:00
Shannon 16b655fd62 Adds null check to SingleServerRegistrar 2019-01-30 16:47:48 +11:00
Shannon Deminick ac19aa4f91 Merge pull request #4243 from umbraco/temp8-remove-legacy-controls
🔥🔥 V8: Bye bye legacy stuff 🔥🔥
2019-01-30 15:22:27 +11:00
Shannon febc788c20 Merge remote-tracking branch 'origin/temp8' into temp8-remove-legacy-controls
# Conflicts:
#	src/Umbraco.Web/UI/Pages/UmbracoEnsuredPage.cs
2019-01-30 14:36:40 +11:00
Shannon 45bfaee590 fixing tests 2019-01-30 14:26:41 +11:00
Kenn Jacobsen a025568196 Handle element types in the multi URL picker 2019-01-29 22:30:06 +01:00
Kenn Jacobsen 9d3d4b77a0 Handle element types in the MNTP 2019-01-29 22:30:06 +01:00
Kenn Jacobsen 10fbffcfcc Handle element types in the conten picker 2019-01-29 22:30:06 +01:00
Vigan Shemsiu cca1393f2b Validate both width and height
Make sure to validate both width and height before running "setDimensions();". 

The focus point will not work if we have "img { width: 100%; }" in the stylesheet. 

This pull request will fix the bug.
2019-01-29 22:26:26 +01:00
Kenn Jacobsen 69548aed20 Fix the offset in the crop editor 2019-01-29 22:22:34 +01:00
Kenn Jacobsen 27ce8c8ebc Add a few missing localizations for edit media 2019-01-29 22:21:59 +01:00
Kenn Jacobsen 3f080ab277 Remove the annoying menuDialogTitle tooltip 2019-01-29 22:20:15 +01:00
Damiaan Peeters 7656de693c Add unittest 2019-01-29 22:18:53 +01:00
Damiaan Peeters 4806920179 Do not allow a empty name with for the MemberGroup 2019-01-29 22:18:53 +01:00
Kenn Jacobsen 2f146934d3 Show the error message and localize it 2019-01-29 22:11:17 +01:00
Kenn Jacobsen 1002113e7d Server side validation of illegal chars in folder names 2019-01-29 22:11:17 +01:00
Kenn Jacobsen 55aec0bf07 Make sure the install doesn't fail if the user opts out of a custom machine key 2019-01-29 22:03:33 +01:00
Niels Lyngsø 9d37e7ceda Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-29 21:28:29 +01:00
Niels Lyngsø 106c044ba5 V8: Color corrections 2019-01-29 21:28:25 +01:00
Kenn Jacobsen bda8128e93 Proper handling of the selected color 2019-01-29 21:00:40 +01:00
Kenn Jacobsen 4915efbb8d Re-select selected color on reload 2019-01-29 21:00:40 +01:00
Kenn Jacobsen c778249fed Fix the approved color styling 2019-01-29 21:00:40 +01:00
Callum Whyte 1340a5ce4b Removing support for legacy webservices 2019-01-29 20:23:20 +01:00
Kenn Jacobsen 5637c44f69 Explicitly set the form dirty when toggling a boolean 2019-01-29 17:41:28 +01:00
Bjarke Berg 414f838476 #3645 - Lists available languages in the preview bar (if more than 1)
Reads the culture from hash instead of query and updates the hash when changing culture.
2019-01-29 15:30:25 +01:00
Niels Lyngsø d75cace85d color variable clean up 2019-01-29 15:23:21 +01:00
Niels Lyngsø 2fa2e0109d Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-29 15:14:41 +01:00
Niels Lyngsø 78c3797e5a V8: colors for tags 2019-01-29 15:14:38 +01:00
Stephan 5d65ba3147 Merge branch 'temp8-fixtree' into temp8 2019-01-29 14:59:45 +01:00
Stephan cd5dc410cc Refactor IDataTypeConfigurationConnector for Deploy 2019-01-29 14:49:41 +01:00
Niels Lyngsø f94e0fd3ec V8: CSS — variable correction 2019-01-29 14:38:33 +01:00
Niels Lyngsø d39045caef V8: CSS — adding missing unit for umb-loader in umb-tree 2019-01-29 14:31:27 +01:00
Kenn Jacobsen 99f0e6c05a Fix callback 2019-01-29 14:11:04 +01:00
Kenn Jacobsen 2c40e46d56 Set form dirty on color picker value change + update selected item label + clean up unused code 2019-01-29 14:11:04 +01:00
Niels Lyngsø d2934f6be4 Merge remote-tracking branch 'origin/temp8-ui-update-color-to-2019-brandcolor-pink' into temp8 2019-01-29 14:10:18 +01:00
Niels Lyngsø b573b9a50a brandcolor 2019 corrections 2019-01-29 14:09:48 +01:00
Shannon c0026d3c23 Removes UseDirectoryUrls, have better defaults for reserved paths, don't ship with values in them just have them blank 2019-01-29 23:58:43 +11:00
Niels Lyngsø f0b4f31a9e Merge remote-tracking branch 'origin/temp8-ui-niels-adjustments' into temp8-ui-update-color-to-2019-brandcolor-pink
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/less/buttons.less
#	src/Umbraco.Web.UI.Client/src/less/components/editor.less
#	src/Umbraco.Web.UI.Client/src/less/components/html/umb-expansion-panel.less
2019-01-29 13:33:44 +01:00
Shannon 1897c0f162 moves package actions to correct namespace, no more _Legacy namespace 2019-01-29 23:31:59 +11:00
Niels Lyngsø 34f93331bd brandcolor 2019 corrections 2019-01-29 13:31:54 +01:00
Shannon 2e527163f9 no more umbraco.presentation namespace! no more "page" class, has been refactored and renamed to what it actually is and internalized 2019-01-29 23:27:00 +11:00
Sebastiaan Janssen 7a778d4c42 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Core/StringExtensions.cs
#	src/Umbraco.Web/Models/Mapping/UserModelMapper.cs
2019-01-29 13:11:03 +01:00
Shannon eef86689c8 Removes booting.aspx and creates embedded html pages for booting and failed (if those are ever seen ), renames some classes and namespaces, removes old cdf bundle classes 2019-01-29 23:05:59 +11:00
Benjamin Carleski 2c3a2b29b2 Obsolete direct hash generation methods, and switch to generic GenerateHash
As noted in https://github.com/umbraco/Umbraco-CMS/issues/4292, using direct hash methods can break compliance when on restricted systems that require FIPS compliance.  This has been addressed in a few commits.  This commit goes further to obsolete methods not previously obsoleted relating to direct hashing calls, and switches a direct call to one of these methods to use the correct, generic GenerateHash.
2019-01-29 12:58:51 +01:00
Shannon e7b0e43d98 removes scripting.config, EnableSplashWhileLoading, RenderingEngine, and more! 2019-01-29 22:38:03 +11:00
Kenn Jacobsen 66ca8c6018 Respect the name casing when creating a new template 2019-01-29 12:25:23 +01:00
Niels Lyngsø 6bf7db79e3 frontend design update for brandcolors 2019 2019-01-29 12:05:52 +01:00
Shannon cf1bf123da Merge branch 'temp8' into temp8-remove-legacy-controls
# Conflicts:
#	src/Umbraco.Web/Editors/DashboardController.cs
2019-01-29 22:02:37 +11:00
Shannon Deminick 19686496e6 Merge pull request #4228 from umbraco/temp8-3396-fix-YSOD-for-publishing
Publish a variant without a name gives YSOD
2019-01-29 21:57:07 +11:00
Shannon 1f7a0600c6 Merge remote-tracking branch 'origin/temp8' into temp8-3396-fix-YSOD-for-publishing 2019-01-29 21:48:09 +11:00
Warren Buckley e2d4110685 When creating a PartialView we do a string.replace for Model.Content. to be Model. as MacroPartialViews work with Model.Content and PartialViews like Model. 2019-01-29 10:46:10 +00:00
Shannon Deminick de237c36aa Merge pull request #4227 from umbraco/temp8-fixme-no-caching-of-url-and-inject-umbraco-context-accessor
Fixme - No caching of url and inject IUmbracoContextAccessor
2019-01-29 21:29:53 +11:00
Shannon 649aa82c63 Merge branch 'temp8' into temp8-fixme-no-caching-of-url-and-inject-umbraco-context-accessor 2019-01-29 21:29:32 +11:00
Shannon 9bcb2bfb38 removes unused code 2019-01-29 21:27:22 +11:00
Shannon c272c2ad3b Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-29 21:22:17 +11:00
Shannon fd80aecb20 fixes more of the ConvertRelatedLinksToMultiUrlPicker migration 2019-01-29 21:22:01 +11:00
Warren Buckley 7d2024d3fd Merge pull request #4295 from umbraco/temp8-macro-picker-fixes
Fixes UI for macropicker and added submit button
2019-01-29 09:31:41 +00:00
Stephan d24b7f2aba Refactor enums 2019-01-29 10:17:26 +01:00
Niels Lyngsø 9cd2e36c4b more color corrections for brandcolors 2019 2019-01-29 10:00:38 +01:00
Shannon 47bde0f507 Merge branch 'temp8' into temp8-fixme-no-caching-of-url-and-inject-umbraco-context-accessor 2019-01-29 19:58:40 +11:00
Shannon 7b85ebab56 Adds migration to convert start nodes for picker configuration to UDIs 2019-01-29 19:54:32 +11:00
Bjarke Berg 9c3e501a60 Fixes UI for macropicker and added submit button 2019-01-29 09:46:24 +01:00
Niels Lyngsø 08a8e0793e Design & color changes for 2019 brand colors 2019-01-29 09:30:42 +01:00
Stephan 5135635bf8 Cleanup 2019-01-29 09:15:10 +01:00
Shannon 89a99e1c5f Makes IDashboard IDiscoverable 2019-01-29 18:10:50 +11:00
Shannon 70f23b2245 Merge branch 'temp8' into temp8-fixme-no-caching-of-url-and-inject-umbraco-context-accessor 2019-01-29 17:56:11 +11:00
Shannon ee693b63bd Fixes issue with ConvertRelatedLinksToMultiUrlPicker migration since it produces invalid SQL if there are no values in the .Contains calls 2019-01-29 17:52:48 +11:00
Shannon 86d8bc0c62 fix merge 2019-01-29 17:19:58 +11:00
Shannon 22d879ab35 Merge branch 'temp8' into temp8-fixme-no-caching-of-url-and-inject-umbraco-context-accessor
# Conflicts:
#	src/Umbraco.Tests/PublishedContent/NuCacheTests.cs
#	src/Umbraco.Web/Models/PublishedContentBase.cs
#	src/Umbraco.Web/PublishedCache/NuCache/ContentNode.cs
#	src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs
2019-01-29 17:12:35 +11:00
Stephan c2f51be0a1 Bugfix 2019-01-28 22:44:00 +01:00
Niels Lyngsø 052cee31b3 color corrections for pink theme 2019-01-28 21:36:04 +01:00
Warren Buckley 4a5eca3c6a Adds in Composition Extension Methods to allow Setting the LogViewer without having to know the composition.RegisterUnique syntax 2019-01-28 15:39:49 +00:00
Stephan 9eabc1fb3f More NuCache/PublishedContent cleanup 2019-01-28 16:23:10 +01:00
Warren Buckley 633d9c6fb4 Merge pull request #4218 from umbraco/temp8-dashboards-collection
V8 - Remove dashboards.config - use CollectionBuilder
2019-01-28 14:47:44 +00:00
Stephan 9b4b8b9d86 Cleanup NuCache/PublishedContent 2019-01-28 14:15:47 +01:00
Stephan 85d4b4a61d Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-28 14:07:19 +01:00
Stephan d901e14e4f Merge branch 'temp8-ispublished-again' into temp8 2019-01-28 14:06:17 +01:00
Stephan 27fd908517 Refactor IPublished 2019-01-28 14:05:59 +01:00
Niels Lyngsø d262b524df Merge remote-tracking branch 'origin/temp8-ui-overlay-button-style' into temp8-ui-update-color-to-2019-brandcolor-pink 2019-01-28 13:18:04 +01:00
Niels Lyngsø f619b03b04 Correct spelling 2019-01-28 13:17:38 +01:00
Niels Lyngsø 1f09292ee3 Merge remote-tracking branch 'origin/temp8-ui-overlay-button-style' into temp8-ui-update-color-to-2019-brandcolor-pink 2019-01-28 13:15:52 +01:00
Niels Lyngsø 9a0f50291c color adjustments for proposal 2019-01-28 13:15:40 +01:00
Stephan a344a2f240 Merge branch 'temp8' into temp8-ispublished-again 2019-01-28 13:08:30 +01:00
Stephan fac25b5971 Bugfix 2019-01-28 13:04:37 +01:00
Stephan c675708388 Refactor dashboards 2019-01-28 12:38:58 +01:00
Warren Buckley 117b836cd7 Merge pull request #4259 from umbraco/temp8-remove-related-links-with-migration
Remove related links and migrate existing data to Multi URL Picker
2019-01-28 09:42:56 +00:00
Stephan 918908a785 Merge branch 'temp8' into temp8-dashboards-collection 2019-01-28 10:35:34 +01:00
Stephan c2a404c02d Update ModelsBuilder 2019-01-28 10:34:57 +01:00
Stephan e410b8b067 Fix TreeUse 2019-01-28 10:27:36 +01:00
Stephan 27ecd795b2 Merge branch temp8 into temp8-fixtree 2019-01-28 10:19:36 +01:00
Warren Buckley e7181915ff Merge remote-tracking branch 'origin/temp8' into temp8-remove-legacy-controls 2019-01-28 08:40:25 +00:00
Warren Buckley 9f79f1833f Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-collection
# Conflicts:
#	src/Umbraco.Web/Services/DashboardService.cs
2019-01-28 08:33:52 +00:00
Niels Lyngsø df00cfab40 Merge remote-tracking branch 'origin/temp8-ui-update-colors-to-2019-brandcolors' into temp8-ui-update-color-to-2019-brandcolor-pink 2019-01-28 09:31:24 +01:00
Niels Lyngsø f0611fff90 correct color variable for variant switcher 2019-01-28 09:30:08 +01:00
Niels Lyngsø da3a5d35c1 make unpublish button in overlay appear as button-style warning 2019-01-28 09:00:38 +01:00
Bjarke Berg 3c24aac81d Merge remote-tracking branch 'origin/temp8' into temp8-ispublished-again 2019-01-28 08:46:17 +01:00
Bjarke Berg 9b01910d44 Removed isPublished stuff from XmlPublishedContent. 2019-01-28 08:27:42 +01:00
Niels Lyngsø 6b0158f761 color update 2019-01-27 18:14:55 +01:00
Sebastiaan Janssen 7e8c0ed369 Apply changes from PR #4197 to v8 too 2019-01-27 15:17:08 +01:00
Sebastiaan Janssen cebf1e6c22 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js
#	src/Umbraco.Web/Editors/ContentController.cs
#	src/Umbraco.Web/Routing/PublishedRequest.cs
2019-01-27 13:47:22 +01:00
Sebastiaan Janssen d174499e50 Fixes #4260 incorrect permissions required for Notifications sign up 2019-01-27 13:30:44 +01:00
Sebastiaan Janssen 647d92775c Make right-click menu work in Firefox 2019-01-27 12:02:39 +01:00
Kenn Jacobsen a185d56ae5 Ensure that element types can't be assigned as allowed children to other content types 2019-01-27 11:46:55 +01:00
Chris Houston 193e24afd2 Fixing all the TODO, FIXME & HACK comments so they all follow the same layout. 2019-01-27 11:16:00 +01:00
Kenn Jacobsen d31e25281d Fix infinite loop when saving multiple variants using list view 2019-01-27 10:41:50 +01:00
Kenn Jacobsen df20feb703 Make cache properties on PublishedContentRequest public 2019-01-27 10:39:34 +01:00
Sebastiaan Janssen ae25e4564e Fix the tests 2019-01-27 10:26:41 +01:00
Kenn Jacobsen 1955409582 Don't allow creation of element types in the content tree 2019-01-26 18:30:50 +01:00
Kenn Jacobsen b709ed4aa3 Don't attempt to resolve URLs for element types 2019-01-26 18:27:53 +01:00
Kenn Jacobsen 57fb9888a2 Add localization to Flatpickr 2019-01-26 18:22:12 +01:00
Kenn Jacobsen 54bb3384b2 Add "time" and "bigint" to value types 2019-01-26 17:48:30 +01:00
Kenn Jacobsen 9f2477ad75 Remove the hover underline from grid items 2019-01-26 17:47:23 +01:00
Kenn Jacobsen 35a6d721ee Make sure to inform the content editor of an app change when split view is opened 2019-01-26 17:38:59 +01:00
Nathan Woulfe a4c5b7118d check for editorstate.current before attempting to access properties object 2019-01-26 17:33:45 +01:00
Niels Lyngsø 0194ccdad7 corrected on-edit method for MultiUrlPicker, Fixes #4171 2019-01-26 17:30:42 +01:00
Kenn Jacobsen a2f0ad67ab Fix the flickering tooltip 2019-01-26 17:30:27 +01:00
Sebastiaan Janssen 8d4da215fa Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs
#	src/Umbraco.Tests/CodeFirst/StronglyTypedMapperTest.cs
#	src/Umbraco.Tests/LibraryTests.cs
#	src/Umbraco.Tests/Membership/DynamicMemberContentTests.cs
#	src/Umbraco.Tests/PublishedContent/DynamicDocumentTestsBase.cs
#	src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs
#	src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs
#	src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs
#	src/Umbraco.Tests/PublishedContent/PublishedContentTestElements.cs
#	src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
#	src/Umbraco.Tests/TestHelpers/BaseWebTest.cs
#	src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
#	src/Umbraco.Web.UI/Umbraco/config/lang/nl.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/es.xml
#	src/Umbraco.Web/Scheduling/HealthCheckNotifier.cs
#	src/Umbraco.Web/WebBootManager.cs
2019-01-26 17:24:21 +01:00
Ronald Barendse 52a56c8852 Only add TLS 1.2 if explicit protocols are defined 2019-01-26 17:09:47 +01:00
Kenn Jacobsen 32f228fa7c Use the media file name as display name in the file link 2019-01-26 17:05:38 +01:00
Chris Houston 8d2c1332d3 Fixed a few typos I spotted in the last commit :) (#4215) 2019-01-26 16:56:30 +01:00
Chris Houston 0b6ba5aa52 Temp8 - Fixing spelling / typos etc in Umbraco.Web (#4148) 2019-01-26 16:52:19 +01:00
Chris Houston a13a38a482 Updated all the TODO: comments in the Umbraco.Core project so they are all in the same format. ( // TODO: ) (#4220)
Also moved some of the comments so they are will work better / are not within Code Documentation comments
2019-01-26 15:42:14 +01:00
Ronald Barendse 7a2f09643a Changed health check to indicate HTTPS endpoint connectivity using TLS 1.2 2019-01-26 15:30:47 +01:00
Paul Seal c9819b2d89 - disabled the duplicated community health checks (#4175) 2019-01-26 15:01:03 +01:00
Kenn Jacobsen 43a97185b6 Clean up file system tree controller handling of no-op for nodes 2019-01-26 14:58:47 +01:00
Kenn Jacobsen de8516d2c7 Make it possible to create folders for stylesheets 2019-01-26 14:58:47 +01:00
Niels Lyngsø 98cee55dda Merge remote-tracking branch 'origin/temp8' into temp8-ui-update-colors-to-2019-brandcolors 2019-01-25 16:35:56 +01:00
Niels Lyngsø dfaa297104 V8: Color refactoring up + first draft to fit with 2019 brand colors. 2019-01-25 16:33:06 +01:00
Sebastiaan Janssen 5a896e7417 Remove obsoleted RelatedLinks picker (replaced by Multi URL Picker)
(cherry picked from commit fedf0c78de)
2019-01-25 16:06:49 +01:00
Sebastiaan Janssen 2c6b5f21b0 Migrates RelatedLink data to MultiUrlPicker and changes all RelatedLink datatypes to MultiUrlPicker ones 2019-01-25 16:06:32 +01:00
Warren Buckley b1f94c66dc Remove name property from dashboard package.manifest collection 2019-01-25 12:18:15 +00:00
Warren Buckley 4b3cd91188 Remove Name property from IDashboardSection & the C# types (We use localization of dashboardTabs_alias) 2019-01-25 12:17:52 +00:00
Warren Buckley 19d084e086 Localize dashboard tabs with a convention of dashboardsTabs_dashboardAlias as the localization key 2019-01-25 12:11:07 +00:00
Bjarke Berg 66959baabe Reimplemented IsPublished on PublishedContent 2019-01-25 12:56:53 +01:00
Stephan e8cb30fbc4 Fix exception when replacing IServerRegistrar 2019-01-25 12:33:20 +01:00
Stephan 427ac259f4 Refactor datatype configuration connector 2019-01-25 11:57:42 +01:00
Stephan bb07921363 KeyValueService supports more weird situations 2019-01-25 11:57:08 +01:00
Warren Buckley a8e8832a75 Bye bye dashboard.config.install XDT transform as part of NuGet install 2019-01-25 10:17:40 +00:00
Bjarke Berg 11f8192e52 Merge pull request #4248 from umbraco/temp8-dashboards-collection-review
Dashboards collection review
2019-01-25 11:07:37 +01:00
Bjarke Berg 15c197abd3 public AccessRule.cs, to let third party create dashboards from code without having to implement there own 2019-01-25 11:04:56 +01:00
Warren Buckley b88ca1db49 Remove FIleSystemProviders.config from web.config XML files 2019-01-25 09:22:02 +00:00
Warren Buckley 6ee8ef0a07 Fix the build! Sorry Stephan 👌 2019-01-25 09:18:19 +00:00
Warren Buckley bee2776035 Bye bye FileSystemProvider.config - we no longer use you 2019-01-25 09:10:49 +00:00
Bjarke Berg 1c55f4ed4f changed correct file 2019-01-25 10:09:28 +01:00
Bjarke Berg 8926e28706 revert 2019-01-25 10:08:52 +01:00
Bjarke Berg 6626edbfa8 unused using 2019-01-25 10:04:18 +01:00
Bjarke Berg 87a5b63492 Merge branch 'temp8-dashboards-collection' into temp8-dashboards-collection-review 2019-01-25 09:57:59 +01:00
Bjarke Berg 0f8784b9f5 Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-collection-review 2019-01-25 09:56:06 +01:00
Bjarke Berg 51d2c3f351 Merge remote-tracking branch 'origin/temp8-dashboards-collection' into temp8-dashboards-collection 2019-01-25 09:55:19 +01:00
Bjarke Berg 544b13f05d Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-collection 2019-01-25 09:54:49 +01:00
Bjarke Berg 5f80faa725 Review fix suggestions for dashboards. 2019-01-25 09:52:18 +01:00
Stephan d5c2e21c4a Merge branch 'temp8' into temp8-fixtree 2019-01-25 09:51:08 +01:00
Stephan 585abf2902 Cleanup trees 2019-01-25 09:49:55 +01:00
Warren Buckley d257396013 Missing Serilog.Formatting.Compact.Reader from Nuspec for the Logviewer stuff- thanks Twitter for the heads up 👍 2019-01-25 08:21:43 +00:00
Bjarke Berg d9c6d8c568 Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-ciollection-review 2019-01-25 07:35:07 +01:00
Stephan 4067ac7d93 Merge branch temp8 into tmp8-fixtree 2019-01-24 18:34:25 +01:00
Stephan 0ffa4702ba Bugfix install 2019-01-24 18:26:08 +01:00
Warren Buckley 3e69ceb487 Remove dashboard from web.config 2019-01-24 15:52:56 +00:00
Warren Buckley 79eaeef258 Fixup NuSpec as we no longer ship with default.aspx 2019-01-24 15:44:47 +00:00
Warren Buckley 37b614a577 Another file that can be gone as was used by LegacyDialogTask 2019-01-24 15:41:38 +00:00
Niels Lyngsø 874c89656c action colors 2019-01-24 15:57:28 +01:00
Warren Buckley 7257d19445 Merge remote-tracking branch 'origin/temp8' into temp8-remove-legacy-controls 2019-01-24 14:45:57 +00:00
Warren Buckley 1ad0c88731 👻👻 Nightmares of writing WebForms controls with CSS markup & attributes in a .cs file 👻👻 2019-01-24 14:34:18 +00:00
Stephan e4c644e745 Consistent PublishedContentExtensions, culture always optional 2019-01-24 15:29:50 +01:00
Warren Buckley 1f79d9e635 🔪🔪Next on the chobbing block is config/create/ui.xml & references back to it which was Legacy Controller, DialogTask etc🔪🔪 2019-01-24 14:29:00 +00:00
Stephan 38ec97bbe3 Need to refactor IsPublished 2019-01-24 15:22:20 +01:00
Niels Lyngsoe 74bd8fa0db added 2019 brand colors 2019-01-24 15:11:34 +01:00
Warren Buckley 85da2a94b9 Bye 404Handlers XML config file - add/remove IContentFinders in your own composer/component 2019-01-24 14:09:28 +00:00
Warren Buckley ba098f49c4 ☠️☠️ Bye bye feedproxy.config ☠️☠️ 2019-01-24 13:59:17 +00:00
Warren Buckley c7bbad3c0c Lots or removal & tidy up - still WIP & may break build 2019-01-24 13:58:16 +00:00
Stephan a6d3078638 Improve CoreRuntime handling of boot fails 2019-01-24 14:04:31 +01:00
Stephan 31a6f2d67c Add runtime hooks for Deploy 2019-01-24 14:04:31 +01:00
Niels Lyngsø b9fd04c8b9 Merge remote-tracking branch 'origin/temp8-ui-resizeable-handler' into temp8 2019-01-24 13:31:02 +01:00
Bjarke Berg 5f1ddad835 Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-collection 2019-01-24 13:27:15 +01:00
Warren Buckley def6d67fcc Merge branch 'temp8' into temp8-remove-legacy-controls 2019-01-24 12:21:49 +00:00
Warren Buckley 26f0090fd0 Merge pull request #4205 from umbraco/temp8-fixmes-add-ispublished-to-ipublished-content
Added IsPublished(culture) to IPublishedContent
2019-01-24 12:12:52 +00:00
Warren Buckley 344026ec23 Merge pull request #4240 from umbraco/temp8-update-fixme-comments-to-todo-with-link-to-task
Changed Fixme/task to TODO [Link]
2019-01-24 12:06:38 +00:00
Warren Buckley db3116ff9c Merge pull request #4212 from umbraco/temp8-fixme-only-allow-local-keep-alive-pings
Fixme - Only allow local KeepAlive Pings requests
2019-01-24 11:49:05 +00:00
Bjarke Berg 49b2a9a080 Fixes for search of members + Removed fixme in member that apparently are not necessary after tags refactoring 2019-01-24 12:17:30 +01:00
Warren Buckley 6e1a860e77 Merge pull request #4211 from umbraco/temp8-PublishedContentExtensions-handling-methods-hidden-by-overload
Fixme - Handled "Method with optional parameter is hidden by overload" issues
2019-01-24 11:07:12 +00:00
Niels Lyngsø eef6c783ea updated package-lock.json 2019-01-24 11:59:33 +01:00
Sebastiaan Janssen 9e0d2e5873 Revert "Remove obsoleted RelatedLinks picker (replaced by Multi URL Picker)"
This reverts commit fedf0c78de.
2019-01-24 11:37:28 +01:00
Bjarke Berg ec8c455635 Fixes for search of members + Removed fixme in member that apparently are not necessary after tags refactoring 2019-01-24 11:28:27 +01:00
Warren Buckley f70df699db Merge pull request #4114 from umbraco/temp8-ui-expansion-panel-hover
Temp8 ui expansion panel hover
2019-01-24 10:03:00 +00:00
Bjarke Berg 3eb01a1557 Merge remote-tracking branch 'origin/temp8' into temp8-3396-fix-YSOD-for-publishing 2019-01-24 10:27:47 +01:00
Warren Buckley d8751365c8 Merge pull request #4206 from umbraco/temp8-fixme-children-wrong-merge-and-unused-file
Fixme - Wrong merge in PublishedContentExtensions and renamed prevalue connector
2019-01-24 09:24:58 +00:00
Bjarke Berg 5842337d02 3396 - Fix for when clearing the name again 2019-01-24 09:42:49 +01:00
Bjarke Berg cc897285c9 3396 - Force publish for all mandatory langauges that has not yet beed published 2019-01-24 08:31:42 +01:00
Bjarke Berg b389e6c07f 3396 - don't let user determine whether to publish mandatory languages on first publish. All mandatory languages with data is saved. If a mandatory language does not have data we cannot publish anything. 2019-01-24 08:16:55 +01:00
Warren Buckley 0480242532 Some sneaky MasterPages kill the last of them off with fire 🔥 2019-01-23 18:56:33 +00:00
Warren Buckley 31509beb1c 🙈 WOW this was super old Umbraco V3 days of <umbraco:item runat="server" /> WebForms days 2019-01-23 18:17:10 +00:00
Warren Buckley fcb3f8e791 Remove Umbraco.Web.UI.Controls folder & classes - Controis reek of WebForms era 2019-01-23 17:57:20 +00:00
Warren Buckley 03498b3c61 Update comment about this Interface usage - maybe we can remove this later on 2019-01-23 17:56:44 +00:00
Warren Buckley 5e9f861991 Cleanup of WebRuntimeComposer 2019-01-23 15:09:31 +00:00
Warren Buckley f2cc0eebf5 Remove the dashboard XML config file 2019-01-23 14:43:05 +00:00
Warren Buckley 5d34ee271c Forgot to remove my test App_Plugin Dashboard 2019-01-23 14:42:49 +00:00
Warren Buckley 26f43cda97 Merge remote-tracking branch 'origin/temp8' into temp8-dashboards-collection 2019-01-23 14:38:26 +00:00
Warren Buckley 69a3c85bbc Refactor of dashboards
* Remove dashboards from Configs().Dashboards
* Remove dashboard.config XML file & associated code reading from XML
* Load Dashboards from TypeLoader into a CollectionBuilder
* Load merge/concat C# Dashboard Types with package.manifest
* Add buildercolletion to an extension method on Composition
2019-01-23 14:37:33 +00:00
Bjarke Berg f8b9fb039f Handle culture not set in HasCulture. 2019-01-23 15:35:20 +01:00
Niels Lyngsø d16aa91a5e remove extra border from MCE-edit-area 2019-01-23 15:13:42 +01:00
Bjarke Berg f8b52a57c3 Injecting Umbraco Context Accessor and not saving the url on the class 2019-01-23 14:16:42 +01:00
Bjarke Berg ca76a5424a Only allow local KeepAlive Pings requests 2019-01-23 12:34:41 +01:00
Bjarke Berg d2d852f0f3 Handled "Method with optional parameter is hidden by overload" issues 2019-01-23 10:39:51 +01:00
Bjarke Berg f10b35780c - Removed PostFilterParams
- Handling of PostFilter using Expression trees
2019-01-23 10:22:29 +01:00
Sebastiaan Janssen fedf0c78de Remove obsoleted RelatedLinks picker (replaced by Multi URL Picker) 2019-01-23 09:01:53 +01:00
Bjarke Berg 6f25bc7c37 Reintroduced a interface for deploy 2019-01-23 08:17:39 +01:00
Bjarke Berg e871392405 Added IsPublished(culture) to IPublishedContent 2019-01-23 07:54:45 +01:00
Bjarke Berg dcb616157d Removed unused IPreValueConnector 2019-01-23 07:52:24 +01:00
Bjarke Berg ddace54f45 Fixed wrong merge in Children() method 2019-01-23 07:51:43 +01:00
Christian Alkærsig 7acafe67a4 Delete template2.cshtml
Auto-generated test file
2019-01-23 00:28:21 +01:00
Alkaersig 9eb2b28232 Added (Doctype) Name and Description to PublishedContentType 2019-01-23 00:28:21 +01:00
Paul Seal 832ec68140 - tls check to check if the site is set up to use at least TLS 1.2 for outgoing connections.
- added translations for all languages which have a healthcheck section in the language file.
2019-01-23 00:11:35 +01:00
Chris Houston 78319bae9e Temp8 fix typos 2 (#4130) 2019-01-23 00:03:39 +01:00
Bjarne Fyrstenborg 01de2eb266 Synctree in log viewer overview 2019-01-22 23:05:17 +01:00
Bjarne Fyrstenborg ca98fad918 Update box heading in log viewer overview 2019-01-22 23:02:05 +01:00
Bjarne Fyrstenborg d8f0af1a94 Fix plural localization 2019-01-22 22:59:52 +01:00
Bjarne Fyrstenborg fc12f2b802 Add track by on package lists 2019-01-22 22:57:46 +01:00
Bjarne Fyrstenborg 977423e094 Remove old delete dialog, add new dialog view + set delete button state 2019-01-22 22:57:46 +01:00
Bjarne Fyrstenborg c405d1b6d1 Fix localization of buttons in modals 2019-01-22 22:52:01 +01:00
Kenn Jacobsen 6983f3d43a V8: Clean up trashed content options (#4136) 2019-01-22 22:50:12 +01:00
Sebastiaan Janssen d380f75d31 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web/Editors/ContentController.cs
#	src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
#	src/Umbraco.Web/WebApi/Filters/EnsureUserPermissionForContentAttribute.cs
2019-01-22 22:46:15 +01:00
Sebastiaan Janssen 8e61276b8a Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js
#	src/Umbraco.Web/PropertyEditors/DatePreValueEditor.cs
#	src/Umbraco.Web/WebBootManager.cs
2019-01-22 22:06:19 +01:00
Kenn Jacobsen a8d5bd6d1f Don't let the users empty the recycle bin without delete permissions (#3699) 2019-01-22 22:05:12 +01:00
Kenn Jacobsen e252a0849b Add "default empty" prevalue to date and datetime 2019-01-22 21:58:17 +01:00
Bjarne Fyrstenborg 45735a5529 v8: Add missing localizations (#4199) 2019-01-22 21:57:16 +01:00
Stephan d9cc1f4cb8 Fix more tests 2019-01-22 18:25:02 +01:00
Stephan ce4fc6654e Fix NestedContent tests now we have isElement 2019-01-22 17:32:46 +01:00
Rasmus John Pedersen e1175b814e Add Multi Url Picker 2019-01-22 16:00:15 +01:00
Warren Buckley 9b9c9ef455 Adds Sections() ordered collection to the Composition, so devs can ammend the collection, change order etc 2019-01-22 14:59:32 +00:00
Stephan 917b83be92 Merge branch 'temp8' into temp8-fixtree 2019-01-22 15:11:55 +01:00
Stephan b54155d1c9 Merge remote-tracking branch 'origin/temp8' into temp8 2019-01-22 15:05:23 +01:00
Stephan 6d6828eaaf Merge branch 'temp8-pr4102' into temp8 2019-01-22 15:04:32 +01:00
Niels Lyngsø e651d5917a Finds and set the active ContentApp when running init, fixing the issue of retuning to a node after editing the DocType in infinity editing.
Fixes #4185
2019-01-22 14:38:10 +01:00
Stephan fd0ee6bb11 Merge branch 'v8-fix-nested-content-only-elements' of https://github.com/kjac/Umbraco-CMS into temp8-pr4102 2019-01-22 14:30:38 +01:00
Robert 1fc2ea9345 Fixes composition in Media Types 2019-01-22 14:30:23 +01:00
Stephan 9628d6f761 Merge branch 'temp8-pr4117' into temp8 2019-01-22 14:28:47 +01:00
Stephan c1e81fe40c Merge branch 'v8-fix-remove-element-type-template-assignment' of https://github.com/kjac/Umbraco-CMS into temp8-pr4117 2019-01-22 14:22:36 +01:00
Stephan e36ca2e957 Merge branch temp8 into temp8-fixtree 2019-01-22 14:08:14 +01:00
Stephan ad026e25d7 Cleanup trees 2019-01-22 13:55:31 +01:00
Stephan e349ead8b5 Better error message 2019-01-22 13:08:47 +01:00
Bjarke Berg 4981f0e828 Merge pull request #2926 from umbraco/temp8-logviewer
Merged V8 LogViewer
2019-01-22 12:04:32 +01:00
Bjarke Berg 7b0acf9844 Merge pull request #4179 from umbraco/tem8-logviewer-review
Temp8 logviewer review fixes
2019-01-22 11:29:51 +01:00
Warren Buckley 626b9e8f7b Remove a TODO comment that was hanging around 2019-01-22 10:07:56 +00:00
Warren Buckley 62617537fa Change icon from scary bug to box-alt 2019-01-22 10:05:14 +00:00
Bjarke Berg 70315d4a5f Make as must of the log viewer internal as possible 2019-01-22 10:36:44 +01:00
Bjarke Berg c8daf1d8db Merge branch 'temp8-logviewer' into tem8-logviewer-review 2019-01-22 10:20:26 +01:00
Bjarke Berg 70010bc344 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs
2019-01-22 10:19:43 +01:00
Bjarke Berg 025d0eae18 Logviewer code cleanup. 2019-01-22 10:14:07 +01:00
Stephan c840895f90 Deal with more fixme 2019-01-22 09:49:35 +01:00
Stephan a53a15f4d8 Merge branch 'temp8-remove-mysql' into temp8 2019-01-22 08:30:35 +01:00
Stephan 04a4e2d00e cleanup 2019-01-22 08:30:08 +01:00
Bjarke Berg 2c86e87917 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-22 08:23:07 +01:00
Stephan 0c07af9a41 Merge branch temp8 into temp8-remove-mysql 2019-01-22 08:15:24 +01:00
Stephan 53d767e978 Fix clearing property values #4119 2019-01-22 08:09:21 +01:00
Stephan afd6236406 Merge pull request #4164 from umbraco/temp8-broken-view-fixes
Fixes for broken views..
2019-01-21 18:55:24 +01:00
Stephan 6fb41e364b Fix query builder 2019-01-21 18:50:27 +01:00
Stephan 76d2421f0c Restore some InternalsVisibleTo that we do need 2019-01-21 18:02:31 +01:00
Warren Buckley 6d0f505e2d Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-21 16:39:51 +00:00
Stephan 706b865a5f Merge branch 'temp8-3668-query-builder-snippits' into temp8 2019-01-21 17:38:39 +01:00
Stephan 9e811ddd50 Fix fallback 2019-01-21 17:38:06 +01:00
Warren Buckley dda9c5183c Updates the composer/registration of JSONLogViewer - Can't use default parameters with DI hence needed to use factory & new up an instance 2019-01-21 16:36:47 +00:00
Warren Buckley 8ab5142357 Moves tree into Settings group as opposed to third party trees & positions last 2019-01-21 16:36:00 +00:00
Warren Buckley 3af859e020 Updates default log levels that we ship out of the box for V8 - It was a very chatty Verbose, now set to Info 2019-01-21 16:29:59 +00:00
Stephan 358a36dd87 Merge branch temp8 into temp8-3668-query-builder-snippits 2019-01-21 16:07:20 +01:00
Stephan ee0c868687 Misc fixes for PR and Fallback 2019-01-21 16:02:16 +01:00
Stephan 9522ee826f Deal with fixme in Umbraco.Web 2019-01-21 16:01:37 +01:00
Stephan 4a0b969777 Deal with fixme in Umbraco.Core 2019-01-21 16:01:37 +01:00
Warren Buckley 9407c85d71 Remove TreesAndSection tests (must have been a funky merge gone wrong) 2019-01-21 12:40:19 +00:00
Niels Lyngsø 735c2ccfd7 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-21 13:30:55 +01:00
Niels Lyngsø dd29deec6a V8 Gulp — only run imagemin in production mode. 2019-01-21 13:30:49 +01:00
Warren Buckley 1d39c177cc Adds in private method EnsureFileExists as it was removed from IOHelper 2019-01-21 11:48:55 +00:00
Warren Buckley f6154a38d9 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs
#	src/Umbraco.Web.UI.Client/gulpfile.js
#	src/Umbraco.Web.UI/config/trees.Release.config
#	src/Umbraco.Web.UI/config/trees.config
2019-01-21 11:17:14 +00:00
Bjarke Berg a32c8b3a68 Merge pull request #4167 from umbraco/temp8-3417-macro-crud
Macro delete stuff
2019-01-21 11:36:10 +01:00
Niels Lyngsø 82d6af2013 Merge remote-tracking branch 'origin/temp8' into bugfix/temp8-media-could-not-be-moved-to-root
# Conflicts:
#	src/Umbraco.Web/Trees/ApplicationTreeController.cs
2019-01-21 11:13:08 +01:00
Sebastiaan Janssen ba4b84d7f4 Fixes #4166 - Outgoing connections sometimes fail because they require TLS 1.2 2019-01-21 11:10:01 +01:00
Bjarke Berg 57902892f9 Constructor injection 2019-01-21 10:55:48 +01:00
Stephan d4664fbae6 Merge branch 'temp8' into temp8-3668-query-builder-snippits 2019-01-21 10:50:40 +01:00
Bjarke Berg 252d31a5f5 Delete macros 2019-01-21 10:44:11 +01:00
Bjarke Berg 269273f294 Merge pull request #4165 from umbraco/temp8-3417-macro-crud
Macro CRUD angularized
2019-01-21 09:55:26 +01:00
Matthew-Wise 2744afab00 Disable LastPass on page heading (#4153) 2019-01-21 09:49:00 +01:00
Niels Lyngsø 60d86354f3 Media Picker adjustments 2019-01-21 09:46:00 +01:00
Bjarke Berg 566895d3cd Merge branch 'temp8' into temp8-3417-macro-crud 2019-01-21 09:14:40 +01:00
Bjarke Berg 3fd8c63542 - Show Ids
- Hide "Render in rich text editor and the grid" if "Use in rich text editor and the grid" is false
2019-01-21 09:10:39 +01:00
Bjarke Berg d5c6e0c6e7 - Saving paramters 2019-01-21 09:10:08 +01:00
Bjarke Berg ec57f35374 Named arguments cannot precede positional 2019-01-21 08:03:12 +01:00
Bjarke Berg 333c143005 GetPropertyValue change to Value 2019-01-21 07:59:05 +01:00
Bjarke Berg 46f7c76c0b Fixes for broken view..
- Create new UmbracoHelper (Missing parameter)
- string.replace can't handle string and IHtmlString
2019-01-21 07:54:35 +01:00
Bjarne Fyrstenborg a502be606b v8: Fix package localization (#4159) 2019-01-20 21:27:32 +01:00
Sebastiaan Janssen 0b19c07756 Merge branch 'dev-v7' into temp8
# Conflicts:
#	.github/README.md
#	src/Umbraco.Core/Constants-PropertyEditors.cs
#	src/Umbraco.Core/PropertyEditors/PropertyEditorResolver.cs
#	src/Umbraco.Web.UI.Client/src/views/media/media.restore.controller.js
#	src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs
#	src/Umbraco.Web/PropertyEditors/RelatedLinks2PropertyEditor.cs
2019-01-20 21:23:51 +01:00
Bjarne Fyrstenborg d6855d18f9 v8: Nicer delete language confirm (#4108) 2019-01-20 21:19:06 +01:00
Rasmus John Pedersen e1c9b1818e Add Multi Url Picker to core (#2323) 2019-01-20 21:12:00 +01:00
Abi Noda 76bece07ef add pull reminders badge to readme 2019-01-20 21:10:02 +01:00
Matthew Wise ba85681f8c updated css file location 2019-01-20 21:07:58 +01:00
Kenn Jacobsen 09cc3f89ed Make sure the decimal field value converter can handle double values when converting 2019-01-20 21:05:20 +01:00
Kenn Jacobsen 2c1ba1d23d Make sure the style preview text does not overlap for large font sizes 2019-01-20 21:01:32 +01:00
Bjarne Fyrstenborg 07329103b1 v8: Fix doctype iconpicker (#4053) 2019-01-20 20:56:49 +01:00
Dave Woestenborghs 7729dc946e Fix 4058 : restore from recycle bin when item has multiple relations (#4073) 2019-01-20 20:47:13 +01:00
Callum Whyte da58673b44 Removing unused insertMasterpage dialog language dictionary keys 2019-01-20 20:44:57 +01:00
Callum Whyte f8b382ea0a Eliminating bower (#4146) 2019-01-20 20:43:47 +01:00
Kenn Jacobsen abbd45c476 Remove hardcoded "Root" when restoring to tree root 2019-01-20 20:34:36 +01:00
Sebastiaan Janssen c56e84af2d Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/content/content.restore.controller.js
#	src/Umbraco.Web.UI.Client/src/views/media/media.restore.controller.js
#	src/Umbraco.Web.UI/config/umbracoSettings.Release.config
2019-01-20 20:28:52 +01:00
Stephan ed97dbc1a0 Merge branch 'temp8-appCaches' into temp8 2019-01-18 15:51:39 +01:00
Stephan 1506d8c3fa Kill AppCaches.StaticCache 2019-01-18 15:49:54 +01:00
Sebastiaan Janssen 9e7eb2ad75 Remove MySQL support 2019-01-18 15:47:22 +01:00
Stephan 3982732b7d Fix merge + cleanup 2019-01-18 15:05:20 +01:00
Dave Woestenborghs 2dc9eb3a90 #3417 handle saving of general macro data 2019-01-18 15:02:18 +01:00
Stephan 876056f0bb Merge branch temp8 into temp8-appCaches 2019-01-18 14:54:08 +01:00
Kenn Jacobsen 5b285f71fa Remove hardcoded "Root" when restoring to tree root 2019-01-18 14:39:54 +01:00
Stephan cdf38af171 Bugfix the installer 2019-01-18 14:39:39 +01:00
Bjarke Berg e637854149 Merge pull request #4057 from umbraco/temp8-4037
Manual tested, all tests are green, and code changes at fine :) Merged
2019-01-18 13:49:16 +01:00
Bjarke Berg 6fce8810fc Merge remote-tracking branch 'origin/temp8' into temp8-4037
# Conflicts:
#	src/Umbraco.Web/PropertyEditors/MultiNodePickerConfigurationTreeSource.cs
2019-01-18 13:28:57 +01:00
Niels Lyngsø 4bf17c8a4e V8 UI Color adjustments 2019-01-18 13:19:16 +01:00
Niels Lyngsø 4fbeac48eb Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-18 13:17:12 +01:00
Niels Lyngsø 8f64d8d70c correction of editorconfig for *.js and *.less 2019-01-18 13:16:59 +01:00
Stephan 01e70648ba Merge branch 'temp8-packaging-view-3996' into temp8 2019-01-18 13:04:04 +01:00
Dave Woestenborghs 7fd7d7a582 #3417 also send id of parameter with api response 2019-01-18 12:37:04 +01:00
Stephan 6f9a63d035 Merge branch 'temp8' into temp8-packaging-view-3996 2019-01-18 11:04:28 +01:00
Stephan 07238b54e1 Merge branch 'temp8-tree-sections-no-more-xml' into temp8 2019-01-18 10:59:04 +01:00
Stephan 437385fd61 Bit of cleanup 2019-01-18 10:53:51 +01:00
Callum Whyte cee1171d39 Removing masterpages support from V8 (#3971) 2019-01-18 10:53:38 +01:00
Niels Lyngsø 6dd4d7f475 V8 FE Gulp Fastdev script 2019-01-18 10:12:24 +01:00
Dave Woestenborghs a83ac4a24d #3417 retreive data for edit screen 2019-01-18 09:31:38 +01:00
Stephan a7a3fca8a8 Merge branch 'temp8' into temp8-tree-sections-no-more-xml 2019-01-18 09:23:55 +01:00
Bjarke Berg 59fe603ef7 Merge remote-tracking branch 'origin/temp8' into temp8-3668-query-builder-snippits
# Conflicts:
#	src/Umbraco.Web/PublishedContentExtensions.cs
2019-01-18 08:34:14 +01:00
Bjarke Berg 7a74a329ab Merge remote-tracking branch 'origin/bugfix/temp8-media-could-not-be-moved-to-root' into bugfix/temp8-media-could-not-be-moved-to-root 2019-01-18 08:32:21 +01:00
Bjarke Berg 0daca21b51 Merge remote-tracking branch 'origin/temp8' into bugfix/temp8-media-could-not-be-moved-to-root 2019-01-18 08:31:54 +01:00
Bjarke Berg 8e597aabf3 Merge remote-tracking branch 'origin/temp8' into feature/IContentType-removale-from-IContent 2019-01-18 08:29:43 +01:00
Stephan ec58532f7b More renaming of caches 2019-01-18 08:29:16 +01:00
Stephan f952fe7aeb More renaming of caches 2019-01-18 08:14:08 +01:00
Stephan 5aba1a6bd2 IAppPolicedCache is IAppPolicyCache 2019-01-18 07:56:38 +01:00
Mikkel Holck Madsen 6e3618f627 Merge pull request #4129 from umbraco/temp8-gridcellvalueconnector
Redecided on renaming
2019-01-17 21:38:21 +01:00
Kenneth Jakobsen 9fed610902 Redecided on renaming 2019-01-17 21:32:08 +01:00
Mikkel Holck Madsen 1d349f9eb0 Merge pull request #4128 from umbraco/temp8-gridcellvalueconnector
Removed Property parameter from IGridCellValueVConnector
2019-01-17 21:16:30 +01:00
Kenneth Jakobsen 27a1e51f80 Removed Property parameter from IGridCellValueVConnector 2019-01-17 21:12:10 +01:00
Kenn Jacobsen fa8a754f88 Don't reset templates for element types 2019-01-17 20:57:39 +01:00
Kenn Jacobsen 8f205e7d8f Hide list view config for element types 2019-01-17 20:57:18 +01:00
Kenn Jacobsen a01c313345 Hide "allow as root" and "allowed child node types" for element types 2019-01-17 20:56:47 +01:00
Kenn Jacobsen f394bed017 Change StartNodeId from string to Udi 2019-01-17 20:38:03 +01:00
Kenn Jacobsen 1ceab77aef Fix start node configuration for tree pickers 2019-01-17 20:38:03 +01:00
Stephan b3d6de5994 Merge branch 'temp8' into temp8-appCaches 2019-01-17 19:05:56 +01:00
Stephan fc29422b8d Merge remote-tracking branch 'origin/temp8' into temp8 2019-01-17 19:01:06 +01:00
Stephan 32c0d04b1b Merge branch 'temp8-3305-filter-for-current-culture-in-ipublishedcontent-linq' into temp8 2019-01-17 19:00:23 +01:00
Stephan 8ea76a92c3 Merge branch 'temp8' into temp8-3305-filter-for-current-culture-in-ipublishedcontent-linq 2019-01-17 19:00:03 +01:00
Mikkel Holck Madsen 7a68df36a3 Merge pull request #4124 from umbraco/temp8-deploy-valueconnector
- Added PropertyType parameter to IValueConnector.FromArtifact
2019-01-17 18:57:12 +01:00
mclausen 537b7e5ce9 - Added PropertyType parameter to IValueConnector.FromArtifact 2019-01-17 18:52:08 +01:00
Stephan e42995cf10 Fixes for the IPublishedContent Linq/Culture PR 2019-01-17 18:23:23 +01:00
Mikkel Holck Madsen 4234d316fe Merge pull request #4123 from umbraco/temp8-deploy-valueconnector
- Added PropertyType to The IValueConnector
2019-01-17 17:24:07 +01:00
mclausen 42f32e61e9 - Added PropertyType to The IValueConnector 2019-01-17 17:15:22 +01:00
Niels Lyngsø 89a2c1b32d Fix merge of pull request #4120 2019-01-17 17:02:12 +01:00
Warren Buckley 207bcbc10d Merge pull request #4120 from umbraco/temp8-gulp-refactoring
V8 Client Gulp factoring
2019-01-17 15:47:22 +00:00
Warren Buckley e1f1336205 Merge branch 'temp8' into temp8-gulp-refactoring
# Conflicts:
#	src/Umbraco.Web.UI.Client/gulpfile.js
#	src/Umbraco.Web.UI.Client/package-lock.json
2019-01-17 15:46:53 +00:00
Niels Lyngsø b9812ca5c4 Added processJs 2019-01-17 16:37:33 +01:00
Niels Lyngsø 9d2c4d7b08 Stick to the same approach on as used on media move dialog 2019-01-17 15:57:43 +01:00
Callum Whyte e60417925b Consistency is king! Fix up " vs ' in installer service facts array 2019-01-17 15:41:44 +01:00
Callum Whyte 5a78c000a0 Correcting punctuation in installer screen facts 2019-01-17 15:41:44 +01:00
Callum Whyte 54faeee837 Updating number of active Umbraco sites in installer screen facts 2019-01-17 15:41:44 +01:00
Nicholas-Westby cefa2c9040 Typo ("thist"). 2019-01-17 15:34:52 +01:00
Kenn Jacobsen b6f6a4015a Style the content links in the info app 2019-01-17 15:33:17 +01:00
Kenn Jacobsen adc9957504 Show the media link in the info app 2019-01-17 15:32:04 +01:00
Bjarne Fyrstenborg 74a7fd50dd v8: Fix validation error label (#4094) 2019-01-17 15:25:07 +01:00
Kenn Jacobsen 2ac175135a Fix linkpicker overlay issues - manual merge of #3718 to V8 2019-01-17 15:18:49 +01:00
Kenn Jacobsen 367fceb3cb Handle selection from treepicker search result 2019-01-17 15:15:26 +01:00
Kenn Jacobsen 2f408e1a01 Style the dialog search results 2019-01-17 15:14:17 +01:00
Kenn Jacobsen 8b178d1be7 Allow linkpicker to select items from search/list view 2019-01-17 15:13:41 +01:00
Kenn Jacobsen aca14c14ca Add some comments 2019-01-17 15:12:20 +01:00
Kenn Jacobsen 56c4dbf77f Ensure that the link picker tree always loads 2019-01-17 15:12:20 +01:00
Niels Lyngsø 5cc0f58f7d Git will now ignorer files that contains *.ignorer.* 2019-01-17 15:10:58 +01:00
Niels Lyngsø 591d100726 Corrected paths 2019-01-17 15:07:18 +01:00
Kenn Jacobsen bf9284089d Update a comment 2019-01-17 15:03:05 +01:00
Kenn Jacobsen 651006fbaf Make sure to update cculture to the last open culture when closing the split view 2019-01-17 15:03:05 +01:00
Sebastiaan Janssen 87a3350cd6 Merge pull request #4074 from kjac/v8-fix-select-content-app-for-split-view
V8: Force select the content app for both views when opening split view
2019-01-17 14:59:51 +01:00
Stephan 640b21d802 Merge branch temp8 into temp8-3305-filter-for-current-culture-in-ipublishedcontent-linq 2019-01-17 14:49:02 +01:00
Stephan b2d22f5650 Merge branch 'temp8' into feature/IContentType-removale-from-IContent 2019-01-17 14:22:45 +01:00
Stephan 650f668edb Improve PublishedModelFactory error message on collisions 2019-01-17 14:21:35 +01:00
Stephan 2eabdbb55b Improve PublishedModelFactory error message on collisions 2019-01-17 14:19:52 +01:00
Stephan e56ad2d312 Fix migration from 7.14 2019-01-17 14:14:08 +01:00
Bjarke Berg ae3c8fe08c 3908 - removed tests for legacy up and down methods 2019-01-17 14:09:17 +01:00
Bjarke Berg 37b826b82f 3908 - Fix for multiple dropdowns opening when clicking on one. 2019-01-17 14:07:56 +01:00
Niels Lyngsø d744d6aabe Gulp factoring
- Moved tasks into separate files
- Moved all configuration into gulp/config.js
2019-01-17 13:57:59 +01:00
Stephan e6bff12337 Merge branch temp8 into feature/IContentType-removale-from-IContent 2019-01-17 13:33:55 +01:00
Bjarke Berg 174db65714 3908 - Query build returns v8 valid statement - and examples of returned items 2019-01-17 13:33:44 +01:00
Stephan 2c3b65c8b1 Fix migrations from 7.14 2019-01-17 13:24:19 +01:00
Chris Houston 941ede776b Corrected all the miss spellings of:
Seperator -> Separator
Seperate -> Separate
2019-01-17 13:16:43 +01:00
Kenn Jacobsen bcda4c186f Don't allow templates on element types 2019-01-17 12:42:38 +01:00
Kenn Jacobsen 57b8a187b8 Add "Move" option for deleted items in the media tree 2019-01-17 12:27:42 +01:00
Sebastiaan Janssen 98fe3e823c Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/media/media.restore.controller.js
#	src/Umbraco.Web.UI.Client/src/views/media/restore.html
2019-01-17 12:22:01 +01:00
Kenn Jacobsen 77cf071e04 Add "Move" option for deleted items in the media tree (#3914) 2019-01-17 12:20:13 +01:00
Sebastiaan Janssen 0d0179cb47 Use constants in upgrade migration 2019-01-17 12:14:17 +01:00
Sebastiaan Janssen effed9efa7 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-17 12:08:27 +01:00
Sebastiaan Janssen e6a99c5097 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js
#	src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
#	src/Umbraco.Web/PropertyEditors/MemberGroupPickerPropertyEditor.cs
#	src/Umbraco.Web/Routing/PublishedContentRequestEngine.cs
#	src/Umbraco.Web/Scheduling/ScheduledTasks.cs
#	src/Umbraco.Web/Trees/ContentTreeController.cs
2019-01-17 12:05:56 +01:00
Stephan d4c714eccd Stop injecting the runtime cache, use AppCaches 2019-01-17 11:19:06 +01:00
Stephan 0bee01e0ee Great AppCaches renaming 2019-01-17 11:01:23 +01:00
Niels Lyngsø d6c2fec5d2 Added UI hover for expansion panel 2019-01-17 10:16:04 +01:00
Niels Lyngsø 8aaaf4439a Changed UI for resizable handler 2019-01-17 10:12:28 +01:00
Shannon 1667e914cd Allows the tree collection to be manipulated by devs on startup, renames some things 2019-01-17 18:38:55 +11:00
Stephan 67e4703821 CacheHelper becomes AppCaches 2019-01-17 08:34:29 +01:00
Robert 4ff714ae94 Merge remote-tracking branch 'origin/temp8' into temp8-4037 2019-01-17 08:10:02 +01:00
Shannon 3f89558ddb Fixing tests 2019-01-17 17:51:38 +11:00
Shannon 6b9ba3c53c Fixing tests 2019-01-17 17:50:59 +11:00
Shannon 356209e013 renames ApplicationTree to just Tree 2019-01-17 17:33:38 +11:00
Shannon 1a734141f1 Allows package manifest to declare a section 2019-01-17 17:31:29 +11:00
Shannon 9df1773b78 more cleanup 2019-01-17 17:08:58 +11:00
Shannon 77dd816c51 more cleanup 2019-01-17 17:06:22 +11:00
Shannon 0160f141f4 cleanup and explicitly registering sections 2019-01-17 17:04:53 +11:00
Shannon cfe1b17eec Gets trees and sections loading now in a much more simplified way without any xml, now to cleanup 2019-01-17 16:40:11 +11:00
Shannon 355ac09d90 WIP - moved out the tree and section service from Core, these are web only things, removes their xml parsing, fixes base controller ctor params with UmbracoContext, need to implement tree/section collections taking into account controllers and not scanning so much 2019-01-17 13:20:19 +11:00
Shannon 67c571fb28 Fixes tests 2019-01-17 10:56:24 +11:00
Stephan 5f7bf3a211 Ignore failing test 2019-01-16 17:04:15 +01:00
Dave Woestenborghs c0e62c4c5f #3417 retreive a list with parameter editors from API 2019-01-16 16:37:33 +01:00
Dave Woestenborghs b6a8ad1b6e #3417 load available partial views from api 2019-01-16 16:21:19 +01:00
Shannon Deminick c9ddd783f9 Merge pull request #4080 from umbraco/temp8-auto-install
install for Deploy
2019-01-17 01:44:27 +11:00
Shannon 899bb812aa Creates RuntimeStateOptions and pre-loads the error page on the installer 2019-01-17 01:42:56 +11:00
Bjarke Berg 664a892fd5 3305 - fixed tests 2019-01-16 15:25:42 +01:00
Stephan 3ed1b44710 Try to bugfix a failing test 2019-01-16 15:21:10 +01:00
Shannon c5da10cf10 Merge remote-tracking branch 'origin/temp8' into temp8-auto-install 2019-01-17 00:45:25 +11:00
Shannon ddcead2658 Updates EntityController to support stylesheets, languages and dictionary items GetAll so we can use it for the packager without worrying about security access to sections 2019-01-17 00:29:43 +11:00
Shannon 9ac47d6e85 Merge remote-tracking branch 'origin/temp8' into temp8-packaging-view-3996 2019-01-16 23:54:28 +11:00
Shannon 7bb3588889 Adds the whole package definition to the scope model for devs to use, adds a custom query string parameter when redirecting to the angular view after install (so devs know its a new install) 2019-01-16 23:53:10 +11:00
Stephan d170e4b5c3 Merge branch 'temp8-packages-ui' into temp8 2019-01-16 13:52:24 +01:00
Stephan 9f41457f45 Public composition.UrlProviders 2019-01-16 13:44:19 +01:00
Stephan ba84d95308 Merge branch 'temp8' into temp8-packages-ui 2019-01-16 13:27:14 +01:00
Stephan b5bda0b637 Some things have to be public for service events 2019-01-16 13:26:30 +01:00
Stephan a60bdf5c01 HttpContext VariationContextAccessor fails nicely 2019-01-16 13:26:13 +01:00
Bjarke Berg 35650536c8 3305 - Use the VariationContext instead of thread directly 2019-01-16 13:23:19 +01:00
Stephan 8347fd79a3 Reviewing packages PR, various fixes 2019-01-16 13:20:49 +01:00
Kenn Jacobsen 9ffeb34643 Whoops. Spelling. 2019-01-16 13:17:14 +01:00
Kenn Jacobsen ae97ec4277 Update the doctypes configuration help text 2019-01-16 13:16:41 +01:00
Shannon 70574b6564 Merge remote-tracking branch 'origin/temp8-packages-ui' into temp8-packaging-view-3996
# Conflicts:
#	src/Umbraco.Web.UI/umbraco/config/lang/nb.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml
2019-01-16 23:15:09 +11:00
Bjarke Berg 5f3596c7d9 Fixes after merge of temp8 2019-01-16 13:11:46 +01:00
Kenn Jacobsen 4303b4eb80 Ensure that all items passed to rendering are element types 2019-01-16 13:05:54 +01:00
Kenn Jacobsen 93f991b140 Only allow element types in the NC editor 2019-01-16 13:05:16 +01:00
Kenn Jacobsen e924a8ef83 Only return element types for the NC configuration 2019-01-16 13:04:46 +01:00
Bjarke Berg 4ccc468cb6 Merge remote-tracking branch 'origin/temp8' into feature/IContentType-removale-from-IContent
# Conflicts:
#	src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
2019-01-16 12:53:58 +01:00
Bjarke Berg fe0d0ce1c7 Merge remote-tracking branch 'origin/temp8' into temp8-3668-query-builder-snippits 2019-01-16 12:49:23 +01:00
Bjarke Berg 00158b42e7 Merge remote-tracking branch 'origin/temp8' into bugfix/temp8-media-could-not-be-moved-to-root
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/content/move.html
#	src/Umbraco.Web.UI.Client/src/views/media/restore.html
2019-01-16 11:47:13 +01:00
Bjarke Berg b4f2d514be #3305 - changed new method to be internal 2019-01-16 11:44:27 +01:00
Shannon c4418185ec Gets the angular view loading and allows navigating back to the view, cleans up non used lang keys 2019-01-16 21:27:14 +11:00
Stephan da079cf393 Merge branch 'temp8' into temp8-packages-ui 2019-01-16 10:42:52 +01:00
Stephan d0016d6a7e Upgrade to MB -alpha.33 supporting elements 2019-01-16 10:40:04 +01:00
Stephan f56e2f0c72 Merge branch temp8 into temp8-packages-ui 2019-01-16 10:02:43 +01:00
Stephan 26b31f1fc8 Fix Git repository issue with casing of some filepaths 2019-01-16 10:01:04 +01:00
Shannon 903d90aff2 Merge remote-tracking branch 'origin/temp8-packages-ui' into temp8-packaging-view-3996 2019-01-16 19:30:58 +11:00
Shannon 572c6989ce Changes control to view for the package view 2019-01-16 19:30:07 +11:00
Shannon 31545db91e Fixes routing with the packages section 2019-01-16 19:29:42 +11:00
Stephan ef3b542ff3 Merge branch temp8 into temp8-packages-ui 2019-01-16 08:54:40 +01:00
Dave Woestenborghs 5ebf51e6df #3417 added mockup of parameter editing 2019-01-16 08:40:00 +01:00
Stephan 8f9813d597 Merge branch 'temp8' into temp8-auto-install 2019-01-16 08:34:46 +01:00
Bjarke Berg 8ad998ab12 #3305 - Clean up and xml-comments 2019-01-16 08:21:24 +01:00
Bjarke Berg c71f438e62 #3305 - Uncommented irrelevant tests. These tests are irrelevant because they use the legacy XmlPublishedContent and not the NuCache 2019-01-16 08:08:13 +01:00
Bjarke Berg 5687287453 Merge remote-tracking branch 'origin/temp8' into temp8-3305-filter-for-current-culture-in-ipublishedcontent-linq
# Conflicts:
#	src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
2019-01-16 07:47:06 +01:00
Bjarke Berg a27577c17d #3305 - Handle invariants 2019-01-16 07:46:10 +01:00
Shannon e8dead52c7 renames tests 2019-01-16 17:43:12 +11:00
Shannon 94da9a6681 Gets package upgrading working along with package uninstallation with multiple versions 2019-01-16 17:25:46 +11:00
Shannon 90be93d948 Got upgrade status showing in the ui, started implementing merging the package definitions for upgrades but have decided to have an element for each install like we currenlty have in case there are problems installing. 2019-01-16 16:27:51 +11:00
Stephan d4edbc8e79 Fix tests 2019-01-15 19:38:52 +01:00
Stephan eb3d3e129c Bugfix package service 2019-01-15 19:15:06 +01:00
Stephan 4770756621 Bugfix ContentCacheRefresher 2019-01-15 18:41:02 +01:00
Stephan 1bd5127bcf Actually run HealthCheck notifier 2019-01-15 17:27:18 +01:00
Shannon 00e951c394 fixes installer with async 2019-01-16 02:35:21 +11:00
Shannon d97b100bab fixes merge 2019-01-16 02:18:02 +11:00
Shannon b34582b35c Merge remote-tracking branch 'origin/temp8' into temp8-packages-ui
# Conflicts:
#	src/Umbraco.Core/Services/Implement/PackagingService.cs
2019-01-16 02:00:44 +11:00
Shannon b7c15dc393 gets readme and our package install working 2019-01-16 01:53:08 +11:00
Robert 561ce94398 Merge pull request #3933 from umbraco/temo8-3895-infinite-editor-shortcut
Close an infinite editor through Escape key
2019-01-15 15:43:43 +01:00
Robert f9cd22d908 Added a comment explaining why we need the delay 2019-01-15 15:43:10 +01:00
Bjarke Berg f70aea4f8a Merge remote-tracking branch 'origin/temp8' into temp8-3305-filter-for-current-culture-in-ipublishedcontent-linq
# Conflicts:
#	src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
2019-01-15 15:20:56 +01:00
Bjarke Berg be02d33fd6 Merge pull request #4082 from umbraco/temp8-elements-again
Merged
2019-01-15 15:15:48 +01:00
Bjarke Berg 0b9705ca3f Revert "Revert "Support IContentType.IsElement""
This reverts commit a5efc25c
2019-01-15 15:13:10 +01:00
Bjarke Berg 11ffafacdf Revert "Revert "Identify element types""
This reverts commit ff6a9ba9
2019-01-15 15:12:59 +01:00
Robert 2e782a4f11 Mapping IsContainer into AdditionalData using IEntitySlim to EntityBasic mapper 2019-01-15 15:10:50 +01:00
Bjarke Berg 0436fb3699 Merge pull request #4081 from umbraco/tem8-elements-again
unrevert of Identify "element" content types. #4076
2019-01-15 15:07:47 +01:00
Bjarke Berg 5995a7ec84 a small change to let Git see changes 2019-01-15 15:05:04 +01:00
Shannon 20d6a3b4b4 some cleanup and ensure the package file is deleted after install 2019-01-16 01:02:21 +11:00
Bjarke Berg 16eae7c4fc #3305 Added optional culture parameter to Children and Descendants extension methods 2019-01-15 14:54:34 +01:00
Shannon db2a003444 change how the install status works, fixes infinite loop 2019-01-16 00:54:25 +11:00
Shannon 709df804e5 Updates tests and better type support for importing content 2019-01-16 00:13:40 +11:00
Shannon f6fdc9ae2d Updates test, fixes some other issues during testing 2019-01-15 23:46:58 +11:00
Stephan 62fcbd8e84 Handle max runtime level for components 2019-01-15 13:43:56 +01:00
Stephan 2a36d2625b Merge branch 'temp8' into temp8-auto-install 2019-01-15 13:38:09 +01:00
Stephan 93ba694106 Upgrade ModelsBuilder (bugfix) 2019-01-15 13:36:30 +01:00
Shannon 56ab88983a updates a test 2019-01-15 23:10:08 +11:00
Shannon 8c7d29bd02 file update missing 2019-01-15 23:03:23 +11:00
Shannon 430c95dfad Merge remote-tracking branch 'origin/temp8' into temp8-packages-ui 2019-01-15 22:59:49 +11:00
Shannon a5ff29ccc7 Gets package uninstall working, fixes other UI issues with packages 2019-01-15 22:59:13 +11:00
Bjarke Berg 2d2d0b200b Merge pull request #4014 from umbraco/temp8-40120tags-validation-bug
Fixes - temp8-40120 tags-validation-bug
2019-01-15 12:27:02 +01:00
Bjarke Berg ff6a9ba97f Revert "Identify element types"
This reverts commit 4ad2505b
2019-01-15 12:23:45 +01:00
Bjarke Berg a5efc25c81 Revert "Support IContentType.IsElement"
This reverts commit ba38b67b
2019-01-15 12:23:14 +01:00
Bjarke Berg 87b4254e39 Merge remote-tracking branch 'origin/temp8' into temp8-40120tags-validation-bug 2019-01-15 12:16:52 +01:00
Bjarke Berg 5b1ca92184 Fixes for tag validation and build 2019-01-15 12:12:35 +01:00
Bjarke Berg bdeee95300 Merge remote-tracking branch 'origin/temp8-40120tags-validation-bug' into temp8-40120tags-validation-bug 2019-01-15 12:09:41 +01:00
Shannon 44ab0991ce Package installing is working 2019-01-15 22:08:08 +11:00
Stephan ba38b67b9d Support IContentType.IsElement 2019-01-15 11:30:30 +01:00
Robert 0092cac394 DRY 2019-01-15 10:31:12 +01:00
Warren Buckley e27ea962d9 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-15 09:30:09 +00:00
Robert 9bc047c03f Adding code to re-validate on value change 2019-01-15 10:17:26 +01:00
Kenn Jacobsen 64469fcb5c Force select the content app for both views when opening split view 2019-01-15 10:03:10 +01:00
Bjarke Berg 1f87ce02a1 Merge remote-tracking branch 'origin/temp8' into feature/IContentType-removale-from-IContent 2019-01-15 09:26:00 +01:00
Sebastiaan Janssen f7671ec9a7 Fixes #4071 - Error executing scheduled task - This instance has already started one or more requests. 2019-01-15 08:39:43 +01:00
Kenn Jacobsen 862d522758 Fix the styling of the search box on the redirect url management dashboard 2019-01-14 22:53:19 +01:00
Stephan 4ad2505bea Identify element types 2019-01-14 16:56:44 +01:00
Warren Buckley 525175c939 Merge pull request #4059 from umbraco/temp8-fs
Cleanup Filesystems registrations
2019-01-14 14:56:16 +00:00
Stephan 9ba3f47690 Cleanup 2019-01-14 15:55:18 +01:00
Stephan e2fe1c8260 Refactor IValueConnector for Deploy 2019-01-14 15:01:24 +01:00
Stephan a68b19f1ee More composition / filesystems fixes 2019-01-14 14:28:19 +01:00
Robert 8e4090fb84 Added proper memberPicker in the editorService 2019-01-14 14:00:17 +01:00
Robert 1ac8bbc570 Fixes MNTP member selection tree 2019-01-14 13:23:57 +01:00
Robert 2ce3249c5e Renaming variable to allow MNTP media selection 2019-01-14 13:23:00 +01:00
Warren Buckley a8638f5f43 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI.Client/package-lock.json
2019-01-14 11:10:58 +00:00
Kenn Jacobsen b9430158ce Move member group picker property data store from NVarchar to NText (#3712) 2019-01-14 09:25:59 +01:00
Robert 6ee1c96bf0 Merge remote-tracking branch 'origin/temp8' into temp8-4037 2019-01-14 09:05:05 +01:00
Stephan c912feff28 Merge remote-tracking branch 'origin/temp8' into temp8-fs 2019-01-14 08:53:11 +01:00
Stephan 561b359a72 Name change 2019-01-14 08:53:04 +01:00
Kenn Jacobsen db8954e0a5 Verify that the current member is approved and not locked out (#3588) 2019-01-14 08:52:02 +01:00
Sebastiaan Janssen 05f1a24caf Fix duplicate IIS Express settings 2019-01-14 08:28:58 +01:00
Kenn Jacobsen b08e922600 Only allow setting up scheduled publishing if the user has the correct permissions to do so 2019-01-14 08:21:58 +01:00
Bjarke Berg aaedfe0309 Added access to the dictionary tree with we have access to the templates tree. 2019-01-14 08:14:10 +01:00
Kenn Jacobsen fbf60fbac4 Don't add the "Notification" tree menu item if Umbraco can't send emails 2019-01-14 08:13:10 +01:00
Stephan 05fbf6c38a Fix DistributedCacheBinder ContentService.TreeChanged event 2019-01-14 08:09:43 +01:00
Stephan c17ee34edb Support enlisting in exiting scope contexts (why not?) 2019-01-14 08:09:43 +01:00
Stephan eb6b172be2 Cleanup 2019-01-14 08:09:43 +01:00
Shannon b3585b0083 some cleanup 2019-01-14 18:03:06 +11:00
Shannon aa6342cc30 adds test 2019-01-14 17:56:41 +11:00
Shannon 65e98928d4 Package data installation is now all migrated 2019-01-14 17:46:12 +11:00
Sebastiaan Janssen 92c278c593 Adds missing translation, fixes #4054 2019-01-14 07:12:21 +01:00
Shannon 18c90c5325 Package file installation logic all migrated and tests are running, now to do the package data installation 2019-01-14 14:28:00 +11:00
Sebastiaan Janssen b865c6b476 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Tests/Web/Mvc/HtmlHelperExtensionMethodsTests.cs
#	src/Umbraco.Web.UI.Client/src/common/resources/codefile.resource.js
#	src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/linkpicker/linkpicker.controller.js
#	src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
#	src/Umbraco.Web/HtmlHelperRenderExtensions.cs
2019-01-13 23:22:10 +01:00
Kenn Jacobsen 941baf09ce Fix linkpicker overlay issues (#3718) 2019-01-13 16:17:44 +01:00
Anders Bjerner be44741bf9 Localized parts of the codefile and template resources (#3495) 2019-01-13 15:58:31 +01:00
Kenn Jacobsen 3b8a570c3c V8: Safeguard against invalid culture in UMB_MCULTURE cookie (#4051) 2019-01-13 15:53:42 +01:00
Kenn Jacobsen 74986d24f1 V8: Add "Move" option for deleted items in the content tree (#3931) 2019-01-13 15:49:37 +01:00
christophnz 282ac2b9c5 Added 2 HtmlHelper extension methods for rendering RelatedLinks, including Unit tests 2019-01-13 15:17:13 +01:00
Jannik Anker 1224f68297 Issue 3018 - non-admin users cannot create groups (derpness cleanup) 2019-01-13 15:13:26 +01:00
Jannik Anker 8d1733fd12 Issue 3018 - non-admin users cannot create groups 2019-01-13 15:13:26 +01:00
Bjarne Fyrstenborg 1213551ca9 Only show extension if media item has a file
(cherry picked from commit 168febae24)
2019-01-13 14:55:44 +01:00
Bjarne Fyrstenborg 9968cd257d Rename wrapper class on umb-file-dropzone 2019-01-13 14:51:59 +01:00
Bjarne Fyrstenborg 168febae24 Only show extension if media item has a file 2019-01-13 14:51:59 +01:00
Bjarne Fyrstenborg b354eda7ac Add styles for umb-property-file-upload and move styles for umb-upload-big-button 2019-01-13 14:51:59 +01:00
Steve f620d0deca Fixes #4016 unpublished content styling in list view 2019-01-13 14:43:24 +01:00
Kenn Jacobsen d350ab0789 Ensure some spacing between properties within Nested Content items 2019-01-13 14:42:58 +01:00
Kenn Jacobsen 0f7cb7c177 Use built-in localization for Nested Content + fix element picker title 2019-01-13 14:40:38 +01:00
Sebastiaan Janssen c94a6b1777 Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html
2019-01-13 14:22:00 +01:00
Kenn Jacobsen d1cfe84723 Set the form dirty when changing focal point and editing crops 2019-01-13 14:01:11 +01:00
Kenn Jacobsen cd6cdcfda4 Visualize image transparency in upload and image cropper thumbnails (#4050) 2019-01-13 13:54:30 +01:00
Sebastiaan Janssen c40d30d2dc Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-13 13:29:24 +01:00
Sebastiaan Janssen ef8ffc5149 Merge branch 'dev-v7' into temp8 2019-01-13 13:29:06 +01:00
Bjarne Fyrstenborg 2ebd7a077c Fix placeholder text when empty alias input after generating alias (#4032)
(cherry picked from commit c619b79276)
2019-01-13 13:16:00 +01:00
Bjarne Fyrstenborg c619b79276 Fix placeholder text when empty alias input after generating alias (#4032) 2019-01-13 13:06:16 +01:00
Kenn Jacobsen 291d58900f V8: Remember editor language between sessions (#4035) 2019-01-13 12:42:42 +01:00
Claus 1c401b9589 Merge branch 'kjac-v8-fix-tags-remove-setdirty' into temp8 2019-01-13 01:04:35 +01:00
Claus 5715b26bb7 Merge branch 'v8-fix-tags-remove-setdirty' of https://github.com/kjac/Umbraco-CMS into kjac-v8-fix-tags-remove-setdirty 2019-01-13 01:02:05 +01:00
Claus 21ffb5cdb9 Merge branch 'kjac-v8-fix-contentnodeinfo-js-error' into temp8 2019-01-13 00:54:40 +01:00
Kenn Jacobsen e88c789b88 Add some defensive coding to avoid JS errors 2019-01-11 15:44:54 +01:00
Robert 8f41fe8d38 Fixes MNTP only being able to open contentPicker 2019-01-11 15:17:29 +01:00
Robert 29390a3624 Fixes string to int conversion error 2019-01-11 15:15:59 +01:00
Stephan ca75b2f4d3 Fix recent Examine changes 2019-01-11 14:54:56 +01:00
Warren Buckley fded793f8e Removes the accidently Web.UI.csproj V7 port numbers for IISExpress when merging up from V7 to V8 2019-01-11 13:32:45 +00:00
Warren Buckley 5a23ca9de7 Merge pull request #4045 from umbraco/temp8-chartjs
Chartjs
2019-01-11 13:30:32 +00:00
Warren Buckley 8f1cd8110d Adds in the missing chart.js & wrapper lib (part of it was put in the solution it seems but not fully merged in correctly perhaps?!) 2019-01-11 13:27:39 +00:00
Bjarke Berg 4566b88e37 #3668 - Fixed test that was failing due to wrong setup 2019-01-11 14:21:03 +01:00
Warren Buckley 250c24de40 Adds in chart.js & the angular wrapper library 2019-01-11 12:54:50 +00:00
Warren Buckley ab565f1d27 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-11 12:18:29 +00:00
Bjarke Berg b6f4ec3cbc #3668 - Handle fallback strategy with default value and ancestor + Handle fallback strategy when the ancestor is invariant and the item is variant 2019-01-11 11:47:42 +01:00
Bjarke Berg f02bd4bca4 #3668 - Generate v8 code from "insert value" 2019-01-11 11:46:23 +01:00
Sebastiaan Janssen dcf2e4830f Merge branch 'dev-v7' into temp8
# Conflicts:
#	src/SolutionInfo.cs
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
#	src/Umbraco.Core/IO/MediaFileSystem.cs
#	src/Umbraco.Core/Media/Exif/ImageFile.cs
#	src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs
#	src/Umbraco.Core/Services/MediaService.cs
#	src/Umbraco.Web.UI.Client/src/canvasdesigner.loader.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
#	src/Umbraco.Web/Editors/ContentController.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/translation/details.aspx.cs
2019-01-11 10:23:27 +01:00
Sebastiaan Janssen 9e33581391 Merge branch 'patch-7.13.1' into dev-v7
# Conflicts:
#	src/SolutionInfo.cs
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
2019-01-11 09:53:50 +01:00
Stephan d0153b1105 Merge branch 'temp8' into temp8-auto-install 2019-01-11 08:57:59 +01:00
Bjarke Berg 586a7a167a Merged v8 2019-01-11 08:55:25 +01:00
Stephan 798c01c514 Merge pull request #4034 from aaronpowell/temp8-4033
Fixing default ProfilingLogger
2019-01-11 08:49:43 +01:00
Stephan a3fc321296 Merge branch 'temp8-examine-updates-3920' into temp8 2019-01-11 08:29:41 +01:00
Bjarke Berg 0330be4e6b Merge remote-tracking branch 'origin/temp8' into feature/IContentType-removale-from-IContent
# Conflicts:
#	src/Umbraco.Core/ContentExtensions.cs
#	src/Umbraco.Core/Models/Content.cs
#	src/Umbraco.Tests/Models/ContentTests.cs
#	src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs
#	src/Umbraco.Tests/Models/VariationTests.cs
#	src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs
#	src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs
#	src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs
#	src/Umbraco.Web.UI/Umbraco/dialogs/ChangeDocType.aspx.cs
2019-01-11 08:29:29 +01:00
Stephan ba282ab81a Comments 2019-01-11 08:26:53 +01:00
Stephan 19233c2e5f Merge branch temp8 into temp8-examine-updates-3920 2019-01-11 08:24:36 +01:00
Stephan 677311aa49 reduce allocs 2019-01-11 08:06:12 +01:00
Aaron Powell a5630a3448 Fixing 4033 by using the right Logger instance 2019-01-11 14:35:24 +11:00
Shannon c89b50f0b8 large refactor/cleanup of most of the old package installer logic dealing with persisting the installedPackages.config which is now in the services, creates new parsers and removes a ton of old code, changes fetching packages to be async, uses XElement instead of old XmlNode apis, next we need to do the actual package installer updates 2019-01-11 14:30:04 +11:00
Shannon 687aa8cc99 Merge remote-tracking branch 'origin/temp8' into temp8-packages-ui 2019-01-11 10:37:22 +11:00
Shannon 74c01af369 Splits logic for IPackageBuilder into ICreatedPackagesRepository and IInstalledPackagesRepository since it's nearly the same for both 2019-01-11 10:35:37 +11:00
Shannon Deminick 7dbd8a3515 Merge pull request #4024 from umbraco/temp8-4005
Temp8 4005
2019-01-11 10:17:22 +11:00
Warren Buckley 2e8a6c88a6 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-10 19:18:28 +00:00
Quan Tran 59349dd355 Fix - refine code 2019-01-10 19:35:51 +01:00
Quan Tran 4170faf76e add null checking 2019-01-10 19:35:51 +01:00
Sebastian Hoffback cc13b99787 Removed already deleted file canvasdesigner.panel.js from canvasdesigner.loader.js 2019-01-10 19:32:59 +01:00
Stephan 4586a55571 Merge branch 'temp8-pr3583' into temp8 2019-01-10 18:38:07 +01:00
Stephan 2baf3b5b41 Fixes 2019-01-10 18:37:48 +01:00
Stephan 09d28f720a Merge branch 'temp8' into temp8-fs 2019-01-10 16:45:50 +01:00
Stephan ed7c8da81f Merge branch 'temp8' of https://github.com/StefanoChiodino/Umbraco-CMS into temp8-pr3583 2019-01-10 16:29:36 +01:00
Stephan 003907358d Better runtime state detection, to support auto-install 2019-01-10 16:01:13 +01:00
Stephan 95ef6cd249 Merge branch 'temp8' into temp8-examine-updates-3920 2019-01-10 15:44:16 +01:00
Sebastiaan Janssen d69f0fe9dd #3993 Move color picker fix to correct method and update backwards compatibility test 2019-01-10 15:35:48 +01:00
Stephan 4700d8a69c Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-10 15:33:22 +01:00
Stephan 167084b39e Merge branch 'temp8-removes-config-based-indexes-3901' into temp8 2019-01-10 15:32:07 +01:00
Claus 875b7fc354 Merge remote-tracking branch 'origin/temp8-3642-content-templates-fixes' into temp8 2019-01-10 14:45:44 +01:00
Bjarke Berg 10d0c79c1d #3642 - also save all languages with content on publish 2019-01-10 14:28:22 +01:00
Claus 7ed66f41dc Merge branch 'temp8-3642-content-templates-fixes' into temp8 2019-01-10 14:20:51 +01:00
Stephan 7db3644fcd Merge remote-tracking branch 'origin/temp8' into temp8-removes-config-based-indexes-3901 2019-01-10 14:04:52 +01:00
Robert b000ead96b CTRL+K+D 2019-01-10 12:09:44 +01:00
Robert eafbf6dcae Update current urls on 'node.updateDate' 2019-01-10 12:07:53 +01:00
Bjarke Berg 228fca04ec #3642 - moved functionality to frontend about saving all variants the first time. 2019-01-10 10:06:42 +01:00
Kenn Jacobsen d2baf03119 Fix content picker dirty checking (#4003)
(cherry picked from commit d41dbce601)
2019-01-10 09:54:39 +01:00
Shannon 4bf3c1d05b Handles trying to create a package with a duplicate name 2019-01-10 19:27:25 +11:00
Shannon 568d5c2583 Fixes issue with redirect 2019-01-10 19:08:52 +11:00
Shannon 5cb99bfddc forgot to add the test class 2019-01-10 18:55:24 +11:00
Shannon 091c9471bb Gets macros in packages, gets the download button working to download a created package, more tests 2019-01-10 18:51:02 +11:00
Bjarke Berg d672531b0b #3642 - reuse method for determine if the content is new 2019-01-10 07:58:45 +01:00
Bjarke Berg b0b0477dab #3642 -bugfix for nonvariant 2019-01-10 07:34:28 +01:00
Shannon b8d2309b9c Gets the IPackageBuilder working and tested, now the controller can create and update packages, validation is also working, need to do some more tests for adding other entities , removes more of the old packaging code. 2019-01-10 17:18:47 +11:00
Bjarke Berg 7421378330 #3642 - use nameof instead of magic strings that has to be equal to variable name 2019-01-10 07:03:08 +01:00
Bjarke Berg 8594af3fe3 #3642 - Also do dirty checks if we have changed the culture. 2019-01-10 06:58:12 +01:00
Bjarke Berg 28d93175d5 #3642 - When saving content the first time, we need to save all variants (even when save is not true), otherwise we loose the information when the url are updated. 2019-01-10 06:56:56 +01:00
Bjarke Berg 50b98a65d3 Merge remote-tracking branch 'origin/temp8' into temp8-3642-content-templates-fixes 2019-01-10 06:26:06 +01:00
Shannon 5f972384b1 WIP - new IEntityXmlSerializer, IPackageCreation, PackageActionRunner, large refactor of entity serialization, no more IPackagingService.Export methods, ports legacy package creation code to new IPackageCreation, more more ExportEventArgs (makes no sense) 2019-01-10 12:44:57 +11:00
Stephan 944d47f669 Refactor filesystems registration 2019-01-09 17:39:32 +01:00
Stephan 2bc63b9700 fix build 2019-01-09 16:06:36 +01:00
Stephan 49668a48bc Upgrade ModelsBuilder (bugfix) 2019-01-09 15:09:16 +01:00
Sebastiaan Janssen ff085c97ce Revert "Added eslintignore file"
This reverts commit 673735c2fe.
2019-01-09 14:57:17 +01:00
Stephan 39028cd240 Upgrade ModelsBuilder (bugfix) 2019-01-09 14:09:31 +01:00
Warren Buckley 36541fa77c Merge pull request #4017 from kjac/v8-feature-content-app-badge-without-text
V8: Allow Content App badges without "count"
2019-01-09 13:01:07 +00:00
Kenn Jacobsen cd1338db82 Make the count-less badge a little bit bigger 2019-01-09 13:20:16 +01:00
Kenn Jacobsen aea41937f7 Allow content app badges without "count" 2019-01-09 13:18:27 +01:00
Warren Buckley 898f1f2397 Merge pull request #3995 from umbraco/temp8-3656-3988-fixes-for-variants
Temp8 3656 3988 fixes for variants
2019-01-09 12:00:39 +00:00
Kenn Jacobsen 10cf10b33a Set form as dirty when removing a tag 2019-01-09 12:22:55 +01:00
elitsa fe689e6855 Added timeout to for rebinding editor shortcuts, and a shortcut for a media picker. 2019-01-09 12:08:46 +01:00
Warren Buckley 6d808cb121 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-09 10:46:44 +00:00
elitsa bea740c6e0 Merge remote-tracking branch 'origin/temp8' into temo8-3895-infinite-editor-shortcut 2019-01-09 11:39:02 +01:00
Robert a809e35e5d Fixes - temp8-40120 tags-validation-bug 2019-01-09 11:29:42 +01:00
Kenn Jacobsen d41dbce601 Fix content picker dirty checking (#4003) 2019-01-09 11:20:34 +01:00
Shannon e27b873a5a Merge branch 'temp8-remove-package-ascx-3996' into temp8-packages-ui
# Conflicts:
#	src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml
#	src/Umbraco.Web/Trees/PackagesTreeController.cs
2019-01-09 20:57:02 +11:00
Sebastiaan Janssen ec60ba142a Fixes #3993 Recent changes in color picker has caused incompatibility with existing picker 2019-01-09 10:50:27 +01:00
Shannon 1772bc1e05 Merge branch 'temp8' into temp8-remove-package-ascx-3996 2019-01-09 20:47:26 +11:00
Warren Buckley 6e8b00d85c Merge pull request #3426 from kjac/v8-feature-content-app-badge
V8: Add notification badge to content app
2019-01-09 09:47:15 +00:00
Shannon fa82e1660b Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2019-01-09 20:44:17 +11:00
Shannon b3414166a6 webforms and legacy file cleanup 2019-01-09 20:43:46 +11:00
Bjarke Berg 70aa29ec7a #3642 - removed new stuff with on change event and fixed the old and broken, thats shared in tinymce 2019-01-09 10:20:01 +01:00
Stephan 9ef8e9afc1 Cleanup task runner 2019-01-09 10:05:10 +01:00
Shannon 2e558ed58d Merge branch 'temp8' into temp8-remove-package-ascx-3996 2019-01-09 19:12:01 +11:00
Shannon 4b58e34220 Align namespaces with _Legacy folder
# Conflicts:
#	src/Umbraco.Web/_Legacy/Packager/PackageInstance/InstalledPackage.cs
2019-01-09 19:08:09 +11:00
Shannon a955ef2b36 Align namespaces with _Legacy folder 2019-01-09 19:05:01 +11:00
Shannon 640de1c1a4 very small cleanup before some package code changes 2019-01-09 18:59:59 +11:00
Shannon e73884250a references the form directly 2019-01-09 18:41:52 +11:00
Shannon Deminick e6abfe0720 Merge pull request #3978 from umbraco/temp8-3708
Fixes - Fix publish/draft status for variant content when invariant p…
2019-01-09 17:03:55 +11:00
Shannon c7598bf647 changes the invariant check back since this is how it was done before in code above, plus means a later refactor of property/propertytype will be easier 2019-01-09 17:03:34 +11:00
Shannon a1ad04e04e Refactors a bit of the BuildDtos method and adds a unit test 2019-01-09 16:57:40 +11:00
Shannon 0267378bf9 Merge remote-tracking branch 'origin/temp8' into temp8-3708 2019-01-09 13:19:40 +11:00
Bjarke Berg 9bbe743686 syntax 2019-01-08 22:30:12 +01:00
Kenn Jacobsen a16e31c671 Safeguard the tags value converter against empty tags
(cherry picked from commit cc6c16894c)
2019-01-08 21:52:58 +01:00
Floris Robbemont d19a23eec6 Fix for wrong sorting overload in MediaService (#3948)
(cherry picked from commit 0852b20b31)
2019-01-08 21:50:58 +01:00
Sebastiaan Janssen 0f61de8bcd Bumps version to 7.14.0 2019-01-08 21:49:17 +01:00
Sebastiaan Janssen 5b17072d55 Bump version to 7.13.1 2019-01-08 21:45:34 +01:00
Sebastiaan Janssen 51875539b9 Fixes #4000 - 7.13.0 Creating new node as an editor causes exception
(cherry picked from commit caf7a6a1ca)
2019-01-08 21:44:17 +01:00
Sebastiaan Janssen 030fd4d375 Git clone includes a directory to clone to now,
should fix Azure Gallery release.
Tightened up the variables and paths.

(cherry picked from commit e0a38a4d9b)
2019-01-08 21:44:07 +01:00
Sebastiaan Janssen 7658fba725 Fixes #3990 All images uploaded to media section have umbracoHeight / umbracoWidth of 200x200px
(cherry picked from commit 086157cff8)
2019-01-08 21:43:53 +01:00
Sebastiaan Janssen caf7a6a1ca Fixes #4000 - 7.13.0 Creating new node as an editor causes exception 2019-01-08 21:32:47 +01:00
Stephan 349f48aa2d Refactor task runner maindom hooks 2019-01-08 20:49:21 +01:00
Warren Buckley 2422000b3e Updates RemoteDashboard so FINALLY the main image on the left loads in V8 backoffice
* Adds a new filter that uses the Angular $sce.trustAsHtml() function
2019-01-08 16:20:11 +00:00
Sebastiaan Janssen e0a38a4d9b Git clone includes a directory to clone to now,
should fix Azure Gallery release.
Tightened up the variables and paths.
2019-01-08 15:53:58 +01:00
Bjarke Berg 33ee239406 #3642 - Worked on creating blueprints 2019-01-08 15:23:05 +01:00
Bjarke Berg f2dac9df3c #3988 - Save RTE value on model.value on each change event 2019-01-08 13:59:33 +01:00
Stephan 429423c07f Unwrap wrapped filesystems 2019-01-08 12:52:16 +01:00
Sebastiaan Janssen 086157cff8 Fixes #3990 All images uploaded to media section have umbracoHeight / umbracoWidth of 200x200px 2019-01-08 12:51:14 +01:00
Bjarke Berg 89b5984794 #3695 - force the form to be dirty if any variant is still dirty 2019-01-08 11:01:28 +01:00
Dave Woestenborghs b9d779e921 #3417 prototyped the UI for settings of the macro 2019-01-08 08:34:46 +01:00
Shannon c6d13ebc39 Merge remote-tracking branch 'origin/temp8' into temp8-3708 2019-01-08 17:17:10 +11:00
Shannon 801e9da028 Fixes issue with dynamically creating/storing field definitions, latest examine update 2019-01-08 16:37:16 +11:00
Shannon 340a7e5383 Changes published index flag to y/n instead of 1/0 2019-01-08 14:04:37 +11:00
Shannon 4a1ae0573f Gets definitions dynamically applied for culture specific fields. 2019-01-08 13:25:07 +11:00
Robert e0511646af Fixes - Fix publish/draft status for variant content when invariant properties are edited 2019-01-07 16:23:26 +01:00
Shannon f7c70bde1e Fixing up the PublishedContentQuery.Search implementation 3920 2019-01-07 23:49:29 +11:00
Sebastiaan Janssen 21612454d0 Update umbtoggle.directive.js 2019-01-07 13:45:43 +01:00
Sebastiaan Janssen d53d0b4271 Add disabled state to toggle (#3967)
(cherry picked from commit d231db8ef2)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/languages/edit.html
2019-01-07 12:53:31 +01:00
Kenn Jacobsen 4564623899 Don't use a hardcoded folder type alias to determine folder types in the list view 2019-01-07 12:31:05 +01:00
Warren Buckley 9ce35d25d2 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs
2019-01-07 09:59:15 +00:00
Kenn Jacobsen cc6c16894c Safeguard the tags value converter against empty tags 2019-01-07 10:36:05 +01:00
Shannon 4ca95a11ee Fixes index populator registration and fixes the populators/rebuilders to not execute any lookups if there are no indexes 2019-01-07 18:49:55 +11:00
Dave Woestenborghs edd2adc8a0 #3417 changed path of macro tree item to use angular view instead of webform 2019-01-07 08:31:06 +01:00
Dave Woestenborghs 2ca7bb0cf3 #3417 implemented create dialog for macros 2019-01-07 08:28:50 +01:00
Shannon 0356e5a224 Updates to latest examine, fixes issue with rebuilding indexes in the back office seeming to timeout but was a problem with the callback registration in examine 2019-01-07 18:16:06 +11:00
Shannon 118ad5361a Merge remote-tracking branch 'origin/temp8' into temp8-removes-config-based-indexes-3901
# Conflicts:
#	src/Umbraco.Examine/UmbracoExamineIndex.cs
2019-01-07 16:17:58 +11:00
Shannon e20e570dc8 Fixes tests 2019-01-07 16:15:51 +11:00
Dave Woestenborghs d7af9d9fca #3417 added method to macro resource to create a macro 2019-01-04 17:36:42 +01:00
Dave Woestenborghs 03ce922124 #3417 register new api url in server variables 2019-01-04 17:10:53 +01:00
Dave Woestenborghs c61b5f947d #3417 renamed server variable 2019-01-04 13:49:03 +01:00
Floris Robbemont 0852b20b31 Fix for wrong sorting overload in MediaService (#3948) 2019-01-04 11:55:52 +00:00
Dave Woestenborghs e1906113b9 #3417 added macro api controller and create method 2019-01-04 12:31:58 +01:00
Dave Woestenborghs bb6848dd03 #3417 renamed existing macrocontroller to macro rendering controller 2019-01-04 11:44:23 +01:00
Dave Woestenborghs 8304ada528 #3417 added create view 2019-01-04 11:39:33 +01:00
Dave Woestenborghs d50061b4af Merge branch 'temp8' into temp-3417 2019-01-04 10:50:56 +01:00
Warren Buckley baa37549fb Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2019-01-03 13:52:14 +00:00
Bjarke Berg 6490f57f70 Removed commented out code. 2019-01-03 10:53:33 +01:00
Bjarke Berg eda46a16d0 Changed IContentType on IContent to a more simple class with lesser properties 2019-01-03 09:27:52 +01:00
Stephan 986a7f368f Merge branch 'temp8' into temp8-removes-config-based-indexes-3901 2019-01-02 15:37:20 +01:00
Warren Buckley 4651325d77 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
2019-01-01 19:08:59 +00:00
elitsa f1197a6db2 Adding shortcuts for closing an infinite editor through Escape key. 2018-12-27 13:23:20 +01:00
Stephan 70dd85f708 Misc fix 2018-12-21 10:38:14 +01:00
Stephan d0623bc494 Merge branch 'temp8' into temp8-removes-config-based-indexes-3901 2018-12-21 09:25:37 +01:00
Shannon 193bc74f26 removes configuration based indexes 2018-12-18 17:55:30 +11:00
Warren Buckley 3d391fdfb6 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-12-13 08:49:35 +00:00
Kenn Jacobsen e12d374ffa Merge branch 'temp8' into v8-fix-copy-media-types 2018-12-12 07:12:22 +01:00
Kenn Jacobsen ec24ebf93c Fix media type copying and move media type service unit tests to a separate class 2018-12-11 17:00:43 +01:00
Warren Buckley acc238f6ef Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-12-11 11:23:18 +00:00
Warren Buckley 20a65166be Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web/Editors/BackOfficeServerVariables.cs
2018-12-10 14:31:03 +00:00
Mads Rasmussen 2f7772d40a fix control picker 2018-12-07 15:19:41 +01:00
Mads Rasmussen 53d7023b40 fix file picker 2018-12-07 15:01:12 +01:00
Mads Rasmussen ce3729678e fix dictionary items and data types 2018-12-07 13:25:07 +01:00
Mads Rasmussen 90b0a8b14b correct binding of languages 2018-12-07 13:20:28 +01:00
Mads Rasmussen a411d13d0e fix binding of documenttypes and templates 2018-12-07 13:10:50 +01:00
Warren Buckley f390e2979d Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Core/EnumerableExtensions.cs
2018-12-07 12:06:23 +00:00
Warren Buckley bb5a561932 Wiring up server side validation in the UI 2018-12-07 11:43:36 +00:00
Warren Buckley c94cfc0156 Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-07 10:37:47 +00:00
Warren Buckley b35a8b406b Fix API Controller for Package create to support new entry & update existing entry 2018-12-07 10:37:33 +00:00
Mads Rasmussen 8252f4d95a clear create query string when using back button 2018-12-07 11:31:33 +01:00
Warren Buckley c7b49d928a Adds in validation to the POST / Create package to ensure name, author is set etc... 2018-12-07 10:22:33 +00:00
Mads Rasmussen 5d3432db51 get render model for content item 2018-12-07 11:15:08 +01:00
Warren Buckley ac3d82b2d8 Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-07 09:30:10 +00:00
Warren Buckley a9aba6731d Update to CreatePackage API endpoint - the ID & Guid was getting overwritten by mistake 2018-12-07 09:29:44 +00:00
Mads Rasmussen fbf29f9f47 bind stylesheets correctly 2018-12-07 10:13:55 +01:00
Mads Rasmussen 6566a43ef9 change end point for delete created package 2018-12-07 10:05:31 +01:00
Warren Buckley 7f380347dc Some WIP binding updates in the view - will mostly need to bind an array of integers back to items 2018-12-06 15:35:40 +00:00
Warren Buckley 2013fd1619 Try the MakeNew method on CreatedPackage() 2018-12-06 14:41:53 +00:00
Mads Rasmussen 57f462b204 wire up create package 2018-12-06 15:26:12 +01:00
Warren Buckley c67cb46510 Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-06 13:55:44 +00:00
Warren Buckley 6f5155b0f3 Adds in new attribute to override the specific PackageController JSON Serializer to use the NewtonSoft built-in VersionConvertor 2018-12-06 13:54:38 +00:00
Mads Rasmussen e566e240b1 prefill umbraco version number 2018-12-06 14:49:02 +01:00
Warren Buckley 6c25062e4b Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-06 13:09:59 +00:00
Warren Buckley 34dc81058a Move the Delete method over into our new controller 2018-12-06 13:09:34 +00:00
Mads Rasmussen 9409b46ef4 fix back buttons 2018-12-06 13:57:21 +01:00
Mads Rasmussen 7df0869649 wire up delete 2018-12-06 13:13:55 +01:00
Mads Rasmussen 3c399ade16 last textarea should be actions 2018-12-06 12:50:08 +01:00
Warren Buckley dfe224486c Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-06 11:21:42 +00:00
Warren Buckley 465229fb39 Return PackageInstance as opposed to CreatedPackage in API responses 2018-12-06 11:21:28 +00:00
Warren Buckley c7e6cf44ed Anotate model so its camelCase friendly for API responses for Mads 2018-12-06 11:21:01 +00:00
Mads Rasmussen 452f97de62 wire up get created package by id 2018-12-06 11:53:26 +01:00
Warren Buckley 17a005c163 Fix up Umbraco.Sys object URL to API endpoint 2018-12-06 10:42:05 +00:00
Mads Rasmussen 68006f78ee wire up end point for get created packages 2018-12-06 11:33:03 +01:00
Warren Buckley de86dace70 Adds a Create/Publish method - will need to figure out validation 2018-12-06 10:18:31 +00:00
Warren Buckley cd8bb8ed99 Adds the package api controller to Umbraco.Sys JS object 2018-12-06 10:07:53 +00:00
Warren Buckley 9df8c71bf4 Adds in Delete method 2018-12-06 09:54:21 +00:00
Warren Buckley 17d489bb54 Adds new API/Editor endpoint to deal with created packages - get methods 2018-12-06 09:50:05 +00:00
Warren Buckley 046b35e242 Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-06 09:32:42 +00:00
Warren Buckley 3546de3207 Update packages tree so that its a full screen app/section like users 2018-12-06 09:32:04 +00:00
Mads Rasmussen 849cc2d383 remove tree sync for packages and users as we don't have a tree 2018-12-06 10:20:48 +01:00
Warren Buckley 5870db0273 Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui 2018-12-05 15:15:58 +00:00
Warren Buckley 8425c3124d Modify FileSystemTree Controller - that if * is used for file extension then we will return all files :) 2018-12-05 15:15:45 +00:00
Mads Rasmussen 74d9945e09 Add title to files and control pickers 2018-12-05 15:42:44 +01:00
Mads Rasmussen 749a25aabb user overlayService for ysods 2018-12-05 15:41:55 +01:00
Warren Buckley 28c4b2ee7f Merge branch 'temp8-packages-ui' of https://github.com/umbraco/Umbraco-CMS into temp8-packages-ui
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/packages/edit.controller.js
2018-12-05 14:29:32 +00:00
Warren Buckley 00428ec2de Adds in new hidden aka initialized=false tree (so that it can be displayed only as a dialog/infinite editor) to display files & folders from root of the site for the package creator UI 2018-12-05 14:28:07 +00:00
Mads Rasmussen d77796bcac show selected files and control 2018-12-05 15:06:50 +01:00
Mads Rasmussen e599685684 wip file pickers ui 2018-12-05 14:20:34 +01:00
Mads Rasmussen bd505a8574 get doctypes, datatypes, languages etc from the server and bind selection to model + add content picker 2018-12-05 13:37:01 +01:00
Mads Rasmussen a4bdcf99b1 wip create package editor 2018-12-05 10:36:20 +01:00
Mads Rasmussen bd455aaede fixing up styles to better fit new UI 2018-12-04 11:19:08 +01:00
Mads Rasmussen 04e8fc7fa3 fix missing form from install local package 2018-12-04 11:18:32 +01:00
Mads Rasmussen cb7c1f9bbd use table for installed packages 2018-12-04 11:18:12 +01:00
Warren Buckley e620d26769 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI.Client/package.json
#	src/Umbraco.Web/UI/JavaScript/JsInitialize.js
2018-12-03 13:28:07 +00:00
Warren Buckley b5e12aa29e Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-30 08:34:09 +00:00
Warren Buckley cbc6a2ddfd Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-28 20:18:56 +00:00
Warren Buckley 9b39c6ad5b Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-27 08:47:04 +00:00
Bjarke Berg a50a46f9fa Alt of "close dialog" buttons was not functioning on the success message 2018-11-26 07:50:15 +01:00
Bjarke Berg e8818b36bd Media could not be moved to the root (The root was not available as target) 2018-11-26 07:49:32 +01:00
Warren Buckley 7eee1ac76c Merge remote-tracking branch 'origin/temp8-tinymce' into temp8-logviewer 2018-11-22 14:18:58 +00:00
Warren Buckley 9f2043c68d Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-22 11:19:56 +00:00
Warren Buckley 880176e91e Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-21 13:16:56 +00:00
Warren Buckley 1452a702e0 More tests for LogViewer around fetching logs & getting the results we expect back 2018-11-19 14:23:07 +00:00
Warren Buckley 28fa60ea46 Fix when querying logs with invalid log level passed in as a string filter - now checks its valid/part of the enum 2018-11-19 14:22:29 +00:00
Stefano Chiodino e2455b14d9 Don't serialise null template id to 0. Use empty string instead as null doesn't work in this case. 2018-11-17 10:59:26 +00:00
Warren Buckley f6b0b35ff7 Couple more tests for logviewer 2018-11-16 15:16:18 +00:00
Warren Buckley c62f25c9a8 Adds two more new tests - perisistance with the saved search file & checking log counts are what we expect 2018-11-16 14:26:56 +00:00
Warren Buckley 1d093b4ecb Im clearly not with it today - heres that missing unit test 2018-11-16 13:46:24 +00:00
Warren Buckley b8409cdd2e Forgot to commit the test class file in previous commit
But now we have our first test running, checking that it failed & it now passes as expected
2018-11-16 13:44:29 +00:00
Warren Buckley d9dc32edcb Adds in example log file & JSON saved search file
Unit test class preps/copies files in setup/teardown as needed
2018-11-16 13:32:43 +00:00
Warren Buckley b1244dfa1b Update JsonLogViewer & undelrying base class to support setting path to log files & path to search file - so can be used in testing 2018-11-16 13:20:21 +00:00
Warren Buckley b22ae2cf9f Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-16 12:55:04 +00:00
Dave Woestenborghs 818e9f8b4c 3417 - don't use legacy action for create method 2018-11-15 15:28:35 +01:00
Stefano Chiodino 470585b50d Fix some more tests that were counting on defaulting to 0 2018-11-15 08:01:54 +00:00
Stefano Chiodino cc8cb96140 The change to nullable expands to even more neighbors... 2018-11-15 07:23:09 +00:00
Stefano Chiodino 8275050dee Comes to terms that we are now using nullables...spread the word to all other types that use a template ID one way or another. 2018-11-15 06:48:25 +00:00
Warren Buckley 23c4f88ce7 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-14 10:09:49 +00:00
Stefano Chiodino 6dd260a825 Update DocumentRepositoryTest.cs 2018-11-13 16:20:11 +00:00
Stefano Chiodino 8183f32399 Update DocumentRepository.cs 2018-11-13 16:18:40 +00:00
Stefano Chiodino 7c971b8366 Update DocumentRepository.cs 2018-11-13 16:17:45 +00:00
Warren Buckley 8f6af7b41e Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-13 15:08:17 +00:00
Stefano Chiodino 4a4a897ab1 Find that DB schema isn't happy with TemplateId being zero, using nullable instead 2018-11-08 16:46:12 +00:00
Stefano Chiodino ccd6711a8a cleanup 2018-11-08 14:30:01 +00:00
Stefano Chiodino 2e3cf979d3 #3544: Fix IFileService resolution (now it runs and seem functional) 2018-11-08 13:57:59 +00:00
Kenn Jacobsen 04d6704766 Change badge color from boolean (alert=true/false) to string (type=warning/error) 2018-11-08 14:56:43 +01:00
Kenn Jacobsen 75e1c9a0ae Merge branch 'v8-feature-content-app-badge' of https://github.com/kjac/Umbraco-CMS into v8-feature-content-app-badge 2018-11-08 14:28:33 +01:00
Kenn Jacobsen 355447d4e2 Merge branch 'temp8' into v8-feature-content-app-badge 2018-11-08 14:28:16 +01:00
Stefano Chiodino 993972fa62 #3544: change template reference for its ID (WIP: it builds) 2018-11-08 13:24:34 +00:00
Warren Buckley 5cc4370dc1 Fix log message templates to not use single quotes - as not helpful for searching with logviewer 2018-11-08 13:09:26 +00:00
Warren Buckley 1d5ae45b06 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-08 09:58:56 +00:00
Dave Woestenborghs 271e01262f #3434 set correct labels 2018-11-07 10:53:23 +01:00
Dave Woestenborghs b25413abcd #3434 show indication on designer that property is varied by culture 2018-11-07 10:47:13 +01:00
Dave Woestenborghs 7bfce6e428 #3434 refactored toggle functions 2018-11-07 10:39:11 +01:00
Dave Woestenborghs ecb4e00516 #3434 changed checkboxes on member property settings to toggles 2018-11-07 10:31:16 +01:00
Dave Woestenborghs 110ecc5fda #3434 use toggle for mandatory validation on property type settings and made a better distinction between mandatory and custom validation 2018-11-07 10:09:04 +01:00
Dave Woestenborghs d0908895dd #3434 removed usage of subview-classes 2018-11-07 09:48:31 +01:00
Warren Buckley a5e9ce515f Merge branch 'temp8' into temp8-logviewer 2018-11-06 11:46:46 +00:00
Warren Buckley 21be52c60a Merge branch 'temp8' into temp8-logviewer 2018-11-06 08:43:39 +00:00
Warren Buckley 7091658a3b Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-02 15:34:09 +00:00
Warren Buckley 2f6e66184f Adds UmbracoFeatures to the Composition to allow user components to do something like this - composition.Features().Disabled.Controllers.Add<LogViewerTreeController>() 2018-11-02 15:33:43 +00:00
Warren Buckley c5b7543e54 Update to pass dates through correctly 2018-11-02 15:32:37 +00:00
Warren Buckley 7a23fdc1ea Update logic for pre-flight check 2018-11-02 11:09:59 +00:00
Warren Buckley 758eea479d Move the logic for checking can view logs out to a bool so it can be reused in the other API method calls 2018-11-01 16:24:48 +00:00
Warren Buckley 398134251e Add in some TODO notes to pickup from next time I get time to hack on this 2018-11-01 16:19:18 +00:00
Warren Buckley 24a6aecd73 Adds in a new API endpoint to get the size of logs - which will determine to display a warning message if the filesize is too big to read (to help prevent the CPU & memory being eaten up & killing the site) 2018-11-01 16:14:03 +00:00
Warren Buckley ef30c1f005 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-11-01 09:16:04 +00:00
Warren Buckley 39bb4f3a1e Merge branch 'temp8' into temp8-logviewer 2018-10-31 14:33:40 +00:00
Warren Buckley 569241eba3 Bumped [Tree] attribute type finder tests to 22 as now there is a new tree for log viewer 2018-10-31 11:18:55 +00:00
Warren Buckley bce6375300 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-10-31 11:11:29 +00:00
Warren Buckley 56f1637631 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-10-30 15:59:33 +00:00
Warren Buckley ee8da06638 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-10-30 12:47:18 +00:00
Warren Buckley 1c9a960f3d Remove the date picker ranges - as not sure how to do the UI/UX best for this 2018-10-30 12:46:54 +00:00
Warren Buckley 436a6df917 Fix up log viewer - if viewing all log items & filterExpression is null or emtpy string return all log items 2018-10-30 12:33:28 +00:00
Warren Buckley 45e892a4b1 Now that developer section is no more - update the routes to use 'settings' 2018-10-29 14:41:14 +00:00
Warren Buckley f2667210b7 Add in chartjs & angular wrapper lib into the gulp to ensure they get copied over from node_modules 2018-10-29 11:15:37 +00:00
Warren Buckley dce485bc6f Adds chartjs & the angular wrapper lib to package.json now that bower has been removed 2018-10-29 10:41:58 +00:00
Warren Buckley 5b1e7e9b3d Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Core/Constants-Applications.cs
#	src/Umbraco.Web.UI.Client/bower.json
2018-10-29 10:34:23 +00:00
Dave Woestenborghs 397b3ca69f #3434 use toggle for varying by culture on property settings dialog in content type designer 2018-10-29 11:02:53 +01:00
Kenn Jacobsen abcdfc27c5 Add a white border around the badge to make it stand out if it overlaps the app icon 2018-10-24 20:15:17 +02:00
Kenn Jacobsen 634c2072ca Add optional alert color 2018-10-24 15:49:35 +02:00
Kenn Jacobsen 25718dbe5a Add content app badges 2018-10-24 12:05:25 +02:00
Warren Buckley 92aa41fe33 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-10-10 16:42:44 +01:00
Warren Buckley 3c747a1be6 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI/config/trees.Release.config
#	src/Umbraco.Web.UI/config/trees.config
2018-10-09 13:34:19 +01:00
Warren Buckley 0dcbc9f303 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-10-04 15:15:20 +01:00
Warren Buckley 5084c82ac7 Suggestion after talking with Stephane for some refactorings 2018-10-04 15:13:56 +01:00
Warren Buckley 45b5cb0257 Move the tree from developer section to settings section - as we say goodbye to the developer section 2018-10-03 17:43:42 +01:00
Warren Buckley cb166526dc Merge remote-tracking branch 'origin/temp8' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI.Client/package-lock.json
2018-10-03 16:49:37 +01:00
Warren Buckley 01c3585bd8 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-09-30 21:56:17 +01:00
Warren Buckley e0414414d7 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-09-27 10:14:57 +01:00
Warren Buckley 168f4d33d3 Update failing test - as the numkber of trees has increased (Added the Log Viewer tree controller & type attribute) 2018-09-26 18:24:40 +01:00
Warren Buckley e92563ffd8 Merge remote-tracking branch 'origin/temp8' into temp8-logviewer (Diff from temp8 branch & ChartJS stuff merged in together now)
# Conflicts:
#	src/Umbraco.Web.UI.Client/bower.json
2018-09-26 15:37:05 +01:00
Warren Buckley 964dd0374d Makes SavedSearches Get, Add & Delete methods virtual - as you may only want to implement the GetLogs but NOT the GetSavedSearch method for example 2018-09-24 13:12:30 +01:00
Warren Buckley 23245a578a Merge remote-tracking branch 'origin/temp8' into temp8-logviewer 2018-09-20 11:03:38 +01:00
Warren Buckley 2ed048e4e1 Improves logic for single word search to use Message Like expression - Thanks Dan Booth
Co-authored-by: Dan Booth <dan@diplo.co.uk>
Co-authored-by: Warren Buckley <warren@umbraco.com>
2018-09-19 21:22:10 +01:00
Warren Buckley b54998f0af Adds 'lq' aka Log Query Search querystring to be ignored for reloading the view & controller for the log viewer search 2018-09-19 15:03:34 +01:00
Warren Buckley 9f5fe7ddfe Adds some logic if we get 0 results back and the search expression contains no spaces (we retry with a message like filter)
Moves some of the logic into methods - as we end up reusing it
2018-09-18 21:50:31 +01:00
Warren Buckley 1931011152 Adds in confirmation delete dialog for saved searches 2018-09-14 15:25:55 +01:00
Warren Buckley 2f9459f296 Adds in functionality to remove items from the saved searches - Thanks Dan Booth
Co-authored-by: Dan Booth <dan@diplo.co.uk>
Co-authored-by: Warren Buckley <warren@umbraco.com>
2018-09-14 15:17:12 +01:00
Warren Buckley 78b8e78761 Merge branch 'temp8' into temp8-logviewer 2018-09-14 13:49:27 +01:00
Warren Buckley 33fae0cd40 Fixup the back button to remove the lq querystring 2018-09-13 11:53:40 +01:00
Warren Buckley 2a0d73220a Merge branch 'temp8' into temp8-logviewer 2018-09-13 11:45:53 +01:00
Warren Buckley 9f484d0fe2 Update the overview page to link through to the search page and read the lq (log query) querystring 2018-09-13 11:30:50 +01:00
Warren Buckley 5bbe17af54 Start work on getting an overview page that will be entry point with shiny graphs and numbers before jumping over to search page 2018-09-12 22:46:58 +01:00
Warren Buckley 603a1c7814 Log property is now Duration as opposed to TimingDuration (A few diff logtypes that store ms all use same prop name of Duration) 2018-09-12 21:49:59 +01:00
Warren Buckley 6bee3a421f Make search page full width & remove some variables & func's in controller that is no longer needed (as will move to an overview/welcome type dashboard) 2018-09-12 21:46:22 +01:00
Warren Buckley 385bc9c770 Rename overview to search (so I can start maming this view focus only on searching) 2018-09-12 21:22:40 +01:00
Warren Buckley bad002b58a Same feature in Dan Booth's Log Viewer for Find Log message in Search places (Thx Dan Booth) 2018-09-12 16:57:03 +01:00
Warren Buckley a3a95c0f9d Makes the special links to find related values not buttons but simplier links with search icon (Thx Dan Booth) 2018-09-12 16:53:17 +01:00
Warren Buckley 142a319776 Adds full RAW timestamp to properties table (Thx Dan Booth) 2018-09-12 16:52:32 +01:00
Warren Buckley 756e0bbbe1 Update Machine name column in main table to take some less space (Thx Dan Booth) 2018-09-12 16:52:04 +01:00
Warren Buckley 1839c5b3a8 Wraps search input field with ng-form and updates button to submit so that we can then allow users to hit enter key to perform a search 2018-09-12 16:49:31 +01:00
Warren Buckley 3886d47c57 Forgot to add the WebAPI method for PostSavedSearch 2018-09-12 16:47:36 +01:00
Warren Buckley 962bdcf1b4 Remove dupe code 2018-09-12 16:38:35 +01:00
Warren Buckley 630a8af217 Adds in some example SQL like style queries 2018-09-12 16:30:10 +01:00
Warren Buckley 57a7cf3903 We can now save a query to the JSON file on disk now - for our cheap persistence layer 2018-09-12 16:14:42 +01:00
Warren Buckley 4501368cc3 Adds in UI for new overlay to add a logviewer saved search - will need to add API method in C# and AngularJS Resource etc 2018-09-12 14:38:43 +01:00
Warren Buckley 0933443cb3 Adds in new API endpoint that get the saved search - our default implmentation gets them from a JSON file off disk
* If the API call fails then we load in some defaults
* The GetSavedSearches is Abstract so along with the GetLogs the GetSavedSearches could be custom implemented if it needed to come from a DB or some other location for dev's needs
2018-09-12 11:35:51 +01:00
Warren Buckley c3cfee7b2c Need to use the EscapleLikeExpression method instead for the fallback check 2018-09-12 11:33:19 +01:00
Warren Buckley d38e4a0442 Adds in fallback logic to do a search on @Message which is the rendered message template along with a SQL like. Thanks Diplo aka Dan Booth
@Message like '%find me%'
2018-09-11 15:06:35 +01:00
Warren Buckley 851c11153f Merge remote-tracking branch 'origin/temp8-MOAR-LOGGING' into temp8-logviewer 2018-09-11 09:18:11 +01:00
Warren Buckley 6d7fcb7d64 Adds buttons to find logs with a request number OR with a namespace/sourcecontext 2018-09-10 15:23:41 +01:00
Warren Buckley 0844cb15e0 Adds a clear/reset cross button in search box
Adds @MessageTemplate when listing out properties
Makes the dropdown level filter to be same as badges in main log list
2018-09-10 14:44:07 +01:00
Warren Buckley 53bdef68f4 * Click on a message template in right column - searches for it
* Show more button - to list out more/all message templates
* Get the variant style dropdown to work & display example queries
2018-09-10 11:23:48 +01:00
Warren Buckley c7bff0f9ff Update csproj after recent merge from MOAR logging branch 2018-09-10 11:22:32 +01:00
Warren Buckley 64384dc8b3 Merge remote-tracking branch 'origin/temp8-MOAR-LOGGING' into temp8-logviewer 2018-09-10 10:31:16 +01:00
Warren Buckley ce83e25390 Adds in a little better CSS styling for the error ex message block than a massive RED background
Starts work on getting the dropdown for some example queries setup
2018-09-10 10:30:23 +01:00
Warren Buckley 8cd28a62ea Rename CommonLogMessage to LogTemplate 2018-09-10 09:40:21 +01:00
Warren Buckley c403df1990 Update to Common Log Messages - it now returns all unique message templates and their counts
In the UI we display the total count of unique but use LimitTo AngularJS filter to continue to display 10 items
Returning all items so that we have a way to show the next 10 items or similar
2018-09-07 21:43:44 +01:00
Warren b4164521f7 Update UI for logviewer - toggle sort order by clicking table header name for timestamp 2018-09-04 13:16:01 +01:00
Warren ab3c5d4d52 Adds in same UI from user overview filters - to add dropdown list of checkboxes to filter by log levels 2018-09-03 21:30:16 +01:00
Warren 96d76c211c Adds in support for log level filtering - rather than using expressions 2018-09-03 21:29:13 +01:00
Warren 20cf8a7637 Create a base class - so we can have the GetLogs implemented by 3rd party devs. Say from Azure Table Storage for example 2018-08-31 21:57:51 +01:00
Warren b15e8a13db * Attempt to get date picker components setup
* Output ex nicer
* Add log level colours to badges
* Output date in friendlier format
2018-08-30 16:26:11 +01:00
Warren c3fa12be6e Exception needs to be a string as Serilog cant easily convert JSON serialised EX back to proper exceptions so we call ToString on it instead 2018-08-30 16:24:34 +01:00
Warren 04f7b14702 * Click to toggle row to see the log properties & ex if present
* Toggle timestamp order by ascending or descending
2018-08-30 14:27:31 +01:00
Warren 08618b653c Gets the rough wrieframe to use real API data now
* List number of total errors
* Pie Chart of log level counts
* Message counts
* Log items with paging & searching
2018-08-30 12:42:43 +01:00
Warren cce70f139c Changed to LogViewer as Logs in solution refers to AuditLogs so this makes it more explicit 2018-08-30 09:59:53 +01:00
Warren e4c7609675 Fixes paging and uses the same Serilog Expression filtering when setting up loggers to query the same LogEvents loaded into memory
* StartsWith(SourceContext, 'Umbraco.Core')
* StartsWith(SourceContext, 'Umbraco.Core') and @MessageTemplate='[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)'
* @MessageTemplate='[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)' and TimingDuration > 1000
2018-08-29 19:11:20 +01:00
Warren cc915d6ef1 Adds in URL to WebAPI/Editor to Umbraco.Sys global JS object 2018-08-29 19:01:26 +01:00
Warren 38e8feb588 Renames LogsController to LogViewerController to be more explicit only as we have a LogController already for audit logs 2018-08-29 18:42:12 +01:00
Warren fcf8290df9 Update WebAPI method for GetLogs so that we can test out some Expression filter queries in POSTMAN 2018-08-29 18:37:37 +01:00
Warren 424ae7bb91 WIP to open a range of log files 2018-08-28 21:12:38 +01:00
Warren 4ce33c4e3d Updates signature with start/end date and prep for returning paginated logs items 2018-08-28 18:30:58 +01:00
Warren 50e3f84759 As new extension method - to set order by descending or ascending with a property 2018-08-28 18:29:05 +01:00
Warren fbd48b0bd7 Merge commit 'a151829b265b2b6def44b6df76668657469941f6' into temp8-logviewer
# Conflicts:
#	src/Umbraco.Web.UI.Client/bower.json
2018-08-28 14:53:00 +01:00
Warren 152ddbd252 Adds LogViewerComponent & registers singleton in DI (3rd party devs will have to disable this component & register their own implementation)
Get some more of the basic WebAPI stubs fleshed out to get some data to start using in the UI layer
2018-08-28 14:48:54 +01:00
Warren 3e75c69f10 Merge branch 'temp8-serilog' into temp8-logviewer 2018-08-28 11:27:11 +01:00
Warren df13af9dc2 Attempt to get a WebAPI Controller setup 2018-08-27 20:05:59 +01:00
Warren cae468eaeb Some rough untested POC code to read JSON log file from disk 2018-08-27 20:05:17 +01:00
Warren cb5dca5544 More rough UI work - to figure out how it should look or work 2018-08-24 15:02:38 +01:00
Warren fbba60a56b Super rough - WIP UI/layout with a working chart with fake data 2018-08-24 12:58:50 +01:00
Warren 4d66b21084 Adds in chart.js Angular Wrapper lib 2018-08-24 12:57:59 +01:00
Warren 1a89fea816 Adds a Logs Tree controller in the Developer section 2018-08-24 10:53:53 +01:00
2334 changed files with 42743 additions and 59428 deletions
+4 -1
View File
@@ -34,4 +34,7 @@ dotnet_naming_style.prefix_underscore.required_prefix = _
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
csharp_prefer_braces = false : none
csharp_prefer_braces = false : none
[*.{js,less}]
trim_trailing_whitespace = false
-1
View File
@@ -104,7 +104,6 @@ There's two big areas that you should know about:
You may need to run the following commands to set up gulp properly:
```
npm cache clean
npm install -g bower
npm install -g gulp
npm install -g gulp-cli
npm install
+2 -1
View File
@@ -1,4 +1,5 @@
_You are browsing the Umbraco v8 branch. Umbraco 8 is currently under development._
[![pullreminders](https://pullreminders.com/badge.svg)](https://pullreminders.com?ref=badge)
_Looking for Umbraco version 7? [Click here](https://github.com/umbraco/Umbraco-CMS) to go to the v7 branch._
@@ -6,7 +7,7 @@ _Ready to try out Version 8? [See the quick start guide](V8_GETTING_STARTED.md).
When is Umbraco 8 coming?
=========================
When it's ready. We're done with the major parts of the architecture work and are focusing on three seperate tracks to prepare Umbraco 8 for release:
When it's ready. We're done with the major parts of the architecture work and are focusing on three separate tracks to prepare Umbraco 8 for release:
1) Editor Track (_currently in progress_). Without editors, there's no market for Umbraco. So we want to make sure that Umbraco 8 is full of love for editors.
2) Partner Track. Without anyone implementing Umbraco, there's nothing for editors to update. So we want to make sure that Umbraco 8 is a joy to implement
3) Contributor Track. Without our fabulous ecosystem of both individual Umbracians and 3rd party ISVs, Umbraco wouldn't be as rich a platform as it is today. We want to make sure that it's easy, straight forward and as backwards-compatible as possible to create packages for Umbraco
+1 -1
View File
@@ -11,7 +11,7 @@
* Open the `/src/umbraco.sln` Visual Studio solution
* Start the solution (easiest way is to use `ctrl + F5`)
* When the solution is first built this may take some time since it will restore all nuget, npm and bower packages, build the .net solution and also build the angular solution
* When the solution is first built this may take some time since it will restore all nuget and npm packages, build the .net solution and also build the angular solution
* When the website starts you'll see the Umbraco installer and just follow the prompts
* You're all set!
+163 -159
View File
@@ -1,159 +1,163 @@
#
# Umbraco Cms Git Ignore
#
# common files
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
*.orig
*.suo
*.vs10x
*.ndproj
# common directories
.DS_Store
._.DS_Store
.vs/
/local/
# build directories
[Bb]in/
[Db]ebug*/
[Rr]elease*/
obj/
# tools
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
tools/NDepend/
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
[sS]ource
[sS]andbox
umbraco.config
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
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
src/Umbraco.Web.UI/[Cc]onfig/ClientDependency.config
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
node_modules
lib-bower
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/*.loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/init.js
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/canvasdesigner.*.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/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
src/Umbraco.Web.UI.Client/vwd.webinfo
src/Umbraco.Web.UI/App_Plugins/*
src/*.psess
src/*.vspx
NDependOut/*
QueryResult.htm
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
src/Umbraco.Web.UI/[Uu]mbraco/plugins/*
build/ApiDocs/*
build/ApiDocs/Output/*
src/Umbraco.Web.UI.Client/bower_components/*
/src/Umbraco.Web.UI/[Uu]mbraco/preview
/src/Umbraco.Web.UI/[Uu]mbraco/preview.old
# ignore rule for clearing out Belle (avoid rebuilding all the time)
preserve.belle
#Ignore Rule for output of generated documentation files from Grunt docserve
src/Umbraco.Web.UI.Client/docs/api
src/*.boltdata/
src/umbraco.sln.ide/*
src/.vs/
src/Umbraco.Web.UI/[Jj]s/*
src/Umbraco.Tests/[Mm]edia
tools/docfx/*
apidocs/_site/*
src/*/project.lock.json
src/.idea/*
apidocs/api/*
build/docs.zip
build/ui-docs.zip
build/csharp-docs.zip
src/packages/
src/PrecompiledWeb/*
# build
build.out/
build.tmp/
build/hooks/
build/temp/
# eof
#
# Umbraco Cms Git Ignore
#
# common files
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
*.orig
*.suo
*.vs10x
*.ndproj
*.ignorer.*
# common directories
.DS_Store
._.DS_Store
.vs/
/local/
# build directories
[Bb]in/
[Db]ebug*/
[Rr]elease*/
obj/
# tools
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
tools/NDepend/
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
[sS]ource
[sS]andbox
umbraco.config
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
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
src/Umbraco.Web.UI/[Cc]onfig/ClientDependency.config
src/Umbraco.Web.UI/[Cc]onfig/serilog.config
src/Umbraco.Web.UI/[Cc]onfig/serilog.user.config
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
node_modules
lib-bower
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/*.loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/init.js
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/canvasdesigner.*.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/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
src/Umbraco.Web.UI.Client/vwd.webinfo
src/Umbraco.Web.UI/App_Plugins/*
src/*.psess
src/*.vspx
NDependOut/*
QueryResult.htm
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
src/Umbraco.Web.UI/[Uu]mbraco/plugins/*
build/ApiDocs/*
build/ApiDocs/Output/*
src/Umbraco.Web.UI.Client/bower_components/*
/src/Umbraco.Web.UI/[Uu]mbraco/preview
/src/Umbraco.Web.UI/[Uu]mbraco/preview.old
# ignore rule for clearing out Belle (avoid rebuilding all the time)
preserve.belle
#Ignore Rule for output of generated documentation files from Grunt docserve
src/Umbraco.Web.UI.Client/docs/api
src/*.boltdata/
src/umbraco.sln.ide/*
src/.vs/
src/Umbraco.Web.UI/[Jj]s/*
src/Umbraco.Tests/[Mm]edia
tools/docfx/*
apidocs/_site/*
src/*/project.lock.json
src/.idea/*
apidocs/api/*
build/docs.zip
build/ui-docs.zip
build/csharp-docs.zip
src/packages/
src/PrecompiledWeb/*
# build
build.out/
build.tmp/
build/hooks/
build/temp/
# eof
/src/Umbraco.Web.UI.Client/TESTS-*.xml
+20 -20
View File
@@ -3,57 +3,57 @@
[string]$Directory
)
$workingDirectory = $Directory
CD $workingDirectory
CD "$($workingDirectory)"
# Clone repo
$fullGitUrl = "https://$env:GIT_URL/$env:GIT_REPOSITORYNAME.git"
git clone $fullGitUrl 2>&1 | % { $_.ToString() }
$fullGitUrl = "https://$($env:GIT_URL)/$($env:GIT_REPOSITORYNAME).git"
git clone $($fullGitUrl) $($env:GIT_REPOSITORYNAME) 2>&1 | % { $_.ToString() }
# Remove everything so that unzipping the release later will update everything
# Don't remove the readme file nor the git directory
Write-Host "Cleaning up git directory before adding new version"
Remove-Item -Recurse $workingDirectory\$env:GIT_REPOSITORYNAME\* -Exclude README.md,.git
Remove-Item -Recurse "$($workingDirectory)\$($env:GIT_REPOSITORYNAME)\*" -Exclude README.md,.git
# Find release zip
$zipsDir = "$workingDirectory\$env:BUILD_DEFINITIONNAME\zips"
$zipsDir = "$($workingDirectory)\$($env:BUILD_DEFINITIONNAME)\zips"
$pattern = "UmbracoCms.([0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3}).zip"
Write-Host "Searching for Umbraco release files in $workingDirectory\$zipsDir for a file with pattern $pattern"
$file = (Get-ChildItem $zipsDir | Where-Object { $_.Name -match "$pattern" })
Write-Host "Searching for Umbraco release files in $($zipsDir) for a file with pattern $($pattern)"
$file = (Get-ChildItem "$($zipsDir)" | Where-Object { $_.Name -match "$($pattern)" })
if($file)
{
# Get release name
$version = [regex]::Match($file.Name, $pattern).captures.groups[1].value
$releaseName = "Umbraco $version"
Write-Host "Found $releaseName"
$version = [regex]::Match($($file.Name), $($pattern)).captures.groups[1].value
$releaseName = "Umbraco $($version)"
Write-Host "Found $($releaseName)"
# Unzip into repository to update release
Add-Type -AssemblyName System.IO.Compression.FileSystem
Write-Host "Unzipping $($file.FullName) to $workingDirectory\$env:GIT_REPOSITORYNAME"
[System.IO.Compression.ZipFile]::ExtractToDirectory("$($file.FullName)", "$workingDirectory\$env:GIT_REPOSITORYNAME")
Write-Host "Unzipping $($file.FullName) to $($workingDirectory)\$($env:GIT_REPOSITORYNAME)"
[System.IO.Compression.ZipFile]::ExtractToDirectory("$($file.FullName)", "$($workingDirectory)\$($env:GIT_REPOSITORYNAME)")
# Telling git who we are
git config --global user.email "coffee@umbraco.com" 2>&1 | % { $_.ToString() }
git config --global user.name "Umbraco HQ" 2>&1 | % { $_.ToString() }
# Commit
CD $env:GIT_REPOSITORYNAME
Write-Host "Committing Umbraco $version Release from Build Output"
CD "$($workingDirectory)\$($env:GIT_REPOSITORYNAME)"
Write-Host "Committing Umbraco $($version) Release from Build Output"
git add . 2>&1 | % { $_.ToString() }
git commit -m " Release $releaseName from Build Output" 2>&1 | % { $_.ToString() }
git commit -m " Release $($releaseName) from Build Output" 2>&1 | % { $_.ToString() }
# Tag the release
git tag -a "v$version" -m "v$version"
git tag -a "v$($version)" -m "v$($version)"
# Push release to master
$fullGitAuthUrl = "https://$($env:GIT_USERNAME):$GitHubPersonalAccessToken@$env:GIT_URL/$env:GIT_REPOSITORYNAME.git"
git push $fullGitAuthUrl 2>&1 | % { $_.ToString() }
$fullGitAuthUrl = "https://$($env:GIT_USERNAME):$($GitHubPersonalAccessToken)@$($env:GIT_URL)/$($env:GIT_REPOSITORYNAME).git"
git push $($fullGitAuthUrl) 2>&1 | % { $_.ToString() }
#Push tag to master
git push $fullGitAuthUrl --tags 2>&1 | % { $_.ToString() }
git push $($fullGitAuthUrl) --tags 2>&1 | % { $_.ToString() }
}
else
{
Write-Error "Umbraco release file not found, searched in $workingDirectory\$zipsDir for a file with pattern $pattern - cancelling"
Write-Error "Umbraco release file not found, searched in $($workingDirectory)\$($zipsDir) for a file with pattern $($pattern) - canceling"
}
+31 -27
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<metadata minClientVersion="4.1.0">
<id>UmbracoCms.Core</id>
<version>8.0.0</version>
<title>Umbraco Cms Core Binaries</title>
@@ -8,38 +8,42 @@
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<iconUrl>https://umbraco.com/dist/nuget/logo-small.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains the core assemblies needed to run Umbraco Cms. This package only contains assemblies and can be used for package development. Use the UmbracoCms package to setup Umbraco in Visual Studio as an ASP.NET project.</description>
<summary>Contains the core assemblies needed to run Umbraco Cms</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="AutoMapper" version="[7.0.1,7.999999)" />
<dependency id="LightInject" version="[5.1.2,5.999999)" />
<dependency id="LightInject.Annotation" version="[1.1.0,1.999999)" />
<dependency id="LightInject.Web" version="[2.0.0,2.999999)" />
<dependency id="Microsoft.AspNet.Identity.Core" version="[2.2.2,2.999999)" />
<dependency id="Microsoft.AspNet.WebApi.Client" version="[5.2.6,5.999999)" />
<dependency id="Microsoft.Owin" version="[4.0.0,4.999999)" />
<dependency id="MiniProfiler" version="[3.2.0.157,3.999999)" />
<dependency id="MySql.Data" version="[6.10.7,6.999999)" />
<dependency id="Newtonsoft.Json" version="[11.0.2,11.999999)" />
<dependency id="Semver" version="[2.0.4,2.999999)" />
<dependency id="Serilog" version="[2.7.1,2.999999)" />
<dependency id="Serilog.Enrichers.Process" version="[2.0.1,2.999999)" />
<dependency id="Serilog.Enrichers.Thread" version="[3.0.0,3.999999)" />
<dependency id="Serilog.Filters.Expressions" version="[2.0.0,2.999999)" />
<dependency id="Serilog.Formatting.Compact" version="[1.0.0,1.999999)" />
<dependency id="Serilog.Settings.AppSettings" version="[2.2.2,2.999999)" />
<dependency id="Serilog.Sinks.File" version="[4.0.0,4.999999)" />
<dependency id="Umbraco.SqlServerCE" version="[4.0.0.1,4.999999)" />
<dependency id="NPoco" version="[3.9.4,3.999999)" />
<group targetFramework="net472">
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="AutoMapper" version="[8.0.0,8.999999)" />
<dependency id="LightInject" version="[5.4.0,5.999999)" />
<dependency id="LightInject.Annotation" version="[1.1.0,1.999999)" />
<dependency id="LightInject.Web" version="[2.0.0,2.999999)" />
<dependency id="Microsoft.AspNet.Identity.Core" version="[2.2.2,2.999999)" />
<dependency id="Microsoft.AspNet.WebApi.Client" version="[5.2.7,5.999999)" />
<dependency id="Microsoft.Owin" version="[4.0.1,4.999999)" />
<dependency id="MiniProfiler" version="[4.0.138,4.999999)" />
<dependency id="Newtonsoft.Json" version="[12.0.1,12.999999)" />
<dependency id="Semver" version="[2.0.4,2.999999)" />
<dependency id="Serilog" version="[2.8.0,2.999999)" />
<dependency id="Serilog.Enrichers.Process" version="[2.0.1,2.999999)" />
<dependency id="Serilog.Enrichers.Thread" version="[3.0.0,3.999999)" />
<dependency id="Serilog.Filters.Expressions" version="[2.0.0,2.999999)" />
<dependency id="Serilog.Formatting.Compact" version="[1.0.0,1.999999)" />
<dependency id="Serilog.Formatting.Compact.Reader" version="[1.0.3,1.999999)" />
<dependency id="Serilog.Settings.AppSettings" version="[2.2.2,2.999999)" />
<dependency id="Serilog.Sinks.File" version="[4.0.0,4.999999)" />
<dependency id="Umbraco.SqlServerCE" version="[4.0.0.1,4.999999)" />
<dependency id="NPoco" version="[3.9.4,3.999999)" />
</group>
</dependencies>
</metadata>
<files>
+32 -27
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<metadata minClientVersion="4.1.0">
<id>UmbracoCms.Web</id>
<version>8.0.0</version>
<title>Umbraco Cms Core Binaries</title>
@@ -8,37 +8,42 @@
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<iconUrl>https://umbraco.com/dist/nuget/logo-small.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains the web assemblies needed to run Umbraco Cms. This package only contains assemblies and can be used for package development. Use the UmbracoCms package to setup Umbraco in Visual Studio as an ASP.NET project.</description>
<summary>Contains the core assemblies needed to run Umbraco Cms</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="AutoMapper" version="[7.0.1,7.999999)" />
<dependency id="ClientDependency" version="[1.9.7,1.999999)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0,1.999999)" />
<dependency id="CSharpTest.Net.Collections" version="[14.906.1403.1082,14.999999)" />
<dependency id="Examine" version="[1.0.0-beta067,1.999999)" />
<dependency id="HtmlAgilityPack" version="[1.8.9,1.999999)" />
<dependency id="ImageProcessor" version="[2.6.2.25,2.999999)" />
<dependency id="LightInject.Mvc" version="[2.0.0,2.999999)" />
<dependency id="LightInject.WebApi" version="[2.0.0,2.999999)" />
<dependency id="Markdown" version="[2.2.1,2.999999)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.2,2.999999)" />
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.6,5.999999)" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3,2.999999)" />
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.6,5.999999)" />
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[4.0.0,4.999999)" />
<dependency id="Microsoft.Owin.Security.Cookies" version="[4.0.0,4.999999)" />
<dependency id="Microsoft.Owin.Security.OAuth" version="[4.0.0,4.999999)" />
<dependency id="System.Threading.Tasks.Dataflow" version="[4.8.0,4.999999)" />
<dependencies>
<group targetFramework="net472">
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="ClientDependency" version="[1.9.7,1.999999)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0,1.999999)" />
<dependency id="CSharpTest.Net.Collections" version="[14.906.1403.1082,14.999999)" />
<dependency id="Examine" version="[1.0.0,1.999999)" />
<dependency id="HtmlAgilityPack" version="[1.8.14,1.999999)" />
<dependency id="ImageProcessor" version="[2.7.0.100,2.999999)" />
<dependency id="LightInject.Mvc" version="[2.0.0,2.999999)" />
<dependency id="LightInject.WebApi" version="[2.0.0,2.999999)" />
<dependency id="Markdown" version="[2.2.1,2.999999)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.2,2.999999)" />
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.7,5.999999)" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.4.0,2.999999)" />
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.7,5.999999)" />
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[4.0.1,4.999999)" />
<dependency id="Microsoft.Owin.Security.Cookies" version="[4.0.1,4.999999)" />
<dependency id="Microsoft.Owin.Security.OAuth" version="[4.0.1,4.999999)" />
<dependency id="System.Threading.Tasks.Dataflow" version="[4.9.0,4.999999)" />
</group>
</dependencies>
</metadata>
<files>
+22 -19
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<metadata minClientVersion="4.1.0">
<id>UmbracoCms</id>
<version>8.0.0</version>
<title>Umbraco Cms</title>
@@ -8,32 +8,38 @@
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<iconUrl>https://umbraco.com/dist/nuget/logo-small.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Installs Umbraco Cms in your Visual Studio ASP.NET project</description>
<summary>Installs Umbraco Cms in your Visual Studio ASP.NET project</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Web" version="[$version$]" />
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3, 2.999999)" />
<dependency id="Umbraco.ModelsBuilder.Ui" version="[8.0.0-alpha.29]" />
<dependency id="ImageProcessor.Web" version="[4.9.3.25,4.999999)" />
<dependency id="ImageProcessor.Web.Config" version="[2.4.1.19,2.999999)" />
<dependency id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="[2.0.1,2.999999)" />
<dependency id="Microsoft.Net.Compilers" version="[2.10.0,2.999999)" />
<group targetFramework="net472">
<dependency id="UmbracoCms.Web" version="[$version$]" />
<!--
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.4.0, 2.999999)" />
<dependency id="Umbraco.ModelsBuilder.Ui" version="[8.0.4]" />
<dependency id="ImageProcessor.Web" version="[4.10.0.100,4.999999)" />
<dependency id="ImageProcessor.Web.Config" version="[2.5.0.100,2.999999)" />
<dependency id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="[2.0.1,2.999999)" />
<dependency id="Microsoft.Net.Compilers" version="[2.10.0,2.999999)" />
</group>
</dependencies>
</metadata>
<files>
<!-- files -->
<file src="$BuildTmp$\Configs\**" target="Content\Config" exclude="$BuildTmp$\Configs\Web.config.transform" />
<file src="$BuildTmp$\WebApp\Views\**" target="Content\Views" exclude="$BuildTmp$\WebApp\Views\Web.config" />
<file src="$BuildTmp$\WebApp\default.aspx" target="Content\default.aspx" />
<file src="$BuildTmp$\WebApp\Global.asax" target="Content\Global.asax" />
<file src="$BuildTmp$\WebApp\config\BackOfficeTours\**" target="Content\Config\BackOfficeTours" />
<file src="$BuildTmp$\WebApp\Media\Web.config" target="Content\Media\Web.config" />
@@ -52,12 +58,9 @@
<!-- config transforms -->
<!-- beware! config transforms not supported by PackageReference -->
<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="tools\Views.Web.config.install.xdt" target="Views\Web.config.install.xdt" /> <!-- FIXME Content\ !! and then... transform?! -->
<file src="tools\Views.Web.config.install.xdt" target="Views\Web.config.install.xdt" /> <!-- FIXME: Content\ !! and then... transform?! -->
<!-- UmbracoCms props and targets -->
<file src="build\**" target="build" />
@@ -1,95 +0,0 @@
<?xml version="1.0"?>
<dashBoard xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<section alias="StartupSettingsDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Welcome" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing">
<control 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 panelCaption="">
views/dashboard/forms/formsdashboardintro.html
</control>
</tab>
</section>
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<areas xdt:Transform="InsertIfMissing">
<area xdt:Transform="InsertIfMissing">developer</area>
</areas>
</section>
<section alias="StartupDeveloperDashboardSection">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Replace">
<control 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)" xdt:Transform="InsertIfMissing">
<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)" xdt:Transform="InsertIfMissing">
<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 panelCaption="">
views/dashboard/media/mediafolderbrowser.html
</control>
</tab>
</section>
<section alias="StartupMemberDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Get Started" xdt:Transform="Insert">
<control 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" />
<section alias="StartupDashboardSection">
<tab caption="Change Password" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Last Edits" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
</section>
<section alias="RedirectUrlManagement" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<areas>
<area>content</area>
</areas>
<tab caption="Redirect URL Management">
<control>
views/dashboard/developer/redirecturls.html
</control>
</tab>
</section>
<section alias="UmbracoHealthCheck" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<areas>
<area>developer</area>
</areas>
<tab caption="Health Check">
<control>
views/dashboard/developer/healthcheck.html
</control>
</tab>
</section>
</dashBoard>
+50 -59
View File
@@ -2,17 +2,11 @@
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing" />
<configSections>
<section name="FileSystemProviders" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="ExamineLuceneIndexSets" type="Umbraco.Examine.Config.IndexSets, Umbraco.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="applicationSettings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<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="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" />
<section name="dashBoard" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="HealthChecks" type="Umbraco.Core.Configuration.HealthChecks.HealthChecksSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</sectionGroup>
</configSections>
@@ -22,26 +16,18 @@
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
<add key="Umbraco.ModelsBuilder.Enable" value="false" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
<add key="Umbraco.ModelsBuilder.ModelsMode" value="Nothing" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
<add key="umbracoDefaultUILanguage" value="en-US" xdt:Locator="Match(key)" xdt:Transform="SetAttributes(value)" />
</appSettings>
<umbracoConfiguration xdt:Transform="InsertIfMissing">
<settings configSource="config\umbracoSettings.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" />
<dashBoard configSource="config\Dashboard.config" xdt:Locator="Match(configSource)" xdt:Transform="Remove" />
<HealthChecks configSource="config\HealthChecks.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
</umbracoConfiguration>
<FileSystemProviders 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 invariant="MySql.Data.MySqlClient" xdt:Locator="Match(invariant)" xdt:Transform="Remove" />
<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="InsertIfMissing" />
<add invariant="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" xdt:Locator="Match(invariant)" xdt:Transform="SetAttributes(type)" />
</DbProviderFactories>
</system.data>
<clientDependency xdt:Transform="RemoveAttributes(version)" />
@@ -49,14 +35,9 @@
<system.web xdt:Transform="InsertIfMissing" />
<system.web>
<siteMap xdt:Transform="Remove" />
<siteMap xdt:Transform="InsertIfMissing">
<providers xdt:Transform="InsertIfMissing">
<remove name="MySqlSiteMapProvider" xdt:Transform="InsertIfMissing" />
</providers>
</siteMap>
<httpRuntime xdt:Transform="InsertIfMissing" />
<httpRuntime maxRequestLength="51200" fcnMode="Single" xdt:Transform="SetAttributes(fcnMode,maxRequestLength)" />
<httpRuntime targetFramework="4.5" xdt:Locator="Condition(count(@targetFramework) != 1)" xdt:Transform="SetAttributes(targetFramework)" />
<httpRuntime targetFramework="4.7.2" xdt:Locator="Condition(count(@targetFramework) != 1)" xdt:Transform="SetAttributes(targetFramework)" />
<membership defaultProvider="DefaultMembershipProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove" />
<roleManager defaultProvider="DefaultRoleProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>
@@ -145,45 +126,55 @@
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.CodeAnalysis.CSharp')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='log4net')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Data.SqlServerCe')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.ValueTuple')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http.Formatting')" xdt:Transform="Remove" />
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" 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-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.3.0" newVersion="1.2.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.web.webPages.razor xdt:Transform="Remove" />
-94
View File
@@ -1,94 +0,0 @@
param($installPath, $toolsPath, $package, $project)
Write-Host "installPath:" "${installPath}"
Write-Host "toolsPath:" "${toolsPath}"
Write-Host " "
if ($project) {
$dateTime = Get-Date -Format yyyyMMdd-HHmmss
# Create paths and list them
$projectPath = (Get-Item $project.Properties.Item("FullPath").Value).FullName
Write-Host "projectPath:" "${projectPath}"
$backupPath = Join-Path $projectPath "App_Data\NuGetBackup\$dateTime"
Write-Host "backupPath:" "${backupPath}"
$copyLogsPath = Join-Path $backupPath "CopyLogs"
Write-Host "copyLogsPath:" "${copyLogsPath}"
$umbracoBinFolder = Join-Path $projectPath "bin"
Write-Host "umbracoBinFolder:" "${umbracoBinFolder}"
# 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
# After backing up, remove all umbraco dlls from bin folder in case dll files are included in the VS project
# See: http://issues.umbraco.org/issue/U4-4930
if(Test-Path $umbracoBinFolder) {
$umbracoBinBackupPath = Join-Path $backupPath "bin"
New-Item -ItemType Directory -Force -Path $umbracoBinBackupPath
robocopy $umbracoBinFolder $umbracoBinBackupPath /e /LOG:$copyLogsPath\UmbracoBinBackup.log
# Delete files Umbraco ships with
if(Test-Path $umbracoBinFolder\Microsoft.ApplicationBlocks.Data.dll) { Remove-Item $umbracoBinFolder\Microsoft.ApplicationBlocks.Data.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Data.SqlServerCe.dll) { Remove-Item $umbracoBinFolder\System.Data.SqlServerCe.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Data.SqlServerCe.Entity.dll) { Remove-Item $umbracoBinFolder\System.Data.SqlServerCe.Entity.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Web.dll) { Remove-Item $umbracoBinFolder\Umbraco.Web.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Core.dll) { Remove-Item $umbracoBinFolder\Umbraco.Core.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Web.UI.dll) { Remove-Item $umbracoBinFolder\Umbraco.Web.UI.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Examine.dll) { Remove-Item $umbracoBinFolder\Umbraco.Examine.dll -Force -Confirm:$false }
# Delete files Umbraco depends upon
$amd64Folder = Join-Path $umbracoBinFolder "amd64"
if(Test-Path $amd64Folder) { Remove-Item $amd64Folder -Force -Recurse -Confirm:$false }
$x86Folder = Join-Path $umbracoBinFolder "x86"
if(Test-Path $x86Folder) { Remove-Item $x86Folder -Force -Recurse -Confirm:$false }
if(Test-Path $umbracoBinFolder\AutoMapper.dll) { Remove-Item $umbracoBinFolder\AutoMapper.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\AutoMapper.Net4.dll) { Remove-Item $umbracoBinFolder\AutoMapper.Net4.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ClientDependency.Core.dll) { Remove-Item $umbracoBinFolder\ClientDependency.Core.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ClientDependency.Core.Mvc.dll) { Remove-Item $umbracoBinFolder\ClientDependency.Core.Mvc.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\CookComputing.XmlRpcV2.dll) { Remove-Item $umbracoBinFolder\CookComputing.XmlRpcV2.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Examine.dll) { Remove-Item $umbracoBinFolder\Examine.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\HtmlAgilityPack.dll) { Remove-Item $umbracoBinFolder\HtmlAgilityPack.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ICSharpCode.SharpZipLib.dll) { Remove-Item $umbracoBinFolder\ICSharpCode.SharpZipLib.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ImageProcessor.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ImageProcessor.Web.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.Web.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Lucene.Net.dll) { Remove-Item $umbracoBinFolder\Lucene.Net.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.IO.RecyclableMemoryStream.dll) { Remove-Item $umbracoBinFolder\Microsoft.IO.RecyclableMemoryStream.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.CodeAnalysis.CSharp.dll) { Remove-Item $umbracoBinFolder\Microsoft.CodeAnalysis.CSharp.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.CodeAnalysis.dll) { Remove-Item $umbracoBinFolder\Microsoft.CodeAnalysis.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Infrastructure.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Infrastructure.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Helpers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\MiniProfiler.dll) { Remove-Item $umbracoBinFolder\MiniProfiler.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\MySql.Data.dll) { Remove-Item $umbracoBinFolder\MySql.Data.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Newtonsoft.Json.dll) { Remove-Item $umbracoBinFolder\Newtonsoft.Json.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Owin.dll) { Remove-Item $umbracoBinFolder\Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Semver.dll) { Remove-Item $umbracoBinFolder\Semver.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Collections.Immutable.dll) { Remove-Item $umbracoBinFolder\System.Collections.Immutable.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Reflection.Metadata.dll) { Remove-Item $umbracoBinFolder\System.Reflection.Metadata.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Extensions.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Extensions.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Formatting.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Formatting.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Primitives.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Primitives.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\System.Web.Helpers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Http.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Http.WebHost.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.WebHost.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Mvc.dll) { Remove-Item $umbracoBinFolder\System.Web.Mvc.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Razor.dll) { Remove-Item $umbracoBinFolder\System.Web.Razor.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.WebPages.dll) { Remove-Item $umbracoBinFolder\System.Web.WebPages.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.WebPages.Deployment.dll) { Remove-Item $umbracoBinFolder\System.Web.WebPages.Deployment.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.WebPages.Razor.dll) { Remove-Item $umbracoBinFolder\System.Web.WebPages.Razor.dll -Force -Confirm:$false }
}
}
+1 -57
View File
@@ -11,37 +11,15 @@ if ($project) {
# Create paths and list them
$projectPath = (Get-Item $project.Properties.Item("FullPath").Value).FullName
Write-Host "projectPath:" "${projectPath}"
$backupPath = Join-Path $projectPath "App_Data\NuGetBackup\$dateTime"
Write-Host "backupPath:" "${backupPath}"
$copyLogsPath = Join-Path $backupPath "CopyLogs"
Write-Host "copyLogsPath:" "${copyLogsPath}"
$webConfigSource = Join-Path $projectPath "Web.config"
Write-Host "webConfigSource:" "${webConfigSource}"
$configFolder = Join-Path $projectPath "Config"
Write-Host "configFolder:" "${configFolder}"
# 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
Copy-Item $webConfigSource $backupPath -Force
# Backup config files folder
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 umbraco and umbraco_files from package to project folder
$umbracoFolder = Join-Path $projectPath "Umbraco"
New-Item -ItemType Directory -Force -Path $umbracoFolder
$umbracoFolderSource = Join-Path $installPath "UmbracoFiles\Umbraco"
$umbracoBackupPath = Join-Path $backupPath "Umbraco"
New-Item -ItemType Directory -Force -Path $umbracoBackupPath
robocopy $umbracoFolder $umbracoBackupPath /e /LOG:$copyLogsPath\UmbracoBackup.log
robocopy $umbracoFolderSource $umbracoFolder /is /it /e /xf UI.xml /LOG:$copyLogsPath\UmbracoCopy.log
$copyWebconfig = $true
@@ -54,7 +32,7 @@ if ($project) {
[xml]$config = Get-Content $destinationWebConfig
$config.configuration.appSettings.ChildNodes | ForEach-Object {
if($_.key -eq "umbracoConfigurationStatus")
if($_.key -eq "Umbraco.Core.ConfigurationStatus")
{
# The web.config has an umbraco-specific appSetting in it
# don't overwrite it and let config transforms do their thing
@@ -77,10 +55,6 @@ if ($project) {
$splashesDestination = Join-Path $projectPath "Config\splashes\"
New-Item $splashesDestination -Type directory
Copy-Item $splashesSource $splashesDestination -Force
$umbracoUIXMLSource = Join-Path $installPath "UmbracoFiles\Umbraco\Config\Create\UI.xml"
$umbracoUIXMLDestination = Join-Path $projectPath "Umbraco\Config\Create\UI.xml"
Copy-Item $umbracoUIXMLSource $umbracoUIXMLDestination -Force
} else {
# This part only runs for upgrades
@@ -102,36 +76,6 @@ if ($project) {
{
# Not a big problem if this fails, let it go
}
Try
{
$uiXmlConfigPath = Join-Path $umbracoFolder -ChildPath "Config" | Join-Path -ChildPath "create" | Join-Path -ChildPath "UI.xml"
$uiXmlFile = Join-Path $umbracoFolder -ChildPath "Config" | Join-Path -ChildPath "create" | Join-Path -ChildPath "UI.xml"
$uiXml = New-Object System.Xml.XmlDocument
$uiXml.PreserveWhitespace = $true
$uiXml.Load($uiXmlFile)
$createExists = $uiXml.SelectNodes("//nodeType[@alias='macros']/tasks/create")
if($createExists.Count -eq 0)
{
$macrosTasksNode = $uiXml.SelectNodes("//nodeType[@alias='macros']/tasks")
#Creating: <create assembly="umbraco" type="macroTasks" />
$createNode = $uiXml.CreateElement("create")
$createNode.SetAttribute("assembly", "umbraco")
$createNode.SetAttribute("type", "macroTasks")
$macrosTasksNode.AppendChild($createNode)
$uiXml.Save($uiXmlFile)
}
}
Catch { }
}
$installFolder = Join-Path $projectPath "Install"
if(Test-Path $installFolder) {
Remove-Item $installFolder -Force -Recurse -Confirm:$false
}
# Open appropriate readme
@@ -1,20 +0,0 @@
<?xml version="1.0"?>
<log4net xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appender name="AsynchronousLog4NetAppender" xdt:Transform="Remove" xdt:Locator="Match(name)" />
<appender name="AsynchronousLog4NetAppender" type="Umbraco.Core.Logging.ParallelForwardingAppender,Umbraco.Core" xdt:Transform="Insert" >
<appender-ref ref="rollingFile" />
</appender>
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender" xdt:Transform="InsertIfMissing">
<file value="App_Data\Logs\UmbracoTraceLog.txt" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value=" %date [P%property{processId}/D%property{appDomainId}/T%thread] %-5level %logger - %message%newline" />
</layout>
<encoding value="utf-8" />
</appender>
</log4net>
@@ -1,143 +0,0 @@
<?xml version="1.0"?>
<trees xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--Content-->
<add alias="content" application="content"
xdt:Locator="Match(application,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.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="0" alias="content" application="content" title="Content" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.ContentTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<!--Media-->
<add initialize="true" sortOrder="0" alias="media" application="media" title="Media" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.MediaTreeController, Umbraco.Web"
xdt:Locator="Match(application,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.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<!--Settings-->
<add application="settings" alias="nodeTypes"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add initialize="true" sortOrder="0" alias="documentTypes" application="settings" title="Document Types" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.ContentTypeTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<add application="settings" alias="stylesheets" title="Stylesheets" type="umbraco.loadStylesheets, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="3"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" alias="stylesheetProperty" title="Stylesheet Property" type="umbraco.loadStylesheetProperty, Umbraco.Web" iconClosed="" iconOpen="" initialize="false" sortOrder="0"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" alias="templates" title="Templates" type="Umbraco.Web.Trees.TemplatesTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder-open" sortOrder="1"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" alias="partialViews" type="Umbraco.Web.Trees.PartialViewsTree, Umbraco.Web"
xdt:Locator="Match(application,alias,type)"
xdt:Transform="Remove()" />
<add application="settings" alias="partialViews" title="Partial Views" silent="false" initialize="true" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.PartialViewsTreeController, Umbraco.Web" sortOrder="2"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<add application="settings" alias="scripts" title="Scripts" type="Umbraco.Web.Trees.ScriptTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" alias="dictionary" title="Dictionary" type="Umbraco.Web.Trees.DictionaryTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="8"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add alias="dictionary" application="settings"
xdt:Locator="Match(application,alias)"
xdt:Transform="RemoveAttributes(action)" />
<add application="settings" alias="languages" title="Languages" type="Umbraco.Web.Trees.LanguageTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder-open" sortOrder="5"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="settings" initialize="true" alias="mediaTypes" title="Media Types" type="Umbraco.Web.Trees.MediaTypeTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder-open" sortOrder="7"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<!--Developer-->
<add alias="packager" application="developer"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add alias="packagerPackages" application="developer"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add initialize="true" sortOrder="0" alias="packager" application="developer" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.PackagesTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<!-- Before 7.4 this tree had the alias 'dataType', without the 's' on the end, this is here to rename it -->
<add sortOrder="1" alias="dataTypes" application="developer" type="Umbraco.Web.Trees.DataTypeTreeController, Umbraco.Web"
xdt:Locator="Match(application,type)"
xdt:Transform="SetAttributes(alias,sortOrder)" />
<!-- Yes, set the sortOrder again, like above because.. sometimes apparently we already have a dataTypes node and we can't remove more than one.. if they're equal though (same alias,application and sortOrder) it doesn't throw an error -->
<add sortOrder="1" alias="dataTypes" application="developer"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes(sortOrder)" />
<add initialize="true" sortOrder="2" alias="macros" application="developer" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.MacroTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="developer" alias="relationTypes" title="Relation Types" type="umbraco.loadRelationTypes, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTree, Umbraco.Web"
xdt:Locator="Match(application,alias,type)"
xdt:Transform="Remove()" />
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTreeController, Umbraco.Web" silent="false" initialize="true" sortOrder="6" title="Partial View Macro Files" iconClosed="icon-folder" iconOpen="icon-folder"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<add application="developer" alias="python"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<!--Users-->
<add initialize="true" sortOrder="0" alias="users" application="users" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.UserTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="users" alias="userTypes"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add application="users" alias="userPermissions"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<!--Members-->
<add initialize="true" sortOrder="0" alias="member" application="member" title="Members" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.MemberTreeController, Umbraco.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="member" alias="memberGroup"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add application="member" sortOrder="2" alias="memberGroups" title="Member Groups" type="umbraco.loadMemberGroups, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<add application="member" alias="memberType"
xdt:Locator="Match(application,alias)"
xdt:Transform="Remove" />
<add application="member" sortOrder="1" alias="memberTypes" initialize="true" title="Member Types" type="Umbraco.Web.Trees.MemberTypeTreeController, Umbraco.Web" iconClosed="icon-folder" iconOpen="icon-folder-open"
xdt:Locator="Match(application,alias)"
xdt:Transform="InsertIfMissing" />
<!--Translation-->
<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.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add alias="openTasks" application="translation"
xdt:Locator="Match(application,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.Web"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add alias="yourTasks" application="translation"
xdt:Locator="Match(application,alias)"
xdt:Transform="RemoveAttributes(action)" />
</trees>
+2 -5
View File
@@ -120,7 +120,7 @@
} finally {
Pop-Location
# fixme - should we filter the log to find errors?
# FIXME: should we filter the log to find errors?
#get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
# restore
@@ -177,7 +177,7 @@
{
Write-Host "Prepare Tests"
# fixme - idea is to avoid rebuilding everything for tests
# FIXME: - idea is to avoid rebuilding everything for tests
# but because of our weird assembly versioning (with .* stuff)
# everything gets rebuilt all the time...
#Copy-Files "$tmp\bin" "." "$tmp\tests"
@@ -330,9 +330,6 @@
$ubuild.DefineMethod("PrepareBuild",
{
Write-Host "Clear folders and files"
$this.RemoveDirectory("$($this.SolutionRoot)\src\Umbraco.Web.UI.Client\bower_components")
$this.TempStoreFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
Write-Host "Create clean web.config"
$this.CopyFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.Template.config", "$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
+3 -3
View File
@@ -2,7 +2,7 @@
using System.Resources;
[assembly: AssemblyCompany("Umbraco")]
[assembly: AssemblyCopyright("Copyright © Umbraco 2018")]
[assembly: AssemblyCopyright("Copyright © Umbraco 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -18,5 +18,5 @@ using System.Resources;
[assembly: AssemblyVersion("8.0.0")]
// these are FYI and changed automatically
[assembly: AssemblyFileVersion("8.0.0")]
[assembly: AssemblyInformationalVersion("8.0.0-alpha.58")]
[assembly: AssemblyFileVersion("8.0.2")]
[assembly: AssemblyInformationalVersion("8.0.2")]
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Umbraco.Core
public static class Attempt
{
// note:
// cannot rely on overloads only to differenciate between with/without status
// cannot rely on overloads only to differentiate between with/without status
// in some cases it will always be ambiguous, so be explicit w/ 'WithStatus' methods
/// <summary>
+1 -1
View File
@@ -121,7 +121,7 @@ namespace Umbraco.Core
}
/// <summary>
/// Implicity operator to check if the attempt was successful without having to access the 'success' property
/// Implicitly operator to check if the attempt was successful without having to access the 'success' property
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
+1 -1
View File
@@ -130,7 +130,7 @@ namespace Umbraco.Core
}
/// <summary>
/// Implicity operator to check if the attempt was successful without having to access the 'success' property
/// Implicitly operator to check if the attempt was successful without having to access the 'success' property
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
@@ -8,9 +8,9 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Extensions for strongly typed access
/// </summary>
public static class CacheProviderExtensions
public static class AppCacheExtensions
{
public static T GetCacheItem<T>(this IRuntimeCacheProvider provider,
public static T GetCacheItem<T>(this IAppPolicyCache provider,
string cacheKey,
Func<T> getCacheItem,
TimeSpan? timeout,
@@ -19,11 +19,11 @@ namespace Umbraco.Core.Cache
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null)
{
var result = provider.GetCacheItem(cacheKey, () => getCacheItem(), timeout, isSliding, priority, removedCallback, dependentFiles);
var result = provider.Get(cacheKey, () => getCacheItem(), timeout, isSliding, priority, removedCallback, dependentFiles);
return result == null ? default(T) : result.TryConvertTo<T>().Result;
}
public static void InsertCacheItem<T>(this IRuntimeCacheProvider provider,
public static void InsertCacheItem<T>(this IAppPolicyCache provider,
string cacheKey,
Func<T> getCacheItem,
TimeSpan? timeout = null,
@@ -32,24 +32,24 @@ namespace Umbraco.Core.Cache
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null)
{
provider.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, isSliding, priority, removedCallback, dependentFiles);
provider.Insert(cacheKey, () => getCacheItem(), timeout, isSliding, priority, removedCallback, dependentFiles);
}
public static IEnumerable<T> GetCacheItemsByKeySearch<T>(this ICacheProvider provider, string keyStartsWith)
public static IEnumerable<T> GetCacheItemsByKeySearch<T>(this IAppCache provider, string keyStartsWith)
{
var result = provider.GetCacheItemsByKeySearch(keyStartsWith);
var result = provider.SearchByKey(keyStartsWith);
return result.Select(x => x.TryConvertTo<T>().Result);
}
public static IEnumerable<T> GetCacheItemsByKeyExpression<T>(this ICacheProvider provider, string regexString)
public static IEnumerable<T> GetCacheItemsByKeyExpression<T>(this IAppCache provider, string regexString)
{
var result = provider.GetCacheItemsByKeyExpression(regexString);
var result = provider.SearchByRegex(regexString);
return result.Select(x => x.TryConvertTo<T>().Result);
}
public static T GetCacheItem<T>(this ICacheProvider provider, string cacheKey)
public static T GetCacheItem<T>(this IAppCache provider, string cacheKey)
{
var result = provider.GetCacheItem(cacheKey);
var result = provider.Get(cacheKey);
if (result == null)
{
return default(T);
@@ -57,9 +57,9 @@ namespace Umbraco.Core.Cache
return result.TryConvertTo<T>().Result;
}
public static T GetCacheItem<T>(this ICacheProvider provider, string cacheKey, Func<T> getCacheItem)
public static T GetCacheItem<T>(this IAppCache provider, string cacheKey, Func<T> getCacheItem)
{
var result = provider.GetCacheItem(cacheKey, () => getCacheItem());
var result = provider.Get(cacheKey, () => getCacheItem());
if (result == null)
{
return default(T);
+86
View File
@@ -0,0 +1,86 @@
using System;
using System.Web;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents the application caches.
/// </summary>
public class AppCaches
{
/// <summary>
/// Initializes a new instance of the <see cref="AppCaches"/> for use in a web application.
/// </summary>
public AppCaches()
: this(HttpRuntime.Cache)
{ }
/// <summary>
/// Initializes a new instance of the <see cref="AppCaches"/> for use in a web application.
/// </summary>
public AppCaches(System.Web.Caching.Cache cache)
: this(
new WebCachingAppCache(cache),
new HttpRequestAppCache(),
new IsolatedCaches(t => new ObjectCacheAppCache()))
{ }
/// <summary>
/// Initializes a new instance of the <see cref="AppCaches"/> with cache providers.
/// </summary>
public AppCaches(
IAppPolicyCache runtimeCache,
IAppCache requestCache,
IsolatedCaches isolatedCaches)
{
RuntimeCache = runtimeCache ?? throw new ArgumentNullException(nameof(runtimeCache));
RequestCache = requestCache ?? throw new ArgumentNullException(nameof(requestCache));
IsolatedCaches = isolatedCaches ?? throw new ArgumentNullException(nameof(isolatedCaches));
}
/// <summary>
/// Gets the special disabled instance.
/// </summary>
/// <remarks>
/// <para>When used by repositories, all cache policies apply, but the underlying caches do not cache anything.</para>
/// <para>Used by tests.</para>
/// </remarks>
public static AppCaches Disabled { get; } = new AppCaches(NoAppCache.Instance, NoAppCache.Instance, new IsolatedCaches(_ => NoAppCache.Instance));
/// <summary>
/// Gets the special no-cache instance.
/// </summary>
/// <remarks>
/// <para>When used by repositories, all cache policies are bypassed.</para>
/// <para>Used by repositories that do no cache.</para>
/// </remarks>
public static AppCaches NoCache { get; } = new AppCaches(NoAppCache.Instance, NoAppCache.Instance, new IsolatedCaches(_ => NoAppCache.Instance));
/// <summary>
/// Gets the per-request cache.
/// </summary>
/// <remarks>
/// <para>The per-request caches works on top of the current HttpContext items.</para>
/// <para>Outside a web environment, the behavior of that cache is unspecified.</para>
/// </remarks>
public IAppCache RequestCache { get; }
/// <summary>
/// Gets the runtime cache.
/// </summary>
/// <remarks>
/// <para>The runtime cache is the main application cache.</para>
/// </remarks>
public IAppPolicyCache RuntimeCache { get; }
/// <summary>
/// Gets the isolated caches.
/// </summary>
/// <remarks>
/// <para>Isolated caches are used by e.g. repositories, to ensure that each cached entity
/// type has its own cache, so that lookups are fast and the repository does not need to
/// search through all keys on a global scale.</para>
/// </remarks>
public IsolatedCaches IsolatedCaches { get; }
}
}
@@ -0,0 +1,74 @@
using System;
using System.Collections.Concurrent;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Provides a base class for implementing a dictionary of <see cref="IAppPolicyCache"/>.
/// </summary>
/// <typeparam name="TKey">The type of the dictionary key.</typeparam>
public abstract class AppPolicedCacheDictionary<TKey>
{
private readonly ConcurrentDictionary<TKey, IAppPolicyCache> _caches = new ConcurrentDictionary<TKey, IAppPolicyCache>();
/// <summary>
/// Initializes a new instance of the <see cref="AppPolicedCacheDictionary{TKey}"/> class.
/// </summary>
/// <param name="cacheFactory"></param>
protected AppPolicedCacheDictionary(Func<TKey, IAppPolicyCache> cacheFactory)
{
CacheFactory = cacheFactory;
}
/// <summary>
/// Gets the internal cache factory, for tests only!
/// </summary>
internal readonly Func<TKey, IAppPolicyCache> CacheFactory;
/// <summary>
/// Gets or creates a cache.
/// </summary>
public IAppPolicyCache GetOrCreate(TKey key)
=> _caches.GetOrAdd(key, k => CacheFactory(k));
/// <summary>
/// Tries to get a cache.
/// </summary>
public Attempt<IAppPolicyCache> Get(TKey key)
=> _caches.TryGetValue(key, out var cache) ? Attempt.Succeed(cache) : Attempt.Fail<IAppPolicyCache>();
/// <summary>
/// Removes a cache.
/// </summary>
public void Remove(TKey key)
{
_caches.TryRemove(key, out _);
}
/// <summary>
/// Removes all caches.
/// </summary>
public void RemoveAll()
{
_caches.Clear();
}
/// <summary>
/// Clears a cache.
/// </summary>
public void ClearCache(TKey key)
{
if (_caches.TryGetValue(key, out var cache))
cache.Clear();
}
/// <summary>
/// Clears all caches.
/// </summary>
public void ClearAllCaches()
{
foreach (var cache in _caches.Values)
cache.Clear();
}
}
}
-90
View File
@@ -1,90 +0,0 @@
using System;
using System.Web;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents the application-wide caches.
/// </summary>
public class CacheHelper
{
/// <summary>
/// Initializes a new instance for use in the web
/// </summary>
public CacheHelper()
: this(
new HttpRuntimeCacheProvider(HttpRuntime.Cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Initializes a new instance for use in the web
/// </summary>
public CacheHelper(System.Web.Caching.Cache cache)
: this(
new HttpRuntimeCacheProvider(cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Initializes a new instance based on the provided providers
/// </summary>
public CacheHelper(
IRuntimeCacheProvider httpCacheProvider,
ICacheProvider staticCacheProvider,
ICacheProvider requestCacheProvider,
IsolatedRuntimeCache isolatedCacheManager)
{
RuntimeCache = httpCacheProvider ?? throw new ArgumentNullException(nameof(httpCacheProvider));
StaticCache = staticCacheProvider ?? throw new ArgumentNullException(nameof(staticCacheProvider));
RequestCache = requestCacheProvider ?? throw new ArgumentNullException(nameof(requestCacheProvider));
IsolatedRuntimeCache = isolatedCacheManager ?? throw new ArgumentNullException(nameof(isolatedCacheManager));
}
/// <summary>
/// Gets the special disabled instance.
/// </summary>
/// <remarks>
/// <para>When used by repositories, all cache policies apply, but the underlying caches do not cache anything.</para>
/// <para>Used by tests.</para>
/// </remarks>
public static CacheHelper Disabled { get; } = new CacheHelper(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance));
/// <summary>
/// Gets the special no-cache instance.
/// </summary>
/// <remarks>
/// <para>When used by repositories, all cache policies are bypassed.</para>
/// <para>Used by repositories that do no cache.</para>
/// </remarks>
public static CacheHelper NoCache { get; } = new CacheHelper(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance));
/// <summary>
/// Returns the current Request cache
/// </summary>
public ICacheProvider RequestCache { get; internal set; }
/// <summary>
/// Returns the current Runtime cache
/// </summary>
public ICacheProvider StaticCache { get; internal set; }
/// <summary>
/// Returns the current Runtime cache
/// </summary>
public IRuntimeCacheProvider RuntimeCache { get; internal set; }
/// <summary>
/// Returns the current Isolated Runtime cache manager
/// </summary>
public IsolatedRuntimeCache IsolatedRuntimeCache { get; internal set; }
}
}
+2 -2
View File
@@ -5,10 +5,10 @@
/// </summary>
public static class CacheKeys
{
public const string ApplicationTreeCacheKey = "ApplicationTreeCache"; // used by ApplicationTreeService
public const string ApplicationsCacheKey = "ApplicationCache"; // used by SectionService
public const string TemplateFrontEndCacheKey = "template"; // fixme usage?
// TODO: this one can probably be removed
public const string TemplateFrontEndCacheKey = "template";
public const string MacroContentCacheKey = "macroContent_"; // used in MacroRenderers
}
+5 -5
View File
@@ -16,10 +16,10 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Initializes a new instance of the <see cref="CacheRefresherBase{TInstanceType}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected CacheRefresherBase(CacheHelper cacheHelper)
/// <param name="appCaches">A cache helper.</param>
protected CacheRefresherBase(AppCaches appCaches)
{
CacheHelper = cacheHelper;
AppCaches = appCaches;
}
/// <summary>
@@ -93,7 +93,7 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Gets the cache helper.
/// </summary>
protected CacheHelper CacheHelper { get; }
protected AppCaches AppCaches { get; }
/// <summary>
/// Clears the cache for all repository entities of a specified type.
@@ -102,7 +102,7 @@ namespace Umbraco.Core.Cache
protected void ClearAllIsolatedCacheByEntityType<TEntity>()
where TEntity : class, IEntity
{
CacheHelper.IsolatedRuntimeCache.ClearCache<TEntity>();
AppCaches.IsolatedCaches.ClearCache<TEntity>();
}
/// <summary>
+157
View File
@@ -0,0 +1,157 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Implements <see cref="IAppPolicyCache"/> by wrapping an inner other <see cref="IAppPolicyCache"/>
/// instance, and ensuring that all inserts and returns are deep cloned copies of the cache item,
/// when the item is deep-cloneable.
/// </summary>
internal class DeepCloneAppCache : IAppPolicyCache
{
/// <summary>
/// Initializes a new instance of the <see cref="DeepCloneAppCache"/> class.
/// </summary>
public DeepCloneAppCache(IAppPolicyCache innerCache)
{
var type = typeof (DeepCloneAppCache);
if (innerCache.GetType() == type)
throw new InvalidOperationException($"A {type} cannot wrap another instance of itself.");
InnerCache = innerCache;
}
/// <summary>
/// Gets the inner cache.
/// </summary>
public IAppPolicyCache InnerCache { get; }
/// <inheritdoc />
public object Get(string key)
{
var item = InnerCache.Get(key);
return CheckCloneableAndTracksChanges(item);
}
/// <inheritdoc />
public object Get(string key, Func<object> factory)
{
var cached = InnerCache.Get(key, () =>
{
var result = FastDictionaryAppCacheBase.GetSafeLazy(factory);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
// do not store null values (backward compat), clone / reset to go into the cache
return value == null ? null : CheckCloneableAndTracksChanges(value);
});
return CheckCloneableAndTracksChanges(cached);
}
/// <inheritdoc />
public IEnumerable<object> SearchByKey(string keyStartsWith)
{
return InnerCache.SearchByKey(keyStartsWith)
.Select(CheckCloneableAndTracksChanges);
}
/// <inheritdoc />
public IEnumerable<object> SearchByRegex(string regex)
{
return InnerCache.SearchByRegex(regex)
.Select(CheckCloneableAndTracksChanges);
}
/// <inheritdoc />
public object Get(string key, Func<object> factory, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
var cached = InnerCache.Get(key, () =>
{
var result = FastDictionaryAppCacheBase.GetSafeLazy(factory);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
// do not store null values (backward compat), clone / reset to go into the cache
return value == null ? null : CheckCloneableAndTracksChanges(value);
// clone / reset to go into the cache
}, timeout, isSliding, priority, removedCallback, dependentFiles);
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(cached);
}
/// <inheritdoc />
public void Insert(string key, Func<object> factory, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
InnerCache.Insert(key, () =>
{
var result = FastDictionaryAppCacheBase.GetSafeLazy(factory);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
// do not store null values (backward compat), clone / reset to go into the cache
return value == null ? null : CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
}
/// <inheritdoc />
public void Clear()
{
InnerCache.Clear();
}
/// <inheritdoc />
public void Clear(string key)
{
InnerCache.Clear(key);
}
/// <inheritdoc />
public void ClearOfType(string typeName)
{
InnerCache.ClearOfType(typeName);
}
/// <inheritdoc />
public void ClearOfType<T>()
{
InnerCache.ClearOfType<T>();
}
/// <inheritdoc />
public void ClearOfType<T>(Func<string, T, bool> predicate)
{
InnerCache.ClearOfType<T>(predicate);
}
/// <inheritdoc />
public void ClearByKey(string keyStartsWith)
{
InnerCache.ClearByKey(keyStartsWith);
}
/// <inheritdoc />
public void ClearByRegex(string regex)
{
InnerCache.ClearByRegex(regex);
}
private static object CheckCloneableAndTracksChanges(object input)
{
if (input is IDeepCloneable cloneable)
{
input = cloneable.DeepClone();
}
// reset dirty initial properties
if (input is IRememberBeingDirty tracksChanges)
{
tracksChanges.ResetDirtyProperties(false);
input = tracksChanges;
}
return input;
}
}
}
@@ -1,155 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Interface describing this cache provider as a wrapper for another
/// </summary>
internal interface IRuntimeCacheProviderWrapper
{
IRuntimeCacheProvider InnerProvider { get; }
}
/// <summary>
/// A wrapper for any IRuntimeCacheProvider that ensures that all inserts and returns
/// are a deep cloned copy of the item when the item is IDeepCloneable and that tracks changes are
/// reset if the object is TracksChangesEntityBase
/// </summary>
internal class DeepCloneRuntimeCacheProvider : IRuntimeCacheProvider, IRuntimeCacheProviderWrapper
{
public IRuntimeCacheProvider InnerProvider { get; }
public DeepCloneRuntimeCacheProvider(IRuntimeCacheProvider innerProvider)
{
var type = typeof (DeepCloneRuntimeCacheProvider);
if (innerProvider.GetType() == type)
throw new InvalidOperationException($"A {type} cannot wrap another instance of {type}.");
InnerProvider = innerProvider;
}
#region Clear - doesn't require any changes
public void ClearAllCache()
{
InnerProvider.ClearAllCache();
}
public void ClearCacheItem(string key)
{
InnerProvider.ClearCacheItem(key);
}
public void ClearCacheObjectTypes(string typeName)
{
InnerProvider.ClearCacheObjectTypes(typeName);
}
public void ClearCacheObjectTypes<T>()
{
InnerProvider.ClearCacheObjectTypes<T>();
}
public void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
{
InnerProvider.ClearCacheObjectTypes<T>(predicate);
}
public void ClearCacheByKeySearch(string keyStartsWith)
{
InnerProvider.ClearCacheByKeySearch(keyStartsWith);
}
public void ClearCacheByKeyExpression(string regexString)
{
InnerProvider.ClearCacheByKeyExpression(regexString);
}
#endregion
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return InnerProvider.GetCacheItemsByKeySearch(keyStartsWith)
.Select(CheckCloneableAndTracksChanges);
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
return InnerProvider.GetCacheItemsByKeyExpression(regexString)
.Select(CheckCloneableAndTracksChanges);
}
public object GetCacheItem(string cacheKey)
{
var item = InnerProvider.GetCacheItem(cacheKey);
return CheckCloneableAndTracksChanges(item);
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
var cached = InnerProvider.GetCacheItem(cacheKey, () =>
{
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
return CheckCloneableAndTracksChanges(value);
});
return CheckCloneableAndTracksChanges(cached);
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
var cached = InnerProvider.GetCacheItem(cacheKey, () =>
{
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(cached);
}
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
InnerProvider.InsertCacheItem(cacheKey, () =>
{
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
}
private static object CheckCloneableAndTracksChanges(object input)
{
var cloneable = input as IDeepCloneable;
if (cloneable != null)
{
input = cloneable.DeepClone();
}
// reset dirty initial properties (U4-1946)
var tracksChanges = input as IRememberBeingDirty;
if (tracksChanges != null)
{
tracksChanges.ResetDirtyProperties(false);
input = tracksChanges;
}
return input;
}
}
}
@@ -23,7 +23,7 @@ namespace Umbraco.Core.Cache
private static readonly TEntity[] EmptyEntities = new TEntity[0]; // const
private readonly RepositoryCachePolicyOptions _options;
public DefaultRepositoryCachePolicy(IRuntimeCacheProvider cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options)
public DefaultRepositoryCachePolicy(IAppPolicyCache cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options)
: base(cache, scopeAccessor)
{
_options = options ?? throw new ArgumentNullException(nameof(options));
@@ -42,7 +42,7 @@ namespace Umbraco.Core.Cache
protected virtual void InsertEntity(string cacheKey, TEntity entity)
{
Cache.InsertCacheItem(cacheKey, () => entity, TimeSpan.FromMinutes(5), true);
Cache.Insert(cacheKey, () => entity, TimeSpan.FromMinutes(5), true);
}
protected virtual void InsertEntities(TId[] ids, TEntity[] entities)
@@ -52,7 +52,7 @@ namespace Umbraco.Core.Cache
// getting all of them, and finding nothing.
// if we can cache a zero count, cache an empty array,
// for as long as the cache is not cleared (no expiration)
Cache.InsertCacheItem(GetEntityTypeCacheKey(), () => EmptyEntities);
Cache.Insert(GetEntityTypeCacheKey(), () => EmptyEntities);
}
else
{
@@ -60,7 +60,7 @@ namespace Umbraco.Core.Cache
foreach (var entity in entities)
{
var capture = entity;
Cache.InsertCacheItem(GetEntityCacheKey(entity.Id), () => capture, TimeSpan.FromMinutes(5), true);
Cache.Insert(GetEntityCacheKey(entity.Id), () => capture, TimeSpan.FromMinutes(5), true);
}
}
}
@@ -77,21 +77,21 @@ namespace Umbraco.Core.Cache
// just to be safe, we cannot cache an item without an identity
if (entity.HasIdentity)
{
Cache.InsertCacheItem(GetEntityCacheKey(entity.Id), () => entity, TimeSpan.FromMinutes(5), true);
Cache.Insert(GetEntityCacheKey(entity.Id), () => entity, TimeSpan.FromMinutes(5), true);
}
// if there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
}
catch
{
// if an exception is thrown we need to remove the entry from cache,
// this is ONLY a work around because of the way
// that we cache entities: http://issues.umbraco.org/issue/U4-4259
Cache.ClearCacheItem(GetEntityCacheKey(entity.Id));
Cache.Clear(GetEntityCacheKey(entity.Id));
// if there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
throw;
}
@@ -109,21 +109,21 @@ namespace Umbraco.Core.Cache
// just to be safe, we cannot cache an item without an identity
if (entity.HasIdentity)
{
Cache.InsertCacheItem(GetEntityCacheKey(entity.Id), () => entity, TimeSpan.FromMinutes(5), true);
Cache.Insert(GetEntityCacheKey(entity.Id), () => entity, TimeSpan.FromMinutes(5), true);
}
// if there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
}
catch
{
// if an exception is thrown we need to remove the entry from cache,
// this is ONLY a work around because of the way
// that we cache entities: http://issues.umbraco.org/issue/U4-4259
Cache.ClearCacheItem(GetEntityCacheKey(entity.Id));
Cache.Clear(GetEntityCacheKey(entity.Id));
// if there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
throw;
}
@@ -142,9 +142,9 @@ namespace Umbraco.Core.Cache
{
// whatever happens, clear the cache
var cacheKey = GetEntityCacheKey(entity.Id);
Cache.ClearCacheItem(cacheKey);
Cache.Clear(cacheKey);
// if there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
}
}
@@ -238,7 +238,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void ClearAll()
{
Cache.ClearCacheByKeySearch(GetEntityTypeCacheKey());
Cache.ClearByKey(GetEntityTypeCacheKey());
}
}
}
@@ -0,0 +1,96 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Implements <see cref="IAppCache"/> on top of a concurrent dictionary.
/// </summary>
public class DictionaryAppCache : IAppCache
{
/// <summary>
/// Gets the internal items dictionary, for tests only!
/// </summary>
internal readonly ConcurrentDictionary<string, object> Items = new ConcurrentDictionary<string, object>();
/// <inheritdoc />
public virtual object Get(string key)
{
return Items.TryGetValue(key, out var value) ? value : null;
}
/// <inheritdoc />
public virtual object Get(string key, Func<object> factory)
{
return Items.GetOrAdd(key, _ => factory());
}
/// <inheritdoc />
public virtual IEnumerable<object> SearchByKey(string keyStartsWith)
{
var items = new List<object>();
foreach (var (key, value) in Items)
if (key.InvariantStartsWith(keyStartsWith))
items.Add(value);
return items;
}
/// <inheritdoc />
public IEnumerable<object> SearchByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
var items = new List<object>();
foreach (var (key, value) in Items)
if (compiled.IsMatch(key))
items.Add(value);
return items;
}
/// <inheritdoc />
public virtual void Clear()
{
Items.Clear();
}
/// <inheritdoc />
public virtual void Clear(string key)
{
Items.TryRemove(key, out _);
}
/// <inheritdoc />
public virtual void ClearOfType(string typeName)
{
Items.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType().ToString().InvariantEquals(typeName));
}
/// <inheritdoc />
public virtual void ClearOfType<T>()
{
var typeOfT = typeof(T);
Items.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType() == typeOfT);
}
/// <inheritdoc />
public virtual void ClearOfType<T>(Func<string, T, bool> predicate)
{
var typeOfT = typeof(T);
Items.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType() == typeOfT && predicate(kvp.Key, (T)kvp.Value));
}
/// <inheritdoc />
public virtual void ClearByKey(string keyStartsWith)
{
Items.RemoveAll(kvp => kvp.Key.InvariantStartsWith(keyStartsWith));
}
/// <inheritdoc />
public virtual void ClearByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
Items.RemoveAll(kvp => compiled.IsMatch(kvp.Key));
}
}
}
@@ -7,79 +7,130 @@ using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
internal class DictionaryCacheProvider : ICacheProvider
/// <summary>
/// Implements a fast <see cref="IAppCache"/> on top of a concurrent dictionary.
/// </summary>
internal class FastDictionaryAppCache : IAppCache
{
private readonly ConcurrentDictionary<string, Lazy<object>> _items
= new ConcurrentDictionary<string, Lazy<object>>();
/// <summary>
/// Gets the internal items dictionary, for tests only!
/// </summary>
internal readonly ConcurrentDictionary<string, Lazy<object>> Items = new ConcurrentDictionary<string, Lazy<object>>();
// for tests
internal ConcurrentDictionary<string, Lazy<object>> Items => _items;
public void ClearAllCache()
/// <inheritdoc />
public object Get(string cacheKey)
{
_items.Clear();
Items.TryGetValue(cacheKey, out var result); // else null
return result == null ? null : FastDictionaryAppCacheBase.GetSafeLazyValue(result); // return exceptions as null
}
public void ClearCacheItem(string key)
/// <inheritdoc />
public object Get(string cacheKey, Func<object> getCacheItem)
{
_items.TryRemove(key, out _);
var result = Items.GetOrAdd(cacheKey, k => FastDictionaryAppCacheBase.GetSafeLazy(getCacheItem));
var value = result.Value; // will not throw (safe lazy)
if (!(value is FastDictionaryAppCacheBase.ExceptionHolder eh))
return value;
// and... it's in the cache anyway - so contrary to other cache providers,
// which would trick with GetSafeLazyValue, we need to remove by ourselves,
// in order NOT to cache exceptions
Items.TryRemove(cacheKey, out result);
eh.Exception.Throw(); // throw once!
return null; // never reached
}
public void ClearCacheObjectTypes(string typeName)
/// <inheritdoc />
public IEnumerable<object> SearchByKey(string keyStartsWith)
{
return Items
.Where(kvp => kvp.Key.InvariantStartsWith(keyStartsWith))
.Select(kvp => FastDictionaryAppCacheBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
/// <inheritdoc />
public IEnumerable<object> SearchByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
return Items
.Where(kvp => compiled.IsMatch(kvp.Key))
.Select(kvp => FastDictionaryAppCacheBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
/// <inheritdoc />
public void Clear()
{
Items.Clear();
}
/// <inheritdoc />
public void Clear(string key)
{
Items.TryRemove(key, out _);
}
/// <inheritdoc />
public void ClearOfType(string typeName)
{
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
var isInterface = type.IsInterface;
foreach (var kvp in _items
foreach (var kvp in Items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue(x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
return value == null || (isInterface ? (type.IsInstanceOfType(value)) : (value.GetType() == type));
}))
_items.TryRemove(kvp.Key, out _);
Items.TryRemove(kvp.Key, out _);
}
public void ClearCacheObjectTypes<T>()
/// <inheritdoc />
public void ClearOfType<T>()
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var kvp in _items
foreach (var kvp in Items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue(x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
return value == null || (isInterface ? (value is T) : (value.GetType() == typeOfT));
}))
_items.TryRemove(kvp.Key, out _);
Items.TryRemove(kvp.Key, out _);
}
public void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
/// <inheritdoc />
public void ClearOfType<T>(Func<string, T, bool> predicate)
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var kvp in _items
foreach (var kvp in Items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue(x.Value, true);
if (value == null) return true;
// if T is an interface remove anything that implements that interface
@@ -88,60 +139,24 @@ namespace Umbraco.Core.Cache
// run predicate on the 'public key' part only, ie without prefix
&& predicate(x.Key, (T)value);
}))
_items.TryRemove(kvp.Key, out _);
Items.TryRemove(kvp.Key, out _);
}
public void ClearCacheByKeySearch(string keyStartsWith)
/// <inheritdoc />
public void ClearByKey(string keyStartsWith)
{
foreach (var ikvp in _items
foreach (var ikvp in Items
.Where(kvp => kvp.Key.InvariantStartsWith(keyStartsWith)))
_items.TryRemove(ikvp.Key, out _);
Items.TryRemove(ikvp.Key, out _);
}
public void ClearCacheByKeyExpression(string regexString)
/// <inheritdoc />
public void ClearByRegex(string regex)
{
foreach (var ikvp in _items
.Where(kvp => Regex.IsMatch(kvp.Key, regexString)))
_items.TryRemove(ikvp.Key, out _);
}
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return _items
.Where(kvp => kvp.Key.InvariantStartsWith(keyStartsWith))
.Select(kvp => DictionaryCacheProviderBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
return _items
.Where(kvp => Regex.IsMatch(kvp.Key, regexString))
.Select(kvp => DictionaryCacheProviderBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
public object GetCacheItem(string cacheKey)
{
_items.TryGetValue(cacheKey, out var result); // else null
return result == null ? null : DictionaryCacheProviderBase.GetSafeLazyValue(result); // return exceptions as null
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
var result = _items.GetOrAdd(cacheKey, k => DictionaryCacheProviderBase.GetSafeLazy(getCacheItem));
var value = result.Value; // will not throw (safe lazy)
if (!(value is DictionaryCacheProviderBase.ExceptionHolder eh))
return value;
// and... it's in the cache anyway - so contrary to other cache providers,
// which would trick with GetSafeLazyValue, we need to remove by ourselves,
// in order NOT to cache exceptions
_items.TryRemove(cacheKey, out result);
eh.Exception.Throw(); // throw once!
return null; // never reached
var compiled = new Regex(regex, RegexOptions.Compiled);
foreach (var ikvp in Items
.Where(kvp => compiled.IsMatch(kvp.Key)))
Items.TryRemove(ikvp.Key, out _);
}
}
}
@@ -8,7 +8,10 @@ using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
internal abstract class DictionaryCacheProviderBase : ICacheProvider
/// <summary>
/// Provides a base class to fast, dictionary-based <see cref="IAppCache"/> implementations.
/// </summary>
internal abstract class FastDictionaryAppCacheBase : IAppCache
{
// prefix cache keys so we know which one are ours
protected const string CacheItemPrefix = "umbrtmche";
@@ -16,82 +19,75 @@ namespace Umbraco.Core.Cache
// an object that represent a value that has not been created yet
protected internal static readonly object ValueNotCreated = new object();
// manupulate the underlying cache entries
// these *must* be called from within the appropriate locks
// and use the full prefixed cache keys
protected abstract IEnumerable<DictionaryEntry> GetDictionaryEntries();
protected abstract void RemoveEntry(string key);
protected abstract object GetEntry(string key);
#region IAppCache
// read-write lock the underlying cache
//protected abstract IDisposable ReadLock { get; }
//protected abstract IDisposable WriteLock { get; }
protected abstract void EnterReadLock();
protected abstract void ExitReadLock();
protected abstract void EnterWriteLock();
protected abstract void ExitWriteLock();
protected string GetCacheKey(string key)
/// <inheritdoc />
public virtual object Get(string key)
{
return string.Format("{0}-{1}", CacheItemPrefix, key);
}
protected internal static Lazy<object> GetSafeLazy(Func<object> getCacheItem)
{
// try to generate the value and if it fails,
// wrap in an ExceptionHolder - would be much simpler
// to just use lazy.IsValueFaulted alas that field is
// internal
return new Lazy<object>(() =>
{
try
{
return getCacheItem();
}
catch (Exception e)
{
return new ExceptionHolder(ExceptionDispatchInfo.Capture(e));
}
});
}
protected internal static object GetSafeLazyValue(Lazy<object> lazy, bool onlyIfValueIsCreated = false)
{
// if onlyIfValueIsCreated, do not trigger value creation
// must return something, though, to differenciate from null values
if (onlyIfValueIsCreated && lazy.IsValueCreated == false) return ValueNotCreated;
// if execution has thrown then lazy.IsValueCreated is false
// and lazy.IsValueFaulted is true (but internal) so we use our
// own exception holder (see Lazy<T> source code) to return null
if (lazy.Value is ExceptionHolder) return null;
// we have a value and execution has not thrown so returning
// here does not throw - unless we're re-entering, take care of it
key = GetCacheKey(key);
Lazy<object> result;
try
{
return lazy.Value;
EnterReadLock();
result = GetEntry(key) as Lazy<object>; // null if key not found
}
catch (InvalidOperationException e)
finally
{
throw new InvalidOperationException("The method that computes a value for the cache has tried to read that value from the cache.", e);
ExitReadLock();
}
return result == null ? null : GetSafeLazyValue(result); // return exceptions as null
}
internal class ExceptionHolder
/// <inheritdoc />
public abstract object Get(string key, Func<object> factory);
/// <inheritdoc />
public virtual IEnumerable<object> SearchByKey(string keyStartsWith)
{
public ExceptionHolder(ExceptionDispatchInfo e)
var plen = CacheItemPrefix.Length + 1;
IEnumerable<DictionaryEntry> entries;
try
{
Exception = e;
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => ((string)x.Key).Substring(plen).InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
public ExceptionDispatchInfo Exception { get; }
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compat, don't store null values in the cache
}
#region Clear
/// <inheritdoc />
public virtual IEnumerable<object> SearchByRegex(string regex)
{
const string prefix = CacheItemPrefix + "-";
var compiled = new Regex(regex, RegexOptions.Compiled);
var plen = prefix.Length;
IEnumerable<DictionaryEntry> entries;
try
{
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => compiled.IsMatch(((string)x.Key).Substring(plen)))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compatible, don't store null values in the cache
}
public virtual void ClearAllCache()
/// <inheritdoc />
public virtual void Clear()
{
try
{
@@ -106,7 +102,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheItem(string key)
/// <inheritdoc />
public virtual void Clear(string key)
{
var cacheKey = GetCacheKey(key);
try
@@ -120,7 +117,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes(string typeName)
/// <inheritdoc />
public virtual void ClearOfType(string typeName)
{
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
@@ -149,7 +147,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes<T>()
/// <inheritdoc />
public virtual void ClearOfType<T>()
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
@@ -178,7 +177,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
/// <inheritdoc />
public virtual void ClearOfType<T>(Func<string, T, bool> predicate)
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
@@ -210,7 +210,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheByKeySearch(string keyStartsWith)
/// <inheritdoc />
public virtual void ClearByKey(string keyStartsWith)
{
var plen = CacheItemPrefix.Length + 1;
try
@@ -227,14 +228,16 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheByKeyExpression(string regexString)
/// <inheritdoc />
public virtual void ClearByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
var plen = CacheItemPrefix.Length + 1;
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x => Regex.IsMatch(((string)x.Key).Substring(plen), regexString))
.Where(x => compiled.IsMatch(((string)x.Key).Substring(plen)))
.ToArray())
RemoveEntry((string) entry.Key);
}
@@ -246,67 +249,80 @@ namespace Umbraco.Core.Cache
#endregion
#region Get
#region Dictionary
public virtual IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
// manipulate the underlying cache entries
// these *must* be called from within the appropriate locks
// and use the full prefixed cache keys
protected abstract IEnumerable<DictionaryEntry> GetDictionaryEntries();
protected abstract void RemoveEntry(string key);
protected abstract object GetEntry(string key);
// read-write lock the underlying cache
//protected abstract IDisposable ReadLock { get; }
//protected abstract IDisposable WriteLock { get; }
protected abstract void EnterReadLock();
protected abstract void ExitReadLock();
protected abstract void EnterWriteLock();
protected abstract void ExitWriteLock();
protected string GetCacheKey(string key)
{
var plen = CacheItemPrefix.Length + 1;
IEnumerable<DictionaryEntry> entries;
try
{
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => ((string)x.Key).Substring(plen).InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compat, don't store null values in the cache
return $"{CacheItemPrefix}-{key}";
}
public virtual IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
protected internal static Lazy<object> GetSafeLazy(Func<object> getCacheItem)
{
const string prefix = CacheItemPrefix + "-";
var plen = prefix.Length;
IEnumerable<DictionaryEntry> entries;
try
// try to generate the value and if it fails,
// wrap in an ExceptionHolder - would be much simpler
// to just use lazy.IsValueFaulted alas that field is
// internal
return new Lazy<object>(() =>
{
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => Regex.IsMatch(((string)x.Key).Substring(plen), regexString))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compat, don't store null values in the cache
try
{
return getCacheItem();
}
catch (Exception e)
{
return new ExceptionHolder(ExceptionDispatchInfo.Capture(e));
}
});
}
public virtual object GetCacheItem(string cacheKey)
protected internal static object GetSafeLazyValue(Lazy<object> lazy, bool onlyIfValueIsCreated = false)
{
cacheKey = GetCacheKey(cacheKey);
Lazy<object> result;
// if onlyIfValueIsCreated, do not trigger value creation
// must return something, though, to differentiate from null values
if (onlyIfValueIsCreated && lazy.IsValueCreated == false) return ValueNotCreated;
// if execution has thrown then lazy.IsValueCreated is false
// and lazy.IsValueFaulted is true (but internal) so we use our
// own exception holder (see Lazy<T> source code) to return null
if (lazy.Value is ExceptionHolder) return null;
// we have a value and execution has not thrown so returning
// here does not throw - unless we're re-entering, take care of it
try
{
EnterReadLock();
result = GetEntry(cacheKey) as Lazy<object>; // null if key not found
return lazy.Value;
}
finally
catch (InvalidOperationException e)
{
ExitReadLock();
throw new InvalidOperationException("The method that computes a value for the cache has tried to read that value from the cache.", e);
}
return result == null ? null : GetSafeLazyValue(result); // return exceptions as null
}
public abstract object GetCacheItem(string cacheKey, Func<object> getCacheItem);
internal class ExceptionHolder
{
public ExceptionHolder(ExceptionDispatchInfo e)
{
Exception = e;
}
public ExceptionDispatchInfo Exception { get; }
}
#endregion
}
@@ -24,7 +24,7 @@ namespace Umbraco.Core.Cache
private readonly Func<TEntity, TId> _entityGetId;
private readonly bool _expires;
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache, IScopeAccessor scopeAccessor, Func<TEntity, TId> entityGetId, bool expires)
public FullDataSetRepositoryCachePolicy(IAppPolicyCache cache, IScopeAccessor scopeAccessor, Func<TEntity, TId> entityGetId, bool expires)
: base(cache, scopeAccessor)
{
_entityGetId = entityGetId;
@@ -55,11 +55,11 @@ namespace Umbraco.Core.Cache
if (_expires)
{
Cache.InsertCacheItem(key, () => new DeepCloneableList<TEntity>(entities), TimeSpan.FromMinutes(5), true);
Cache.Insert(key, () => new DeepCloneableList<TEntity>(entities), TimeSpan.FromMinutes(5), true);
}
else
{
Cache.InsertCacheItem(key, () => new DeepCloneableList<TEntity>(entities));
Cache.Insert(key, () => new DeepCloneableList<TEntity>(entities));
}
}
@@ -171,7 +171,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void ClearAll()
{
Cache.ClearCacheItem(GetEntityTypeCacheKey());
Cache.Clear(GetEntityTypeCacheKey());
}
}
}
@@ -0,0 +1,144 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Implements a fast <see cref="IAppCache"/> on top of HttpContext.Items.
/// </summary>
/// <remarks>
/// <para>If no current HttpContext items can be found (no current HttpContext,
/// or no Items...) then this cache acts as a pass-through and does not cache
/// anything.</para>
/// </remarks>
internal class HttpRequestAppCache : FastDictionaryAppCacheBase
{
private readonly HttpContextBase _context;
/// <summary>
/// Initializes a new instance of the <see cref="HttpRequestAppCache"/> class with a context, for unit tests!
/// </summary>
public HttpRequestAppCache(HttpContextBase context)
{
_context = context;
}
/// <summary>
/// Initializes a new instance of the <see cref="HttpRequestAppCache"/> class.
/// </summary>
/// <remarks>
/// <para>Will use HttpContext.Current.</para>
/// TODO: https://github.com/umbraco/Umbraco-CMS/issues/4239 - use IHttpContextAccessor NOT HttpContext.Current
/// </remarks>
public HttpRequestAppCache()
{ }
private IDictionary ContextItems => _context?.Items ?? HttpContext.Current?.Items;
private bool HasContextItems => _context?.Items != null || HttpContext.Current != null;
/// <inheritdoc />
public override object Get(string key, Func<object> factory)
{
//no place to cache so just return the callback result
if (HasContextItems == false) return factory();
key = GetCacheKey(key);
Lazy<object> result;
try
{
EnterWriteLock();
result = ContextItems[key] as Lazy<object>; // null if key not found
// cannot create value within the lock, so if result.IsValueCreated is false, just
// do nothing here - means that if creation throws, a race condition could cause
// more than one thread to reach the return statement below and throw - accepted.
if (result == null || GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = GetSafeLazy(factory);
ContextItems[key] = result;
}
}
finally
{
ExitWriteLock();
}
// using GetSafeLazy and GetSafeLazyValue ensures that we don't cache
// exceptions (but try again and again) and silently eat them - however at
// some point we have to report them - so need to re-throw here
// this does not throw anymore
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
if (value is ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
#region Entries
protected override IEnumerable<DictionaryEntry> GetDictionaryEntries()
{
const string prefix = CacheItemPrefix + "-";
if (HasContextItems == false) return Enumerable.Empty<DictionaryEntry>();
return ContextItems.Cast<DictionaryEntry>()
.Where(x => x.Key is string s && s.StartsWith(prefix));
}
protected override void RemoveEntry(string key)
{
if (HasContextItems == false) return;
ContextItems.Remove(key);
}
protected override object GetEntry(string key)
{
return HasContextItems ? ContextItems[key] : null;
}
#endregion
#region Lock
private const string ContextItemsLockKey = "Umbraco.Core.Cache.HttpRequestCache::LockEntered";
protected override void EnterReadLock() => EnterWriteLock();
protected override void EnterWriteLock()
{
if (HasContextItems)
{
// note: cannot keep 'entered' as a class variable here,
// since there is one per request - so storing it within
// ContextItems - which is locked, so this should be safe
var entered = false;
Monitor.Enter(ContextItems.SyncRoot, ref entered);
ContextItems[ContextItemsLockKey] = entered;
}
}
protected override void ExitReadLock() => ExitWriteLock();
protected override void ExitWriteLock()
{
var entered = (bool?) ContextItems[ContextItemsLockKey] ?? false;
if (entered)
Monitor.Exit(ContextItems.SyncRoot);
ContextItems.Remove(ContextItemsLockKey);
}
#endregion
}
}
@@ -1,161 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A cache provider that caches items in the HttpContext.Items
/// </summary>
/// <remarks>
/// If the Items collection is null, then this provider has no effect
/// </remarks>
internal class HttpRequestCacheProvider : DictionaryCacheProviderBase
{
// context provider
// the idea is that there is only one, application-wide HttpRequestCacheProvider instance,
// that is initialized with a method that returns the "current" context.
// NOTE
// but then it is initialized with () => new HttpContextWrapper(HttpContent.Current)
// which is higly inefficient because it creates a new wrapper each time we refer to _context()
// so replace it with _context1 and _context2 below + a way to get context.Items.
//private readonly Func<HttpContextBase> _context;
// NOTE
// and then in almost 100% cases _context2 will be () => HttpContext.Current
// so why not bring that logic in here and fallback on to HttpContext.Current when
// _context1 is null?
//private readonly HttpContextBase _context1;
//private readonly Func<HttpContext> _context2;
private readonly HttpContextBase _context;
private IDictionary ContextItems
{
//get { return _context1 != null ? _context1.Items : _context2().Items; }
get { return _context != null ? _context.Items : HttpContext.Current.Items; }
}
private bool HasContextItems
{
get { return (_context != null && _context.Items != null) || HttpContext.Current != null; }
}
// for unit tests
public HttpRequestCacheProvider(HttpContextBase context)
{
_context = context;
}
// main constructor
// will use HttpContext.Current
public HttpRequestCacheProvider(/*Func<HttpContext> context*/)
{
//_context2 = context;
}
protected override IEnumerable<DictionaryEntry> GetDictionaryEntries()
{
const string prefix = CacheItemPrefix + "-";
if (HasContextItems == false) return Enumerable.Empty<DictionaryEntry>();
return ContextItems.Cast<DictionaryEntry>()
.Where(x => x.Key is string && ((string)x.Key).StartsWith(prefix));
}
protected override void RemoveEntry(string key)
{
if (HasContextItems == false) return;
ContextItems.Remove(key);
}
protected override object GetEntry(string key)
{
return HasContextItems ? ContextItems[key] : null;
}
#region Lock
private bool _entered;
protected override void EnterReadLock() => EnterWriteLock();
protected override void EnterWriteLock()
{
if (HasContextItems)
{
System.Threading.Monitor.Enter(ContextItems.SyncRoot, ref _entered);
}
}
protected override void ExitReadLock() => ExitWriteLock();
protected override void ExitWriteLock()
{
if (_entered)
{
_entered = false;
System.Threading.Monitor.Exit(ContextItems.SyncRoot);
}
}
#endregion
#region Get
public override object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
//no place to cache so just return the callback result
if (HasContextItems == false) return getCacheItem();
cacheKey = GetCacheKey(cacheKey);
Lazy<object> result;
try
{
EnterWriteLock();
result = ContextItems[cacheKey] as Lazy<object>; // null if key not found
// cannot create value within the lock, so if result.IsValueCreated is false, just
// do nothing here - means that if creation throws, a race condition could cause
// more than one thread to reach the return statement below and throw - accepted.
if (result == null || GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = GetSafeLazy(getCacheItem);
ContextItems[cacheKey] = result;
}
}
finally
{
ExitWriteLock();
}
// using GetSafeLazy and GetSafeLazyValue ensures that we don't cache
// exceptions (but try again and again) and silently eat them - however at
// some point we have to report them - so need to re-throw here
// this does not throw anymore
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
if (value is ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
#endregion
#region Insert
#endregion
private class NoopLocker : DisposableObjectSlim
{
protected override void DisposeResources()
{ }
}
}
}
+94
View File
@@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Defines an application cache.
/// </summary>
public interface IAppCache
{
/// <summary>
/// Gets an item identified by its key.
/// </summary>
/// <param name="key">The key of the item.</param>
/// <returns>The item, or null if the item was not found.</returns>
object Get(string key);
/// <summary>
/// Gets or creates an item identified by its key.
/// </summary>
/// <param name="key">The key of the item.</param>
/// <param name="factory">A factory function that can create the item.</param>
/// <returns>The item.</returns>
object Get(string key, Func<object> factory);
/// <summary>
/// Gets items with a key starting with the specified value.
/// </summary>
/// <param name="keyStartsWith">The StartsWith value to use in the search.</param>
/// <returns>Items matching the search.</returns>
IEnumerable<object> SearchByKey(string keyStartsWith);
/// <summary>
/// Gets items with a key matching a regular expression.
/// </summary>
/// <param name="regex">The regular expression.</param>
/// <returns>Items matching the search.</returns>
IEnumerable<object> SearchByRegex(string regex);
/// <summary>
/// Removes all items from the cache.
/// </summary>
void Clear();
/// <summary>
/// Removes an item identified by its key from the cache.
/// </summary>
/// <param name="key">The key of the item.</param>
void Clear(string key);
/// <summary>
/// Removes items of a specified type from the cache.
/// </summary>
/// <param name="typeName">The name of the type to remove.</param>
/// <remarks>
/// <para>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</para>
/// <para>Performs a case-sensitive search.</para>
/// </remarks>
void ClearOfType(string typeName);
/// <summary>
/// Removes items of a specified type from the cache.
/// </summary>
/// <typeparam name="T">The type of the items to remove.</typeparam>
/// <remarks>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</remarks>
void ClearOfType<T>();
/// <summary>
/// Removes items of a specified type from the cache.
/// </summary>
/// <typeparam name="T">The type of the items to remove.</typeparam>
/// <param name="predicate">The predicate to satisfy.</param>
/// <remarks>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</remarks>
void ClearOfType<T>(Func<string, T, bool> predicate);
/// <summary>
/// Clears items with a key starting with the specified value.
/// </summary>
/// <param name="keyStartsWith">The StartsWith value to use in the search.</param>
void ClearByKey(string keyStartsWith);
/// <summary>
/// Clears items with a key matching a regular expression.
/// </summary>
/// <param name="regex">The regular expression.</param>
void ClearByRegex(string regex);
}
}
+52
View File
@@ -0,0 +1,52 @@
using System;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Defines an application cache that support cache policies.
/// </summary>
/// <remarks>A cache policy can be used to cache with timeouts,
/// or depending on files, and with a remove callback, etc.</remarks>
public interface IAppPolicyCache : IAppCache
{
/// <summary>
/// Gets an item identified by its key.
/// </summary>
/// <param name="key">The key of the item.</param>
/// <param name="factory">A factory function that can create the item.</param>
/// <param name="timeout">An optional cache timeout.</param>
/// <param name="isSliding">An optional value indicating whether the cache timeout is sliding (default is false).</param>
/// <param name="priority">An optional cache priority (default is Normal).</param>
/// <param name="removedCallback">An optional callback to handle removals.</param>
/// <param name="dependentFiles">Files the cache entry depends on.</param>
/// <returns>The item.</returns>
object Get(
string key,
Func<object> factory,
TimeSpan? timeout,
bool isSliding = false,
CacheItemPriority priority = CacheItemPriority.Normal,
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null);
/// <summary>
/// Inserts an item.
/// </summary>
/// <param name="key">The key of the item.</param>
/// <param name="factory">A factory function that can create the item.</param>
/// <param name="timeout">An optional cache timeout.</param>
/// <param name="isSliding">An optional value indicating whether the cache timeout is sliding (default is false).</param>
/// <param name="priority">An optional cache priority (default is Normal).</param>
/// <param name="removedCallback">An optional callback to handle removals.</param>
/// <param name="dependentFiles">Files the cache entry depends on.</param>
void Insert(
string key,
Func<object> factory,
TimeSpan? timeout = null,
bool isSliding = false,
CacheItemPriority priority = CacheItemPriority.Normal,
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null);
}
}
-68
View File
@@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Cache
{
/// <summary>
/// An interface for implementing a basic cache provider
/// </summary>
public interface ICacheProvider
{
/// <summary>
/// Removes all items from the cache.
/// </summary>
void ClearAllCache();
/// <summary>
/// Removes an item from the cache, identified by its key.
/// </summary>
/// <param name="key">The key of the item.</param>
void ClearCacheItem(string key);
/// <summary>
/// Removes items from the cache, of a specified type.
/// </summary>
/// <param name="typeName">The name of the type to remove.</param>
/// <remarks>
/// <para>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</para>
/// <para>Performs a case-sensitive search.</para>
/// </remarks>
void ClearCacheObjectTypes(string typeName);
/// <summary>
/// Removes items from the cache, of a specified type.
/// </summary>
/// <typeparam name="T">The type of the items to remove.</typeparam>
/// <remarks>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</remarks>
void ClearCacheObjectTypes<T>();
/// <summary>
/// Removes items from the cache, of a specified type, satisfying a predicate.
/// </summary>
/// <typeparam name="T">The type of the items to remove.</typeparam>
/// <param name="predicate">The predicate to satisfy.</param>
/// <remarks>If the type is an interface, then all items of a type implementing that interface are
/// removed. Otherwise, only items of that exact type are removed (items of type inheriting from
/// the specified type are not removed).</remarks>
void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate);
void ClearCacheByKeySearch(string keyStartsWith);
void ClearCacheByKeyExpression(string regexString);
IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith);
IEnumerable<object> GetCacheItemsByKeyExpression(string regexString);
/// <summary>
/// Returns an item with a given key
/// </summary>
/// <param name="cacheKey"></param>
/// <returns></returns>
object GetCacheItem(string cacheKey);
object GetCacheItem(string cacheKey, Func<object> getCacheItem);
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
/// <summary>
/// The IcacheRefresher Interface is used for loadbalancing.
/// The IcacheRefresher Interface is used for load balancing.
///
/// </summary>
public interface ICacheRefresher : IDiscoverable
@@ -48,7 +48,7 @@ namespace Umbraco.Core.Cache
/// Updates an entity.
/// </summary>
/// <param name="entity">The entity.</param>
/// <param name="persistUpdated">The reopsitory PersistUpdatedItem method.</param>
/// <param name="persistUpdated">The repository PersistUpdatedItem method.</param>
/// <remarks>Updates the entity in the repository, and updates the cache accordingly.</remarks>
void Update(TEntity entity, Action<TEntity> persistUpdated);
@@ -1,35 +0,0 @@
using System;
using System.Runtime.Caching;
using System.Text;
using System.Web.Caching;
using CacheItemPriority = System.Web.Caching.CacheItemPriority;
namespace Umbraco.Core.Cache
{
/// <summary>
/// An abstract class for implementing a runtime cache provider
/// </summary>
/// <remarks>
/// </remarks>
public interface IRuntimeCacheProvider : ICacheProvider
{
object GetCacheItem(
string cacheKey,
Func<object> getCacheItem,
TimeSpan? timeout,
bool isSliding = false,
CacheItemPriority priority = CacheItemPriority.Normal,
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null);
void InsertCacheItem(
string cacheKey,
Func<object> getCacheItem,
TimeSpan? timeout = null,
bool isSliding = false,
CacheItemPriority priority = CacheItemPriority.Normal,
CacheItemRemovedCallback removedCallback = null,
string[] dependentFiles = null);
}
}
+41
View File
@@ -0,0 +1,41 @@
using System;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents a dictionary of <see cref="IAppPolicyCache"/> for types.
/// </summary>
/// <remarks>
/// <para>Isolated caches are used by e.g. repositories, to ensure that each cached entity
/// type has its own cache, so that lookups are fast and the repository does not need to
/// search through all keys on a global scale.</para>
/// </remarks>
public class IsolatedCaches : AppPolicedCacheDictionary<Type>
{
/// <summary>
/// Initializes a new instance of the <see cref="IsolatedCaches"/> class.
/// </summary>
/// <param name="cacheFactory"></param>
public IsolatedCaches(Func<Type, IAppPolicyCache> cacheFactory)
: base(cacheFactory)
{ }
/// <summary>
/// Gets a cache.
/// </summary>
public IAppPolicyCache GetOrCreate<T>()
=> GetOrCreate(typeof(T));
/// <summary>
/// Tries to get a cache.
/// </summary>
public Attempt<IAppPolicyCache> Get<T>()
=> Get(typeof(T));
/// <summary>
/// Clears a cache.
/// </summary>
public void ClearCache<T>()
=> ClearCache(typeof(T));
}
}
@@ -1,91 +0,0 @@
using System;
using System.Collections.Concurrent;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Used to get/create/manipulate isolated runtime cache
/// </summary>
/// <remarks>
/// This is useful for repository level caches to ensure that cache lookups by key are fast so
/// that the repository doesn't need to search through all keys on a global scale.
/// </remarks>
public class IsolatedRuntimeCache
{
internal Func<Type, IRuntimeCacheProvider> CacheFactory { get; set; }
/// <summary>
/// Constructor that allows specifying a factory for the type of runtime isolated cache to create
/// </summary>
/// <param name="cacheFactory"></param>
public IsolatedRuntimeCache(Func<Type, IRuntimeCacheProvider> cacheFactory)
{
CacheFactory = cacheFactory;
}
private readonly ConcurrentDictionary<Type, IRuntimeCacheProvider> _isolatedCache = new ConcurrentDictionary<Type, IRuntimeCacheProvider>();
/// <summary>
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache<T>()
{
return _isolatedCache.GetOrAdd(typeof(T), type => CacheFactory(type));
}
/// <summary>
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache(Type type)
{
return _isolatedCache.GetOrAdd(type, t => CacheFactory(t));
}
/// <summary>
/// Tries to get a cache by the type specified
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public Attempt<IRuntimeCacheProvider> GetCache<T>()
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryGetValue(typeof(T), out cache))
{
return Attempt.Succeed(cache);
}
return Attempt<IRuntimeCacheProvider>.Fail();
}
/// <summary>
/// Clears all values inside this isolated runtime cache
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public void ClearCache<T>()
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryGetValue(typeof(T), out cache))
{
cache.ClearAllCache();
}
}
/// <summary>
/// Clears all of the isolated caches
/// </summary>
public void ClearAllCaches()
{
foreach (var key in _isolatedCache.Keys)
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryRemove(key, out cache))
{
cache.ClearAllCache();
}
}
}
}
}
@@ -13,8 +13,8 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Initializes a new instance of the <see cref="JsonCacheRefresherBase{TInstanceType}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected JsonCacheRefresherBase(CacheHelper cacheHelper) : base(cacheHelper)
/// <param name="appCaches">A cache helper.</param>
protected JsonCacheRefresherBase(AppCaches appCaches) : base(appCaches)
{ }
/// <summary>
+82
View File
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Implements <see cref="IAppPolicyCache"/> and do not cache.
/// </summary>
public class NoAppCache : IAppPolicyCache
{
private NoAppCache() { }
/// <summary>
/// Gets the singleton instance.
/// </summary>
public static NoAppCache Instance { get; } = new NoAppCache();
/// <inheritdoc />
public virtual object Get(string cacheKey)
{
return null;
}
/// <inheritdoc />
public virtual object Get(string cacheKey, Func<object> factory)
{
return factory();
}
/// <inheritdoc />
public virtual IEnumerable<object> SearchByKey(string keyStartsWith)
{
return Enumerable.Empty<object>();
}
/// <inheritdoc />
public IEnumerable<object> SearchByRegex(string regex)
{
return Enumerable.Empty<object>();
}
/// <inheritdoc />
public object Get(string key, Func<object> factory, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
return factory();
}
/// <inheritdoc />
public void Insert(string key, Func<object> factory, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{ }
/// <inheritdoc />
public virtual void Clear()
{ }
/// <inheritdoc />
public virtual void Clear(string key)
{ }
/// <inheritdoc />
public virtual void ClearOfType(string typeName)
{ }
/// <inheritdoc />
public virtual void ClearOfType<T>()
{ }
/// <inheritdoc />
public virtual void ClearOfType<T>(Func<string, T, bool> predicate)
{ }
/// <inheritdoc />
public virtual void ClearByKey(string keyStartsWith)
{ }
/// <inheritdoc />
public virtual void ClearByRegex(string regex)
{ }
}
}
@@ -13,7 +13,7 @@ namespace Umbraco.Core.Cache
public static NoCacheRepositoryCachePolicy<TEntity, TId> Instance { get; } = new NoCacheRepositoryCachePolicy<TEntity, TId>();
public IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope)
public IRepositoryCachePolicy<TEntity, TId> Scoped(IAppPolicyCache runtimeCache, IScope scope)
{
throw new NotImplementedException();
}
@@ -1,66 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents a cache provider that does not cache anything.
/// </summary>
public class NullCacheProvider : IRuntimeCacheProvider
{
private NullCacheProvider() { }
public static NullCacheProvider Instance { get; } = new NullCacheProvider();
public virtual void ClearAllCache()
{ }
public virtual void ClearCacheItem(string key)
{ }
public virtual void ClearCacheObjectTypes(string typeName)
{ }
public virtual void ClearCacheObjectTypes<T>()
{ }
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
{ }
public virtual void ClearCacheByKeySearch(string keyStartsWith)
{ }
public virtual void ClearCacheByKeyExpression(string regexString)
{ }
public virtual IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return Enumerable.Empty<object>();
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
return Enumerable.Empty<object>();
}
public virtual object GetCacheItem(string cacheKey)
{
return default(object);
}
public virtual object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
return getCacheItem();
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
return getCacheItem();
}
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{ }
}
}
@@ -11,31 +11,142 @@ using CacheItemPriority = System.Web.Caching.CacheItemPriority;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents a cache provider that caches item in a <see cref="MemoryCache"/>.
/// A cache provider that wraps the logic of a System.Runtime.Caching.ObjectCache
/// Implements <see cref="IAppPolicyCache"/> on top of a <see cref="ObjectCache"/>.
/// </summary>
/// <remarks>The <see cref="MemoryCache"/> is created with name "in-memory". That name is
/// used to retrieve configuration options. It does not identify the memory cache, i.e.
/// each instance of this class has its own, independent, memory cache.</remarks>
public class ObjectCacheRuntimeCacheProvider : IRuntimeCacheProvider
public class ObjectCacheAppCache : IAppPolicyCache
{
private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
internal ObjectCache MemoryCache;
/// <summary>
/// Used for debugging
/// Initializes a new instance of the <see cref="ObjectCacheAppCache"/>.
/// </summary>
internal Guid InstanceId { get; private set; }
public ObjectCacheRuntimeCacheProvider()
public ObjectCacheAppCache()
{
// the MemoryCache is created with name "in-memory". That name is
// used to retrieve configuration options. It does not identify the memory cache, i.e.
// each instance of this class has its own, independent, memory cache.
MemoryCache = new MemoryCache("in-memory");
InstanceId = Guid.NewGuid();
}
#region Clear
/// <summary>
/// Gets the internal memory cache, for tests only!
/// </summary>
internal ObjectCache MemoryCache { get; private set; }
public virtual void ClearAllCache()
/// <inheritdoc />
public object Get(string key)
{
Lazy<object> result;
try
{
_locker.EnterReadLock();
result = MemoryCache.Get(key) as Lazy<object>; // null if key not found
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return result == null ? null : FastDictionaryAppCacheBase.GetSafeLazyValue(result); // return exceptions as null
}
/// <inheritdoc />
public object Get(string key, Func<object> factory)
{
return Get(key, factory, null);
}
/// <inheritdoc />
public IEnumerable<object> SearchByKey(string keyStartsWith)
{
KeyValuePair<string, object>[] entries;
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => x.Key.InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => FastDictionaryAppCacheBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
.ToList();
}
/// <inheritdoc />
public IEnumerable<object> SearchByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
KeyValuePair<string, object>[] entries;
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => compiled.IsMatch(x.Key))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => FastDictionaryAppCacheBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
.ToList();
}
/// <inheritdoc />
public object Get(string key, Func<object> factory, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
// see notes in HttpRuntimeAppCache
Lazy<object> result;
using (var lck = new UpgradeableReadLock(_locker))
{
result = MemoryCache.Get(key) as Lazy<object>;
if (result == null || FastDictionaryAppCacheBase.GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = FastDictionaryAppCacheBase.GetSafeLazy(factory);
var policy = GetPolicy(timeout, isSliding, removedCallback, dependentFiles);
lck.UpgradeToWriteLock();
//NOTE: This does an add or update
MemoryCache.Set(key, result, policy);
}
}
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
if (value is FastDictionaryAppCacheBase.ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
/// <inheritdoc />
public void Insert(string key, Func<object> factory, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
// NOTE - here also we must insert a Lazy<object> but we can evaluate it right now
// and make sure we don't store a null value.
var result = FastDictionaryAppCacheBase.GetSafeLazy(factory);
var value = result.Value; // force evaluation now
if (value == null) return; // do not store null values (backward compat)
var policy = GetPolicy(timeout, isSliding, removedCallback, dependentFiles);
//NOTE: This does an add or update
MemoryCache.Set(key, result, policy);
}
/// <inheritdoc />
public virtual void Clear()
{
try
{
@@ -50,7 +161,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheItem(string key)
/// <inheritdoc />
public virtual void Clear(string key)
{
try
{
@@ -65,7 +177,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes(string typeName)
/// <inheritdoc />
public virtual void ClearOfType(string typeName)
{
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
@@ -79,7 +192,7 @@ namespace Umbraco.Core.Cache
// x.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
@@ -96,12 +209,13 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes<T>()
/// <inheritdoc />
public virtual void ClearOfType<T>()
{
try
{
_locker.EnterWriteLock();
var typeOfT = typeof (T);
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var key in MemoryCache
.Where(x =>
@@ -109,7 +223,7 @@ namespace Umbraco.Core.Cache
// x.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
@@ -127,7 +241,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
/// <inheritdoc />
public virtual void ClearOfType<T>(Func<string, T, bool> predicate)
{
try
{
@@ -140,7 +255,7 @@ namespace Umbraco.Core.Cache
// x.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = FastDictionaryAppCacheBase.GetSafeLazyValue((Lazy<object>)x.Value, true);
if (value == null) return true;
// if T is an interface remove anything that implements that interface
@@ -159,7 +274,8 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheByKeySearch(string keyStartsWith)
/// <inheritdoc />
public virtual void ClearByKey(string keyStartsWith)
{
try
{
@@ -177,13 +293,16 @@ namespace Umbraco.Core.Cache
}
}
public virtual void ClearCacheByKeyExpression(string regexString)
/// <inheritdoc />
public virtual void ClearByRegex(string regex)
{
var compiled = new Regex(regex, RegexOptions.Compiled);
try
{
_locker.EnterWriteLock();
foreach (var key in MemoryCache
.Where(x => Regex.IsMatch(x.Key, regexString))
.Where(x => compiled.IsMatch(x.Key))
.Select(x => x.Key)
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
@@ -195,120 +314,6 @@ namespace Umbraco.Core.Cache
}
}
#endregion
#region Get
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
KeyValuePair<string, object>[] entries;
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => x.Key.InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
.ToList();
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
KeyValuePair<string, object>[] entries;
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => Regex.IsMatch(x.Key, regexString))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
.ToList();
}
public object GetCacheItem(string cacheKey)
{
Lazy<object> result;
try
{
_locker.EnterReadLock();
result = MemoryCache.Get(cacheKey) as Lazy<object>; // null if key not found
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return result == null ? null : DictionaryCacheProviderBase.GetSafeLazyValue(result); // return exceptions as null
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
return GetCacheItem(cacheKey, getCacheItem, null);
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
// see notes in HttpRuntimeCacheProvider
Lazy<object> result;
using (var lck = new UpgradeableReadLock(_locker))
{
result = MemoryCache.Get(cacheKey) as Lazy<object>;
if (result == null || DictionaryCacheProviderBase.GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var policy = GetPolicy(timeout, isSliding, removedCallback, dependentFiles);
lck.UpgradeToWriteLock();
//NOTE: This does an add or update
MemoryCache.Set(cacheKey, result, policy);
}
}
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
if (value is DictionaryCacheProviderBase.ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
#endregion
#region Insert
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
// NOTE - here also we must insert a Lazy<object> but we can evaluate it right now
// and make sure we don't store a null value.
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now
if (value == null) return; // do not store null values (backward compat)
var policy = GetPolicy(timeout, isSliding, removedCallback, dependentFiles);
//NOTE: This does an add or update
MemoryCache.Set(cacheKey, result, policy);
}
#endregion
private static CacheItemPolicy GetPolicy(TimeSpan? timeout = null, bool isSliding = false, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
var absolute = isSliding ? ObjectCache.InfiniteAbsoluteExpiration : (timeout == null ? ObjectCache.InfiniteAbsoluteExpiration : DateTime.Now.Add(timeout.Value));
@@ -15,8 +15,8 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Initializes a new instance of the <see cref="PayloadCacheRefresherBase{TInstanceType, TPayload}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected PayloadCacheRefresherBase(CacheHelper cacheHelper) : base(cacheHelper)
/// <param name="appCaches">A cache helper.</param>
protected PayloadCacheRefresherBase(AppCaches appCaches) : base(appCaches)
{ }
#region Json
@@ -13,16 +13,16 @@ namespace Umbraco.Core.Cache
internal abstract class RepositoryCachePolicyBase<TEntity, TId> : IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IEntity
{
private readonly IRuntimeCacheProvider _globalCache;
private readonly IAppPolicyCache _globalCache;
private readonly IScopeAccessor _scopeAccessor;
protected RepositoryCachePolicyBase(IRuntimeCacheProvider globalCache, IScopeAccessor scopeAccessor)
protected RepositoryCachePolicyBase(IAppPolicyCache globalCache, IScopeAccessor scopeAccessor)
{
_globalCache = globalCache ?? throw new ArgumentNullException(nameof(globalCache));
_scopeAccessor = scopeAccessor ?? throw new ArgumentNullException(nameof(scopeAccessor));
}
protected IRuntimeCacheProvider Cache
protected IAppPolicyCache Cache
{
get
{
@@ -32,9 +32,9 @@ namespace Umbraco.Core.Cache
case RepositoryCacheMode.Default:
return _globalCache;
case RepositoryCacheMode.Scoped:
return ambientScope.IsolatedRuntimeCache.GetOrCreateCache<TEntity>();
return ambientScope.IsolatedCaches.GetOrCreate<TEntity>();
case RepositoryCacheMode.None:
return NullCacheProvider.Instance;
return NoAppCache.Instance;
default:
throw new NotSupportedException($"Repository cache mode {ambientScope.RepositoryCacheMode} is not supported.");
}
@@ -16,7 +16,7 @@ namespace Umbraco.Core.Cache
internal class SingleItemsOnlyRepositoryCachePolicy<TEntity, TId> : DefaultRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IEntity
{
public SingleItemsOnlyRepositoryCachePolicy(IRuntimeCacheProvider cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options)
public SingleItemsOnlyRepositoryCachePolicy(IAppPolicyCache cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options)
: base(cache, scopeAccessor, options)
{ }
@@ -1,79 +0,0 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Represents a cache provider that statically caches item in a concurrent dictionary.
/// </summary>
public class StaticCacheProvider : ICacheProvider
{
internal readonly ConcurrentDictionary<string, object> StaticCache = new ConcurrentDictionary<string, object>();
public virtual void ClearAllCache()
{
StaticCache.Clear();
}
public virtual void ClearCacheItem(string key)
{
object val;
StaticCache.TryRemove(key, out val);
}
public virtual void ClearCacheObjectTypes(string typeName)
{
StaticCache.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType().ToString().InvariantEquals(typeName));
}
public virtual void ClearCacheObjectTypes<T>()
{
var typeOfT = typeof(T);
StaticCache.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType() == typeOfT);
}
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
{
var typeOfT = typeof(T);
StaticCache.RemoveAll(kvp => kvp.Value != null && kvp.Value.GetType() == typeOfT && predicate(kvp.Key, (T)kvp.Value));
}
public virtual void ClearCacheByKeySearch(string keyStartsWith)
{
StaticCache.RemoveAll(kvp => kvp.Key.InvariantStartsWith(keyStartsWith));
}
public virtual void ClearCacheByKeyExpression(string regexString)
{
StaticCache.RemoveAll(kvp => Regex.IsMatch(kvp.Key, regexString));
}
public virtual IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return (from KeyValuePair<string, object> c in StaticCache
where c.Key.InvariantStartsWith(keyStartsWith)
select c.Value).ToList();
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
return (from KeyValuePair<string, object> c in StaticCache
where Regex.IsMatch(c.Key, regexString)
select c.Value).ToList();
}
public virtual object GetCacheItem(string cacheKey)
{
var result = StaticCache[cacheKey];
return result;
}
public virtual object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
return StaticCache.GetOrAdd(cacheKey, key => getCacheItem());
}
}
}
@@ -14,9 +14,9 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Initializes a new instance of the <see cref="TypedCacheRefresherBase{TInstanceType, TEntityType}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected TypedCacheRefresherBase(CacheHelper cacheHelper)
: base(cacheHelper)
/// <param name="appCaches">A cache helper.</param>
protected TypedCacheRefresherBase(AppCaches appCaches)
: base(appCaches)
{ }
#region Refresher
@@ -4,14 +4,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web.Caching;
using CacheItemPriority = System.Web.Caching.CacheItemPriority;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A CacheProvider that wraps the logic of the HttpRuntime.Cache
/// Implements <see cref="IAppPolicyCache"/> on top of a <see cref="System.Web.Caching.Cache"/>.
/// </summary>
internal class HttpRuntimeCacheProvider : DictionaryCacheProviderBase, IRuntimeCacheProvider
/// <remarks>The underlying cache is expected to be HttpRuntime.Cache.</remarks>
internal class WebCachingAppCache : FastDictionaryAppCacheBase, IAppPolicyCache
{
// locker object that supports upgradeable read locking
// does not need to support recursion if we implement the cache correctly and ensure
@@ -21,16 +21,43 @@ namespace Umbraco.Core.Cache
private readonly System.Web.Caching.Cache _cache;
/// <summary>
/// Used for debugging
/// Initializes a new instance of the <see cref="WebCachingAppCache"/> class.
/// </summary>
internal Guid InstanceId { get; private set; }
public HttpRuntimeCacheProvider(System.Web.Caching.Cache cache)
public WebCachingAppCache(System.Web.Caching.Cache cache)
{
_cache = cache;
InstanceId = Guid.NewGuid();
}
/// <inheritdoc />
public override object Get(string key, Func<object> factory)
{
return Get(key, factory, null, dependentFiles: null);
}
/// <inheritdoc />
public object Get(string key, Func<object> factory, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
CacheDependency dependency = null;
if (dependentFiles != null && dependentFiles.Any())
{
dependency = new CacheDependency(dependentFiles);
}
return Get(key, factory, timeout, isSliding, priority, removedCallback, dependency);
}
/// <inheritdoc />
public void Insert(string key, Func<object> factory, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
CacheDependency dependency = null;
if (dependentFiles != null && dependentFiles.Any())
{
dependency = new CacheDependency(dependentFiles);
}
Insert(key, factory, timeout, isSliding, priority, removedCallback, dependency);
}
#region Dictionary
protected override IEnumerable<DictionaryEntry> GetDictionaryEntries()
{
const string prefix = CacheItemPrefix + "-";
@@ -48,6 +75,8 @@ namespace Umbraco.Core.Cache
return _cache.Get(key);
}
#endregion
#region Lock
protected override void EnterReadLock()
@@ -74,33 +103,9 @@ namespace Umbraco.Core.Cache
#endregion
#region Get
/// <summary>
/// Gets (and adds if necessary) an item from the cache with all of the default parameters
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override object GetCacheItem(string cacheKey, Func<object> getCacheItem)
private object Get(string key, Func<object> factory, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, CacheDependency dependency = null)
{
return GetCacheItem(cacheKey, getCacheItem, null, dependentFiles: null);
}
/// <summary>
/// This overload is here for legacy purposes
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <param name="timeout"></param>
/// <param name="isSliding"></param>
/// <param name="priority"></param>
/// <param name="removedCallback"></param>
/// <param name="dependency"></param>
/// <returns></returns>
internal object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, CacheDependency dependency = null)
{
cacheKey = GetCacheKey(cacheKey);
key = GetCacheKey(key);
// NOTE - because we don't know what getCacheItem does, how long it will take and whether it will hang,
// getCacheItem should run OUTSIDE of the global application lock else we run into lock contention and
@@ -133,7 +138,7 @@ namespace Umbraco.Core.Cache
try
{
_locker.EnterReadLock();
result = _cache.Get(cacheKey) as Lazy<object>; // null if key not found
result = _cache.Get(key) as Lazy<object>; // null if key not found
}
finally
{
@@ -145,7 +150,7 @@ namespace Umbraco.Core.Cache
using (var lck = new UpgradeableReadLock(_locker))
{
result = _cache.Get(cacheKey) as Lazy<object>; // null if key not found
result = _cache.Get(key) as Lazy<object>; // null if key not found
// cannot create value within the lock, so if result.IsValueCreated is false, just
// do nothing here - means that if creation throws, a race condition could cause
@@ -153,13 +158,13 @@ namespace Umbraco.Core.Cache
if (result == null || GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = GetSafeLazy(getCacheItem);
result = GetSafeLazy(factory);
var absolute = isSliding ? System.Web.Caching.Cache.NoAbsoluteExpiration : (timeout == null ? System.Web.Caching.Cache.NoAbsoluteExpiration : DateTime.Now.Add(timeout.Value));
var sliding = isSliding == false ? System.Web.Caching.Cache.NoSlidingExpiration : (timeout ?? System.Web.Caching.Cache.NoSlidingExpiration);
lck.UpgradeToWriteLock();
//NOTE: 'Insert' on System.Web.Caching.Cache actually does an add or update!
_cache.Insert(cacheKey, result, dependency, absolute, sliding, priority, removedCallback);
_cache.Insert(key, result, dependency, absolute, sliding, priority, removedCallback);
}
}
@@ -175,31 +180,7 @@ namespace Umbraco.Core.Cache
return value;
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
CacheDependency dependency = null;
if (dependentFiles != null && dependentFiles.Any())
{
dependency = new CacheDependency(dependentFiles);
}
return GetCacheItem(cacheKey, getCacheItem, timeout, isSliding, priority, removedCallback, dependency);
}
#endregion
#region Insert
/// <summary>
/// This overload is here for legacy purposes
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <param name="timeout"></param>
/// <param name="isSliding"></param>
/// <param name="priority"></param>
/// <param name="removedCallback"></param>
/// <param name="dependency"></param>
internal void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, CacheDependency dependency = null)
private void Insert(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, CacheDependency dependency = null)
{
// NOTE - here also we must insert a Lazy<object> but we can evaluate it right now
// and make sure we don't store a null value.
@@ -225,17 +206,5 @@ namespace Umbraco.Core.Cache
_locker.ExitWriteLock();
}
}
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
CacheDependency dependency = null;
if (dependentFiles != null && dependentFiles.Any())
{
dependency = new CacheDependency(dependentFiles);
}
InsertCacheItem(cacheKey, getCacheItem, timeout, isSliding, priority, removedCallback, dependency);
}
#endregion
}
}
@@ -125,6 +125,18 @@ namespace Umbraco.Core.Collections
}
public void ReplaceAll(IEnumerable<TValue> values)
{
if (values == null) throw new ArgumentNullException(nameof(values));
Clear();
foreach (var value in values)
{
Add(value);
}
}
public bool Remove(TKey key)
{
if (!Indecies.ContainsKey(key)) return false;
@@ -1,13 +0,0 @@
namespace Umbraco.Core.Components
{
/// <summary>
/// Represents a core <see cref="IComposer"/>.
/// </summary>
/// <remarks>
/// <para>All core composers are required by (compose before) all user composers,
/// and require (compose after) all runtime composers.</para>
/// </remarks>
[ComposeAfter(typeof(IRuntimeComposer))]
public interface ICoreComposer : IComposer
{ }
}
@@ -1,11 +0,0 @@
namespace Umbraco.Core.Components
{
/// <summary>
/// Represents a runtime <see cref="IComposer"/>.
/// </summary>
/// <remarks>
/// <para>All runtime composers are required by (compose before) all core composers</para>
/// </remarks>
public interface IRuntimeComposer : IComposer
{ }
}
@@ -1,13 +0,0 @@
using System;
namespace Umbraco.Core.Components
{
[AttributeUsage(AttributeTargets.Class /*, AllowMultiple = false, Inherited = true*/)]
public class RuntimeLevelAttribute : Attribute
{
//public RuntimeLevelAttribute()
//{ }
public RuntimeLevel MinLevel { get; set; } = RuntimeLevel.Boot;
}
}
@@ -3,6 +3,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Web;
using Umbraco.Core.Composing;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
@@ -10,7 +11,7 @@ using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Compose
{
public sealed class AuditEventsComponent : IComponent
{
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Components
using Umbraco.Core.Composing;
namespace Umbraco.Core.Compose
{
public sealed class AuditEventsComposer : ComponentComposer<AuditEventsComponent>, ICoreComposer
{ }
@@ -1,9 +1,10 @@
using System.IO;
using Umbraco.Core.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Manifest;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Compose
{
public sealed class ManifestWatcherComponent : IComponent
{
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Components
using Umbraco.Core.Composing;
namespace Umbraco.Core.Compose
{
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
public class ManifestWatcherComposer : ComponentComposer<ManifestWatcherComponent>, ICoreComposer
@@ -3,9 +3,9 @@ using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Compose
{
//TODO: This should just exist in the content service/repo!
// TODO: This should just exist in the content service/repo!
public sealed class RelateOnCopyComponent : IComponent
{
public void Initialize()
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Components
using Umbraco.Core.Composing;
namespace Umbraco.Core.Compose
{
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
public sealed class RelateOnCopyComposer : ComponentComposer<RelateOnCopyComponent>, ICoreComposer
@@ -5,7 +5,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Compose
{
public sealed class RelateOnTrashComponent : IComponent
{
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Components
using Umbraco.Core.Composing;
namespace Umbraco.Core.Compose
{
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
public sealed class RelateOnTrashComposer : ComponentComposer<RelateOnTrashComponent>, ICoreComposer
@@ -12,7 +12,7 @@ namespace Umbraco.Core.Composing
/// <typeparam name="TItem">The type of the items.</typeparam>
public abstract class CollectionBuilderBase<TBuilder, TCollection, TItem> : ICollectionBuilder<TCollection, TItem>
where TBuilder: CollectionBuilderBase<TBuilder, TCollection, TItem>
where TCollection : IBuilderCollection<TItem>
where TCollection : class, IBuilderCollection<TItem>
{
private readonly List<Type> _types = new List<Type>();
private readonly object _locker = new object();
@@ -1,9 +1,8 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Composing;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents the collection of <see cref="IComponent"/> implementations.
@@ -24,7 +23,7 @@ namespace Umbraco.Core.Components
{
using (_logger.DebugDuration<ComponentCollection>($"Initializing. (log components when >{LogThresholdMilliseconds}ms)", "Initialized."))
{
foreach (var component in this.Reverse()) // terminate components in reverse order
foreach (var component in this)
{
var componentType = component.GetType();
using (_logger.DebugDuration<ComponentCollection>($"Initializing {componentType.FullName}.", $"Initialized {componentType.FullName}.", thresholdMilliseconds: LogThresholdMilliseconds))
@@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Composing;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Builds a <see cref="ComponentCollection"/>.
@@ -31,7 +30,7 @@ namespace Umbraco.Core.Components
protected override IComponent CreateItem(IFactory factory, Type itemType)
{
using (_logger.DebugDuration<Composers>($"Creating {itemType.FullName}.", $"Created {itemType.FullName}.", thresholdMilliseconds: LogThresholdMilliseconds))
using (_logger.DebugDuration<ComponentCollectionBuilder>($"Creating {itemType.FullName}.", $"Created {itemType.FullName}.", thresholdMilliseconds: LogThresholdMilliseconds))
{
return base.CreateItem(factory, itemType);
}
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Components
using Umbraco.Core.Compose;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Provides a base class for composers which compose a component.
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer requires another composer.
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a component is required by another composer.
@@ -6,7 +6,7 @@ using System.Text;
using Umbraco.Core.Collections;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
// note: this class is NOT thread-safe in any ways
@@ -70,42 +70,104 @@ namespace Umbraco.Core.Components
}
}
private IEnumerable<Type> PrepareComposerTypes()
internal IEnumerable<Type> PrepareComposerTypes()
{
var requirements = GetRequirements();
// only for debugging, this is verbose
//_logger.Debug<Composers>(GetComposersReport(requirements));
var sortedComposerTypes = SortComposers(requirements);
// bit verbose but should help for troubleshooting
//var text = "Ordered Composers: " + Environment.NewLine + string.Join(Environment.NewLine, sortedComposerTypes) + Environment.NewLine;
_logger.Debug<Composers>("Ordered Composers: {SortedComposerTypes}", sortedComposerTypes);
return sortedComposerTypes;
}
internal Dictionary<Type, List<Type>> GetRequirements(bool throwOnMissing = true)
{
// create a list, remove those that cannot be enabled due to runtime level
var composerTypeList = _composerTypes
.Where(x =>
{
// use the min level specified by the attribute if any
// otherwise, user composers have Run min level, anything else is Unknown (always run)
// use the min/max levels specified by the attribute if any
// otherwise, min: user composers are Run, anything else is Unknown (always run)
// max: everything is Run (always run)
var attr = x.GetCustomAttribute<RuntimeLevelAttribute>();
var minLevel = attr?.MinLevel ?? (x.Implements<IUserComposer>() ? RuntimeLevel.Run : RuntimeLevel.Unknown);
return _composition.RuntimeState.Level >= minLevel;
var maxLevel = attr?.MaxLevel ?? RuntimeLevel.Run;
return _composition.RuntimeState.Level >= minLevel && _composition.RuntimeState.Level <= maxLevel;
})
.ToList();
// enable or disable composers
EnableDisableComposers(composerTypeList);
// sort the composers according to their dependencies
var requirements = new Dictionary<Type, List<Type>>();
foreach (var type in composerTypeList) requirements[type] = null;
foreach (var type in composerTypeList)
void GatherInterfaces<TAttribute>(Type type, Func<TAttribute, Type> getTypeInAttribute, HashSet<Type> iset, List<Type> set2)
where TAttribute : Attribute
{
GatherRequirementsFromRequireAttribute(type, composerTypeList, requirements);
GatherRequirementsFromRequiredByAttribute(type, composerTypeList, requirements);
foreach (var attribute in type.GetCustomAttributes<TAttribute>())
{
var typeInAttribute = getTypeInAttribute(attribute);
if (typeInAttribute != null && // if the attribute references a type ...
typeInAttribute.IsInterface && // ... which is an interface ...
typeof(IComposer).IsAssignableFrom(typeInAttribute) && // ... which implements IComposer ...
!iset.Contains(typeInAttribute)) // ... which is not already in the list
{
// add it to the new list
iset.Add(typeInAttribute);
set2.Add(typeInAttribute);
// add all its interfaces implementing IComposer
foreach (var i in typeInAttribute.GetInterfaces().Where(x => typeof(IComposer).IsAssignableFrom(x)))
{
iset.Add(i);
set2.Add(i);
}
}
}
}
// only for debugging, this is verbose
//_logger.Debug<Composers>(GetComposersReport(requirements));
// gather interfaces too
var interfaces = new HashSet<Type>(composerTypeList.SelectMany(x => x.GetInterfaces().Where(y => typeof(IComposer).IsAssignableFrom(y))));
composerTypeList.AddRange(interfaces);
var list1 = composerTypeList;
while (list1.Count > 0)
{
var list2 = new List<Type>();
foreach (var t in list1)
{
GatherInterfaces<ComposeAfterAttribute>(t, a => a.RequiredType, interfaces, list2);
GatherInterfaces<ComposeBeforeAttribute>(t, a => a.RequiringType, interfaces, list2);
}
composerTypeList.AddRange(list2);
list1 = list2;
}
// sort the composers according to their dependencies
var requirements = new Dictionary<Type, List<Type>>();
foreach (var type in composerTypeList)
requirements[type] = null;
foreach (var type in composerTypeList)
{
GatherRequirementsFromAfterAttribute(type, composerTypeList, requirements, throwOnMissing);
GatherRequirementsFromBeforeAttribute(type, composerTypeList, requirements);
}
return requirements;
}
internal IEnumerable<Type> SortComposers(Dictionary<Type, List<Type>> requirements)
{
// sort composers
var graph = new TopoGraph<Type, KeyValuePair<Type, List<Type>>>(kvp => kvp.Key, kvp => kvp.Value);
graph.AddItems(requirements);
List<Type> sortedComposerTypes;
try
{
sortedComposerTypes = graph.GetSortedItems().Select(x => x.Key).ToList();
sortedComposerTypes = graph.GetSortedItems().Select(x => x.Key).Where(x => !x.IsInterface).ToList();
}
catch (Exception e)
{
@@ -115,40 +177,37 @@ namespace Umbraco.Core.Components
throw;
}
// bit verbose but should help for troubleshooting
//var text = "Ordered Composers: " + Environment.NewLine + string.Join(Environment.NewLine, sortedComposerTypes) + Environment.NewLine;
_logger.Debug<Composers>("Ordered Composers: {SortedComposerTypes}", sortedComposerTypes);
return sortedComposerTypes;
}
private static string GetComposersReport(Dictionary<Type, List<Type>> requirements)
internal static string GetComposersReport(Dictionary<Type, List<Type>> requirements)
{
var text = new StringBuilder();
text.AppendLine("Composers & Dependencies:");
text.AppendLine(" < compose before");
text.AppendLine(" > compose after");
text.AppendLine(" : implements");
text.AppendLine(" = depends");
text.AppendLine();
bool HasReq(IEnumerable<Type> types, Type type)
=> types.Any(x => type.IsAssignableFrom(x) && !x.IsInterface);
foreach (var kvp in requirements)
{
var type = kvp.Key;
text.AppendLine(type.FullName);
foreach (var attribute in type.GetCustomAttributes<ComposeAfterAttribute>())
text.AppendLine(" -> " + attribute.RequiredType + (attribute.Weak.HasValue
? (attribute.Weak.Value ? " (weak)" : (" (strong" + (requirements.ContainsKey(attribute.RequiredType) ? ", missing" : "") + ")"))
: ""));
foreach (var attribute in type.GetCustomAttributes<ComposeBeforeAttribute>())
text.AppendLine(" -< " + attribute.RequiringType);
foreach (var i in type.GetInterfaces())
{
text.AppendLine(" : " + i.FullName);
foreach (var attribute in i.GetCustomAttributes<ComposeAfterAttribute>())
text.AppendLine(" -> " + attribute.RequiredType + (attribute.Weak.HasValue
? (attribute.Weak.Value ? " (weak)" : (" (strong" + (requirements.ContainsKey(attribute.RequiredType) ? ", missing" : "") + ")"))
: ""));
foreach (var attribute in i.GetCustomAttributes<ComposeBeforeAttribute>())
text.AppendLine(" -< " + attribute.RequiringType);
var weak = !(attribute.RequiredType.IsInterface ? attribute.Weak == false : attribute.Weak != true);
text.AppendLine(" > " + attribute.RequiredType +
(weak ? " (weak" : " (strong") + (HasReq(requirements.Keys, attribute.RequiredType) ? ", found" : ", missing") + ")");
}
foreach (var attribute in type.GetCustomAttributes<ComposeBeforeAttribute>())
text.AppendLine(" < " + attribute.RequiringType);
foreach (var i in type.GetInterfaces())
text.AppendLine(" : " + i.FullName);
if (kvp.Value != null)
foreach (var t in kvp.Value)
text.AppendLine(" = " + t);
@@ -171,27 +230,46 @@ namespace Umbraco.Core.Components
// what happens in case of conflicting remote declarations is unspecified. more
// precisely, the last declaration to be processed wins, but the order of the
// declarations depends on the type finder and is unspecified.
void UpdateEnableInfo(Type composerType, int weight2, Dictionary<Type, EnableInfo> enabled2, bool value)
{
if (enabled.TryGetValue(composerType, out var enableInfo) == false) enableInfo = enabled2[composerType] = new EnableInfo();
if (enableInfo.Weight > weight2) return;
enableInfo.Enabled = value;
enableInfo.Weight = weight2;
}
var assemblies = types.Select(x => x.Assembly).Distinct();
foreach (var assembly in assemblies)
{
foreach (var attr in assembly.GetCustomAttributes<EnableComposerAttribute>())
{
var type = attr.EnabledType;
UpdateEnableInfo(type, 2, enabled, true);
}
foreach (var attr in assembly.GetCustomAttributes<DisableComposerAttribute>())
{
var type = attr.DisabledType;
UpdateEnableInfo(type, 2, enabled, false);
}
}
foreach (var composerType in types)
{
foreach (var attr in composerType.GetCustomAttributes<EnableAttribute>())
{
var type = attr.EnabledType ?? composerType;
if (enabled.TryGetValue(type, out var enableInfo) == false) enableInfo = enabled[type] = new EnableInfo();
var weight = type == composerType ? 1 : 2;
if (enableInfo.Weight > weight) continue;
enableInfo.Enabled = true;
enableInfo.Weight = weight;
var weight = type == composerType ? 1 : 3;
UpdateEnableInfo(type, weight, enabled, true);
}
foreach (var attr in composerType.GetCustomAttributes<DisableAttribute>())
{
var type = attr.DisabledType ?? composerType;
if (enabled.TryGetValue(type, out var enableInfo) == false) enableInfo = enabled[type] = new EnableInfo();
var weight = type == composerType ? 1 : 2;
if (enableInfo.Weight > weight) continue;
enableInfo.Enabled = false;
enableInfo.Weight = weight;
var weight = type == composerType ? 1 : 3;
UpdateEnableInfo(type, weight, enabled, false);
}
}
@@ -200,16 +278,16 @@ namespace Umbraco.Core.Components
types.Remove(kvp.Key);
}
private static void GatherRequirementsFromRequireAttribute(Type type, ICollection<Type> types, IDictionary<Type, List<Type>> requirements)
private static void GatherRequirementsFromAfterAttribute(Type type, ICollection<Type> types, IDictionary<Type, List<Type>> requirements, bool throwOnMissing = true)
{
// get 'require' attributes
// these attributes are *not* inherited because we want to "custom-inherit" for interfaces only
var requireAttributes = type
var afterAttributes = type
.GetInterfaces().SelectMany(x => x.GetCustomAttributes<ComposeAfterAttribute>()) // those marking interfaces
.Concat(type.GetCustomAttributes<ComposeAfterAttribute>()); // those marking the composer
// what happens in case of conflicting attributes (different strong/weak for same type) is not specified.
foreach (var attr in requireAttributes)
foreach (var attr in afterAttributes)
{
if (attr.RequiredType == type) continue; // ignore self-requirements (+ exclude in implems, below)
@@ -217,13 +295,13 @@ namespace Umbraco.Core.Components
// unless strong, and then require at least one enabled composer implementing that interface
if (attr.RequiredType.IsInterface)
{
var implems = types.Where(x => x != type && attr.RequiredType.IsAssignableFrom(x)).ToList();
var implems = types.Where(x => x != type && attr.RequiredType.IsAssignableFrom(x) && !x.IsInterface).ToList();
if (implems.Count > 0)
{
if (requirements[type] == null) requirements[type] = new List<Type>();
requirements[type].AddRange(implems);
}
else if (attr.Weak == false) // if explicitly set to !weak, is strong, else is weak
else if (attr.Weak == false && throwOnMissing) // if explicitly set to !weak, is strong, else is weak
throw new Exception($"Broken composer dependency: {type.FullName} -> {attr.RequiredType.FullName}.");
}
// requiring a class = require that the composer is enabled
@@ -235,28 +313,28 @@ namespace Umbraco.Core.Components
if (requirements[type] == null) requirements[type] = new List<Type>();
requirements[type].Add(attr.RequiredType);
}
else if (attr.Weak != true) // if not explicitly set to weak, is strong
else if (attr.Weak != true && throwOnMissing) // if not explicitly set to weak, is strong
throw new Exception($"Broken composer dependency: {type.FullName} -> {attr.RequiredType.FullName}.");
}
}
}
private static void GatherRequirementsFromRequiredByAttribute(Type type, ICollection<Type> types, IDictionary<Type, List<Type>> requirements)
private static void GatherRequirementsFromBeforeAttribute(Type type, ICollection<Type> types, IDictionary<Type, List<Type>> requirements)
{
// get 'required' attributes
// these attributes are *not* inherited because we want to "custom-inherit" for interfaces only
var requiredAttributes = type
var beforeAttributes = type
.GetInterfaces().SelectMany(x => x.GetCustomAttributes<ComposeBeforeAttribute>()) // those marking interfaces
.Concat(type.GetCustomAttributes<ComposeBeforeAttribute>()); // those marking the composer
foreach (var attr in requiredAttributes)
foreach (var attr in beforeAttributes)
{
if (attr.RequiringType == type) continue; // ignore self-requirements (+ exclude in implems, below)
// required by an interface = by any enabled composer implementing this that interface
if (attr.RequiringType.IsInterface)
{
var implems = types.Where(x => x != type && attr.RequiringType.IsAssignableFrom(x)).ToList();
var implems = types.Where(x => x != type && attr.RequiringType.IsAssignableFrom(x) && !x.IsInterface).ToList();
foreach (var implem in implems)
{
if (requirements[implem] == null) requirements[implem] = new List<Type>();
@@ -1,10 +1,9 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a composition.
@@ -17,7 +16,7 @@ namespace Umbraco.Core.Components
public class Composition : IRegister
{
private readonly Dictionary<Type, ICollectionBuilder> _builders = new Dictionary<Type, ICollectionBuilder>();
private readonly Dictionary<Type, Unique> _uniques = new Dictionary<Type, Unique>();
private readonly Dictionary<string, Action<IRegister>> _uniques = new Dictionary<string, Action<IRegister>>();
private readonly IRegister _register;
/// <summary>
@@ -83,11 +82,32 @@ namespace Umbraco.Core.Components
/// <inheritdoc />
public void Register<TService>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class
=> _register.Register(factory, lifetime);
/// <inheritdoc />
public void RegisterInstance(Type serviceType, object instance)
=> _register.RegisterInstance(serviceType, instance);
public void Register(Type serviceType, object instance)
=> _register.Register(serviceType, instance);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Lifetime lifetime = Lifetime.Transient)
where TService : class
=> _register.RegisterFor<TService, TTarget>(lifetime);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Type implementingType, Lifetime lifetime = Lifetime.Transient)
where TService : class
=> _register.RegisterFor<TService, TTarget>(implementingType, lifetime);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class
=> _register.RegisterFor<TService, TTarget>(factory, lifetime);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(TService instance)
where TService : class
=> _register.RegisterFor<TService, TTarget>(instance);
/// <inheritdoc />
public void RegisterAuto(Type serviceBaseType)
@@ -104,10 +124,12 @@ namespace Umbraco.Core.Components
onCreating();
foreach (var unique in _uniques.Values)
unique.RegisterWith(_register);
unique(_register);
_uniques.Clear(); // no point keep them around
foreach (var builder in _builders.Values)
builder.RegisterWith(_register);
_builders.Clear(); // no point keep them around
Configs.RegisterWith(_register);
@@ -123,74 +145,78 @@ namespace Umbraco.Core.Components
#region Unique
private string GetUniqueName<TService>()
=> GetUniqueName(typeof(TService));
private string GetUniqueName(Type serviceType)
=> serviceType.FullName;
private string GetUniqueName<TService, TTarget>()
=> GetUniqueName(typeof(TService), typeof(TTarget));
private string GetUniqueName(Type serviceType, Type targetType)
=> serviceType.FullName + "::" + targetType.FullName;
/// <summary>
/// Registers a unique service.
/// Registers a unique service as its own implementation.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUnique(Type serviceType)
=> _uniques[GetUniqueName(serviceType)] = register => register.Register(serviceType, Lifetime.Singleton);
/// <summary>
/// Registers a unique service with an implementation type.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUnique(Type serviceType, Type implementingType)
=> _uniques[serviceType] = new Unique(serviceType, implementingType);
=> _uniques[GetUniqueName(serviceType)] = register => register.Register(serviceType, implementingType, Lifetime.Singleton);
/// <summary>
/// Registers a unique service.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUnique(Type serviceType, object instance)
=> _uniques[serviceType] = new Unique(serviceType, instance);
/// <summary>
/// Registers a unique service.
/// Registers a unique service with an implementation factory.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUnique<TService>(Func<IFactory, TService> factory)
=> _uniques[typeof(TService)] = new Unique<TService>(factory);
where TService : class
=> _uniques[GetUniqueName<TService>()] = register => register.Register<TService>(factory, Lifetime.Singleton);
private class Unique
{
private readonly Type _serviceType;
private readonly Type _implementingType;
private readonly object _instance;
/// <summary>
/// Registers a unique service with an implementing instance.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUnique(Type serviceType, object instance)
=> _uniques[GetUniqueName(serviceType)] = register => register.Register(serviceType, instance);
protected Unique(Type serviceType)
{
_serviceType = serviceType;
}
/// <summary>
/// Registers a unique service for a target, as its own implementation.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUniqueFor<TService, TTarget>()
where TService : class
=> _uniques[GetUniqueName<TService, TTarget>()] = register => register.RegisterFor<TService, TTarget>(Lifetime.Singleton);
public Unique(Type serviceType, Type implementingType)
: this(serviceType)
{
_implementingType = implementingType;
}
/// <summary>
/// Registers a unique service for a target, with an implementing type.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUniqueFor<TService, TTarget>(Type implementingType)
where TService : class
=> _uniques[GetUniqueName<TService, TTarget>()] = register => register.RegisterFor<TService, TTarget>(implementingType, Lifetime.Singleton);
public Unique(Type serviceType, object instance)
: this(serviceType)
{
_instance = instance;
}
/// <summary>
/// Registers a unique service for a target, with an implementation factory.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUniqueFor<TService, TTarget>(Func<IFactory, TService> factory)
where TService : class
=> _uniques[GetUniqueName<TService, TTarget>()] = register => register.RegisterFor<TService, TTarget>(factory, Lifetime.Singleton);
public virtual void RegisterWith(IRegister register)
{
if (_implementingType != null)
register.Register(_serviceType, _implementingType, Lifetime.Singleton);
else if (_instance != null)
register.RegisterInstance(_serviceType, _instance);
}
}
private class Unique<TService> : Unique
{
private readonly Func<IFactory, TService> _factory;
public Unique(Func<IFactory, TService> factory)
: base(typeof(TService))
{
_factory = factory;
}
public override void RegisterWith(IRegister register)
{
register.Register(_factory, Lifetime.Singleton);
}
}
/// <summary>
/// Registers a unique service for a target, with an implementing instance.
/// </summary>
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
public void RegisterUniqueFor<TService, TTarget>(TService instance)
where TService : class
=> _uniques[GetUniqueName<TService, TTarget>()] = register => register.RegisterFor<TService, TTarget>(instance);
#endregion
@@ -1,62 +0,0 @@
using Umbraco.Core.Cache;
using Umbraco.Core.Components;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Provides extension methods to the <see cref="Composition"/> class.
/// </summary>
public static class CompositionExtensions
{
#region Essentials
/// <summary>
/// Registers essential services.
/// </summary>
public static void RegisterEssentials(this Composition composition,
ILogger logger, IProfiler profiler, IProfilingLogger profilingLogger,
IMainDom mainDom,
CacheHelper appCaches,
IUmbracoDatabaseFactory databaseFactory,
TypeLoader typeLoader,
IRuntimeState state)
{
composition.RegisterUnique(logger);
composition.RegisterUnique(profiler);
composition.RegisterUnique(profilingLogger);
composition.RegisterUnique(mainDom);
composition.RegisterUnique(appCaches);
composition.RegisterUnique(factory => factory.GetInstance<CacheHelper>().RuntimeCache);
composition.RegisterUnique(databaseFactory);
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoDatabaseFactory>().SqlContext);
composition.RegisterUnique(typeLoader);
composition.RegisterUnique(state);
}
#endregion
#region Unique
/// <summary>
/// Registers a unique service as its own implementation.
/// </summary>
public static void RegisterUnique<TService>(this Composition composition)
=> composition.RegisterUnique(typeof(TService), typeof(TService));
/// <summary>
/// Registers a unique service with an implementation type.
/// </summary>
public static void RegisterUnique<TService, TImplementing>(this Composition composition)
=> composition.RegisterUnique(typeof(TService), typeof(TImplementing));
/// <summary>
/// Registers a unique service with an implementing instance.
/// </summary>
public static void RegisterUnique<TService>(this Composition composition, TService instance)
=> composition.RegisterUnique(typeof(TService), instance);
#endregion
}
}
@@ -1,13 +1,11 @@
using Umbraco.Core.Components;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Configuration.UmbracoSettings;
namespace Umbraco.Core.Composing.Composers
namespace Umbraco.Core.Composing.CompositionExtensions
{
/// <summary>
/// Compose configurations.
/// </summary>
public static class ConfigurationComposer
public static class Configuration
{
public static Composition ComposeConfiguration(this Composition composition)
{
@@ -15,7 +13,6 @@ namespace Umbraco.Core.Composing.Composers
// register others
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoSettingsSection>().Content);
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoSettingsSection>().Templates);
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoSettingsSection>().RequestHandler);
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoSettingsSection>().Security);
@@ -1,11 +1,10 @@
using AutoMapper;
using Umbraco.Core.Components;
using Umbraco.Core.Models.Identity;
namespace Umbraco.Core.Composing.Composers
namespace Umbraco.Core.Composing.CompositionExtensions
{
public static class CoreMappingProfilesComposer
public static class CoreMappingProfiles
{
public static Composition ComposeCoreMappingProfiles(this Composition composition)
{
@@ -1,10 +1,10 @@
using Umbraco.Core.Components;
using Umbraco.Core.Compose;
using Umbraco.Core.IO;
using Umbraco.Core.IO.MediaPathSchemes;
namespace Umbraco.Core.Composing.Composers
namespace Umbraco.Core.Composing.CompositionExtensions
{
public static class FileSystemsComposer
public static class FileSystems
{
/*
* HOW TO REPLACE THE MEDIA UNDERLYING FILESYSTEM
@@ -12,10 +12,9 @@ namespace Umbraco.Core.Composing.Composers
*
* Create a component and use it to modify the composition by adding something like:
*
* composition.Container.RegisterFileSystem<IMediaFileSystem, MediaFileSystem>(
* factory => new PhysicalFileSystem("~/somewhere"));
* composition.RegisterUniqueFor<IFileSystem, IMediaFileSystem>(...);
*
* return whatever supporting filesystem you like.
* and register whatever supporting filesystem you like.
*
*
* HOW TO IMPLEMENT MY OWN FILESYSTEM
@@ -30,12 +29,15 @@ namespace Umbraco.Core.Composing.Composers
* { }
* }
*
* The ctor can have more parameters that will be resolved by the container.
* The ctor can have more parameters, that will be resolved by the container.
*
* Register your filesystem, in a component:
*
* composition.Container.RegisterFileSystem<MyFileSystem>(
* factory => new PhysicalFileSystem("~/my"));
* composition.RegisterFileSystem<MyFileSystem>();
*
* Register the underlying filesystem:
*
* composition.RegisterUniqueFor<IFileSystem, MyFileSystem>(...);
*
* And that's it, you can inject MyFileSystem wherever it's needed.
*
@@ -48,8 +50,8 @@ namespace Umbraco.Core.Composing.Composers
* Make the class implement the interface, then
* register your filesystem, in a component:
*
* composition.Container.RegisterFileSystem<IMyFileSystem, MyFileSystem>(
* factory => new PhysicalFileSystem("~/my"));
* composition.RegisterFileSystem<IMyFileSystem, MyFileSystem>();
* composition.RegisterUniqueFor<IFileSystem, IMyFileSystem>(...);
*
* And that's it, you can inject IMyFileSystem wherever it's needed.
*
@@ -71,17 +73,24 @@ namespace Umbraco.Core.Composing.Composers
// it needs to be registered (not only the interface) because it provides additional
// functionality eg for scoping, and is injected in the scope provider - whereas the
// interface is really for end-users to get access to filesystems.
composition.RegisterUnique(factory => factory.CreateInstance<FileSystems>(factory));
composition.RegisterUnique(factory => factory.CreateInstance<IO.FileSystems>(factory));
// register IFileSystems, which gives access too all filesystems
composition.RegisterUnique<IFileSystems>(factory => factory.GetInstance<FileSystems>());
composition.RegisterUnique<IFileSystems>(factory => factory.GetInstance<IO.FileSystems>());
// register the scheme for media paths
composition.RegisterUnique<IMediaPathScheme, TwoGuidsMediaPathScheme>();
composition.RegisterUnique<IMediaPathScheme, UniqueMediaPathScheme>();
// register the IMediaFileSystem implementation with a supporting filesystem
composition.RegisterFileSystem<IMediaFileSystem, MediaFileSystem>(
factory => new PhysicalFileSystem("~/media"));
// register the IMediaFileSystem implementation
composition.RegisterFileSystem<IMediaFileSystem, MediaFileSystem>();
// register the supporting filesystems provider
composition.Register(factory => new SupportingFileSystems(factory), Lifetime.Singleton);
// register the IFileSystem supporting the IMediaFileSystem
// THIS IS THE ONLY THING THAT NEEDS TO CHANGE, IN ORDER TO REPLACE THE UNDERLYING FILESYSTEM
// and, SupportingFileSystem.For<IMediaFileSystem>() returns the underlying filesystem
composition.SetMediaFileSystem(() => new PhysicalFileSystem("~/media"));
return composition;
}
@@ -1,13 +1,12 @@
using Umbraco.Core.Components;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
namespace Umbraco.Core.Composing.Composers
namespace Umbraco.Core.Composing.CompositionExtensions
{
/// <summary>
/// Composes repositories.
/// </summary>
public static class RepositoriesComposer
public static class Repositories
{
public static Composition ComposeRepositories(this Composition composition)
{
@@ -2,16 +2,16 @@
using System.IO;
using System.Linq;
using Umbraco.Core.Cache;
using Umbraco.Core.Components;
using Umbraco.Core.Events;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Packaging;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
namespace Umbraco.Core.Composing.Composers
namespace Umbraco.Core.Composing.CompositionExtensions
{
public static class ServicesComposer
public static class Services
{
public static Composition ComposeServices(this Composition composition)
{
@@ -36,6 +36,7 @@ namespace Umbraco.Core.Composing.Composers
composition.RegisterUnique<IMemberService, MemberService>();
composition.RegisterUnique<IMediaService, MediaService>();
composition.RegisterUnique<IContentTypeService, ContentTypeService>();
composition.RegisterUnique<IContentTypeBaseServiceProvider, ContentTypeBaseServiceProvider>();
composition.RegisterUnique<IMediaTypeService, MediaTypeService>();
composition.RegisterUnique<IDataTypeService, DataTypeService>();
composition.RegisterUnique<IFileService, FileService>();
@@ -56,14 +57,36 @@ namespace Umbraco.Core.Composing.Composers
factory.GetInstance<Lazy<LocalizedTextServiceFileSources>>(),
factory.GetInstance<ILogger>()));
//TODO: These are replaced in the web project - we need to declare them so that
// something is wired up, just not sure this is very nice but will work for now.
composition.RegisterUnique<IApplicationTreeService, EmptyApplicationTreeService>();
composition.RegisterUnique<ISectionService, EmptySectionService>();
composition.RegisterUnique<IEntityXmlSerializer, EntityXmlSerializer>();
composition.RegisterUnique<IPackageActionRunner, PackageActionRunner>();
composition.RegisterUnique<ConflictingPackageData>();
composition.RegisterUnique<CompiledPackageXmlParser>();
composition.RegisterUnique<ICreatedPackagesRepository>(factory => CreatePackageRepository(factory, "createdPackages.config"));
composition.RegisterUnique<IInstalledPackagesRepository>(factory => CreatePackageRepository(factory, "installedPackages.config"));
composition.RegisterUnique<PackageDataInstallation>();
composition.RegisterUnique<PackageFileInstallation>();
composition.RegisterUnique<IPackageInstallation>(factory => //factory required because we need to pass in a string path
new PackageInstallation(
factory.GetInstance<PackageDataInstallation>(), factory.GetInstance<PackageFileInstallation>(),
factory.GetInstance<CompiledPackageXmlParser>(), factory.GetInstance<IPackageActionRunner>(),
new DirectoryInfo(IOHelper.GetRootDirectorySafe())));
return composition;
}
/// <summary>
/// Creates an instance of PackagesRepository for either the ICreatedPackagesRepository or the IInstalledPackagesRepository
/// </summary>
/// <param name="factory"></param>
/// <param name="packageRepoFileName"></param>
/// <returns></returns>
private static PackagesRepository CreatePackageRepository(IFactory factory, string packageRepoFileName)
=> new PackagesRepository(
factory.GetInstance<IContentService>(), factory.GetInstance<IContentTypeService>(), factory.GetInstance<IDataTypeService>(), factory.GetInstance<IFileService>(), factory.GetInstance<IMacroService>(), factory.GetInstance<ILocalizationService>(), factory.GetInstance<IEntityXmlSerializer>(), factory.GetInstance<ILogger>(),
packageRepoFileName);
private static LocalizedTextServiceFileSources SourcesFactory(IFactory container)
{
var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/"));
@@ -88,7 +111,7 @@ namespace Umbraco.Core.Composing.Composers
return new LocalizedTextServiceFileSources(
container.GetInstance<ILogger>(),
container.GetInstance<CacheHelper>().RuntimeCache,
container.GetInstance<AppCaches>(),
mainLangFolder,
pluginLangFolders.Concat(userLangFolders));
}
+8 -4
View File
@@ -5,13 +5,14 @@ using Umbraco.Core.Dictionary;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PackageActions;
using Umbraco.Core.Packaging;
using Umbraco.Core.Persistence;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
using Umbraco.Core._Legacy.PackageActions;
namespace Umbraco.Core.Composing
{
@@ -28,7 +29,7 @@ namespace Umbraco.Core.Composing
{
private static IFactory _factory;
// fixme - refactor
// TODO: get rid of these oddities
// we don't want Umbraco tests to die because the container has not been properly initialized,
// for some too-important things such as IShortStringHelper or loggers, so if it's not
// registered we setup a default one. We should really refactor our tests so that it does
@@ -161,6 +162,9 @@ namespace Umbraco.Core.Composing
internal static PackageActionCollection PackageActions
=> Factory.GetInstance<PackageActionCollection>();
internal static IPackageActionRunner PackageActionRunner
=> Factory.GetInstance<IPackageActionRunner>();
internal static PropertyValueConverterCollection PropertyValueConverters
=> Factory.GetInstance<PropertyValueConverterCollection>();
@@ -176,8 +180,8 @@ namespace Umbraco.Core.Composing
public static ICultureDictionaryFactory CultureDictionaryFactory
=> Factory.GetInstance<ICultureDictionaryFactory>();
public static CacheHelper ApplicationCache
=> Factory.GetInstance<CacheHelper>();
public static AppCaches AppCaches
=> Factory.GetInstance<AppCaches>();
public static ServiceContext Services
=> Factory.GetInstance<ServiceContext>();
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be disabled.
@@ -9,9 +9,8 @@ namespace Umbraco.Core.Components
/// <para>If a type is specified, disables the composer of that type, else disables the composer marked with the attribute.</para>
/// <para>This attribute is *not* inherited.</para>
/// <para>This attribute applies to classes only, it is not possible to enable/disable interfaces.</para>
/// <para>If a composer ends up being both enabled and disabled: attributes marking the composer itself have lower priority
/// than attributes on *other* composers, eg if a composer declares itself as disabled it is possible to enable it from
/// another composer. Anything else is unspecified.</para>
/// <para>Assembly-level <see cref="DisableComposerAttribute"/> has greater priority than <see cref="DisableAttribute"/>
/// attribute when it is marking the composer itself, but lower priority that when it is referencing another composer.</para>
/// </remarks>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class DisableAttribute : Attribute
@@ -0,0 +1,28 @@
using System;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be disabled.
/// </summary>
/// <remarks>
/// <para>Assembly-level <see cref="DisableComposerAttribute"/> has greater priority than <see cref="DisableAttribute"/>
/// attribute when it is marking the composer itself, but lower priority that when it is referencing another composer.</para>
/// </remarks>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public class DisableComposerAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the <see cref="DisableComposerAttribute"/> class.
/// </summary>
public DisableComposerAttribute(Type disabledType)
{
DisabledType = disabledType;
}
/// <summary>
/// Gets the disabled type, or null if it is the composer marked with the attribute.
/// </summary>
public Type DisabledType { get; }
}
}
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be enabled.
@@ -9,9 +9,8 @@ namespace Umbraco.Core.Components
/// <para>If a type is specified, enables the composer of that type, else enables the composer marked with the attribute.</para>
/// <para>This attribute is *not* inherited.</para>
/// <para>This attribute applies to classes only, it is not possible to enable/disable interfaces.</para>
/// <para>If a composer ends up being both enabled and disabled: attributes marking the composer itself have lower priority
/// than attributes on *other* composers, eg if a composer declares itself as disabled it is possible to enable it from
/// another composer. Anything else is unspecified.</para>
/// <para>Assembly-level <see cref="DisableComposerAttribute"/> has greater priority than <see cref="DisableAttribute"/>
/// attribute when it is marking the composer itself, but lower priority that when it is referencing another composer.</para>
/// </remarks>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class EnableAttribute : Attribute
@@ -0,0 +1,31 @@
using System;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be enabled.
/// </summary>
/// <remarks>
/// <para>If a type is specified, enables the composer of that type, else enables the composer marked with the attribute.</para>
/// <para>This attribute is *not* inherited.</para>
/// <para>This attribute applies to classes only, it is not possible to enable/disable interfaces.</para>
/// <para>Assembly-level <see cref="DisableComposerAttribute"/> has greater priority than <see cref="DisableAttribute"/>
/// attribute when it is marking the composer itself, but lower priority that when it is referencing another composer.</para>
/// </remarks>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public class EnableComposerAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the <see cref="EnableComposerAttribute"/> class.
/// </summary>
public EnableComposerAttribute(Type enabledType)
{
EnabledType = enabledType;
}
/// <summary>
/// Gets the enabled type, or null if it is the composer marked with the attribute.
/// </summary>
public Type EnabledType { get; }
}
}
@@ -1,4 +1,4 @@
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a component.
@@ -1,6 +1,4 @@
using Umbraco.Core.Composing;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a composer.
@@ -10,7 +8,6 @@ namespace Umbraco.Core.Components
/// <summary>
/// Compose.
/// </summary>
/// <param name="composition"></param>
void Compose(Composition composition);
}
}
}
@@ -0,0 +1,11 @@
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a core <see cref="IComposer"/>.
/// </summary>
/// <remarks>
/// <para>Core composers compose after the initial composer, and before user composers.</para>
/// </remarks>
public interface ICoreComposer : IComposer
{ }
}
+11 -8
View File
@@ -3,13 +3,6 @@ using System.Collections.Generic;
namespace Umbraco.Core.Composing
{
// Implementing:
//
// The factory
// - always picks the constructor with the most parameters
// - supports Lazy parameters (and prefers them over non-Lazy) in constructors
// - what happens with 'releasing' is unclear
/// <summary>
/// Defines a service factory for Umbraco.
/// </summary>
@@ -28,6 +21,15 @@ namespace Umbraco.Core.Composing
/// <remarks>Throws an exception if the container failed to get an instance of the specified type.</remarks>
object GetInstance(Type type);
/// <summary>
/// Gets a targeted instance of a service.
/// </summary>
/// <typeparam name="TService">The type of the service.</typeparam>
/// <typeparam name="TTarget">The type of the target.</typeparam>
/// <returns>The instance of the specified type for the specified target.</returns>
/// <remarks>Throws an exception if the container failed to get an instance of the specified type.</remarks>
TService GetInstanceFor<TService, TTarget>();
/// <summary>
/// Tries to get an instance of a service.
/// </summary>
@@ -48,7 +50,8 @@ namespace Umbraco.Core.Composing
/// Gets all instances of a service.
/// </summary>
/// <typeparam name="TService">The type of the service.</typeparam>
IEnumerable<TService> GetAllInstances<TService>();
IEnumerable<TService> GetAllInstances<TService>()
where TService : class;
/// <summary>
/// Releases an instance.
+43 -13
View File
@@ -2,17 +2,6 @@
namespace Umbraco.Core.Composing
{
// Implementing:
//
// The register
// - supports registering a service, even after some instances of other services have been created
// - supports re-registering a service, as long as no instance of that service has been created
// - throws when re-registering a service, and an instance of that service has been created
//
// - registers only one implementation of a nameless service, re-registering replaces the previous
// registration - names are required to register multiple implementations - and getting an
// IEnumerable of the service, nameless, returns them all
/// <summary>
/// Defines a service register for Umbraco.
/// </summary>
@@ -36,12 +25,53 @@ namespace Umbraco.Core.Composing
/// <summary>
/// Registers a service with an implementation factory.
/// </summary>
void Register<TService>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient);
void Register<TService>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class;
/// <summary>
/// Registers a service with an implementing instance.
/// </summary>
void RegisterInstance(Type serviceType, object instance);
void Register(Type serviceType, object instance);
/// <summary>
/// Registers a service for a target, as its own implementation.
/// </summary>
/// <remarks>
/// There can only be one implementation or instanced registered for a service and target;
/// what happens if many are registered is not specified.
/// </remarks>
void RegisterFor<TService, TTarget>(Lifetime lifetime = Lifetime.Transient)
where TService : class;
/// <summary>
/// Registers a service for a target, with an implementation type.
/// </summary>
/// <remarks>
/// There can only be one implementation or instanced registered for a service and target;
/// what happens if many are registered is not specified.
/// </remarks>
void RegisterFor<TService, TTarget>(Type implementingType, Lifetime lifetime = Lifetime.Transient)
where TService : class;
/// <summary>
/// Registers a service for a target, with an implementation factory.
/// </summary>
/// <remarks>
/// There can only be one implementation or instanced registered for a service and target;
/// what happens if many are registered is not specified.
/// </remarks>
void RegisterFor<TService, TTarget>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class;
/// <summary>
/// Registers a service for a target, with an implementing instance.
/// </summary>
/// <remarks>
/// There can only be one implementation or instanced registered for a service and target;
/// what happens if many are registered is not specified.
/// </remarks>
void RegisterFor<TService, TTarget>(TService instance)
where TService : class;
/// <summary>
/// Registers a base type for auto-registration.
@@ -1,12 +1,12 @@
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a user <see cref="IComposer"/>.
/// </summary>
/// <remarks>
/// <para>All user composers require (compose after) all core composers.</para>
/// <para>User composers compose after core composers, and before the final composer.</para>
/// </remarks>
[ComposeAfter(typeof(ICoreComposer))]
public interface IUserComposer : IComposer
{ }
}
}
@@ -12,7 +12,7 @@ namespace Umbraco.Core.Composing
/// <typeparam name="TItem">The type of the items.</typeparam>
public abstract class LazyCollectionBuilderBase<TBuilder, TCollection, TItem> : CollectionBuilderBase<TBuilder, TCollection, TItem>
where TBuilder : LazyCollectionBuilderBase<TBuilder, TCollection, TItem>
where TCollection : IBuilderCollection<TItem>
where TCollection : class, IBuilderCollection<TItem>
{
private readonly List<Func<IEnumerable<Type>>> _producers = new List<Func<IEnumerable<Type>>>();
private readonly List<Type> _excluded = new List<Type>();
+1 -1
View File
@@ -15,7 +15,7 @@
/// <summary>
/// One unique instance per request.
/// </summary>
// fixme - not what you think!
// TODO: review lifetimes for LightInject vs other containers
// currently, corresponds to 'Request' in LightInject which is 'Transient + disposed by Scope'
// but NOT (in LightInject) a per-web-request lifetime, more a TransientScoped
//
@@ -102,18 +102,25 @@ namespace Umbraco.Core.Composing.LightInject
/// <inheritdoc />
public IFactory CreateFactory() => this;
private static string GetTargetedServiceName<TTarget>() => "TARGET:" + typeof(TTarget).FullName;
#region Factory
/// <inheritdoc />
public object GetInstance(Type type)
=> Container.GetInstance(type);
/// <inheritdoc />
public TService GetInstanceFor<TService, TTarget>()
=> Container.GetInstance<TService>(GetTargetedServiceName<TTarget>());
/// <inheritdoc />
public object TryGetInstance(Type type)
=> Container.TryGetInstance(type);
/// <inheritdoc />
public IEnumerable<T> GetAllInstances<T>()
where T : class
=> Container.GetAllInstances<T>();
/// <inheritdoc />
@@ -138,21 +145,7 @@ namespace Umbraco.Core.Composing.LightInject
/// <inheritdoc />
public void Register(Type serviceType, Lifetime lifetime = Lifetime.Transient)
{
switch (lifetime)
{
case Lifetime.Transient:
Container.Register(serviceType);
break;
case Lifetime.Request:
case Lifetime.Scope:
case Lifetime.Singleton:
Container.Register(serviceType, GetLifetime(lifetime));
break;
default:
throw new NotSupportedException($"Lifetime {lifetime} is not supported.");
}
}
=> Container.Register(serviceType, GetLifetime(lifetime));
/// <inheritdoc />
public void Register(Type serviceType, Type implementingType, Lifetime lifetime = Lifetime.Transient)
@@ -174,22 +167,41 @@ namespace Umbraco.Core.Composing.LightInject
/// <inheritdoc />
public void Register<TService>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class
{
switch (lifetime)
{
case Lifetime.Transient:
Container.Register(f => factory(this));
break;
case Lifetime.Request:
case Lifetime.Scope:
case Lifetime.Singleton:
Container.Register(f => factory(this), GetLifetime(lifetime));
break;
default:
throw new NotSupportedException($"Lifetime {lifetime} is not supported.");
}
Container.Register(f => factory(this), GetLifetime(lifetime));
}
/// <inheritdoc />
public void Register(Type serviceType, object instance)
=> Container.RegisterInstance(serviceType, instance);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Lifetime lifetime = Lifetime.Transient)
where TService : class
=> RegisterFor<TService, TTarget>(typeof(TService), lifetime);
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Type implementingType, Lifetime lifetime = Lifetime.Transient)
where TService : class
{
// note that there can only be one implementation or instance registered "for" a service
Container.Register(typeof(TService), implementingType, GetTargetedServiceName<TTarget>(), GetLifetime(lifetime));
}
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(Func<IFactory, TService> factory, Lifetime lifetime = Lifetime.Transient)
where TService : class
{
// note that there can only be one implementation or instance registered "for" a service
Container.Register(f => factory(this), GetTargetedServiceName<TTarget>(), GetLifetime(lifetime));
}
/// <inheritdoc />
public void RegisterFor<TService, TTarget>(TService instance)
where TService : class
=> Container.RegisterInstance(typeof(TService), instance, GetTargetedServiceName<TTarget>());
private ILifetime GetLifetime(Lifetime lifetime)
{
switch (lifetime)
@@ -207,10 +219,6 @@ namespace Umbraco.Core.Composing.LightInject
}
}
/// <inheritdoc />
public void RegisterInstance(Type serviceType, object instance)
=> Container.RegisterInstance(serviceType, instance);
/// <inheritdoc />
public void RegisterAuto(Type serviceBaseType)
{
@@ -223,17 +231,6 @@ namespace Umbraco.Core.Composing.LightInject
}, null);
}
// was the Light-Inject specific way of dealing with args, but we've replaced it with our own
// beware! does NOT work on singletons, see https://github.com/seesharper/LightInject/issues/294
//
///// <inheritdoc />
//public void RegisterConstructorDependency<TDependency>(Func<IContainer, ParameterInfo, TDependency> factory)
// => Container.RegisterConstructorDependency((f, x) => factory(this, x));
//
///// <inheritdoc />
//public void RegisterConstructorDependency<TDependency>(Func<IContainer, ParameterInfo, object[], TDependency> factory)
// => Container.RegisterConstructorDependency((f, x, a) => factory(this, x, a));
#endregion
#region Control
@@ -256,21 +253,14 @@ namespace Umbraco.Core.Composing.LightInject
private class AssemblyScanner : IAssemblyScanner
{
//private readonly IAssemblyScanner _scanner;
//public AssemblyScanner(IAssemblyScanner scanner)
//{
// _scanner = scanner;
//}
public void Scan(Assembly assembly, IServiceRegistry serviceRegistry, Func<ILifetime> lifetime, Func<Type, Type, bool> shouldRegister, Func<Type, Type, string> serviceNameProvider)
{
// nothing - we *could* scan non-Umbraco assemblies, though
// nothing - we don't want LightInject to scan
}
public void Scan(Assembly assembly, IServiceRegistry serviceRegistry)
{
// nothing - we *could* scan non-Umbraco assemblies, though
// nothing - we don't want LightInject to scan
}
}
@@ -13,6 +13,9 @@ namespace Umbraco.Core.Composing.LightInject
// of PerWebRequestScopeManagerProvider - but all delegates see is the mixed one - and therefore
// they can transition without issues.
//
// The PerWebRequestScopeManager maintains the scope in HttpContext and LightInject registers a
// module (PreApplicationStartMethod) which disposes it on EndRequest
//
// the mixed provider is installed in container.ConfigureUmbracoCore() and then,
// when doing eg container.EnableMvc() or anything that does container.EnablePerWebRequestScope()
// we need to take great care to preserve the mixed scope manager provider!
@@ -11,7 +11,7 @@ namespace Umbraco.Core.Composing
/// <typeparam name="TItem">The type of the items.</typeparam>
public abstract class OrderedCollectionBuilderBase<TBuilder, TCollection, TItem> : CollectionBuilderBase<TBuilder, TCollection, TItem>
where TBuilder : OrderedCollectionBuilderBase<TBuilder, TCollection, TItem>
where TCollection : IBuilderCollection<TItem>
where TCollection : class, IBuilderCollection<TItem>
{
protected abstract TBuilder This { get; }
@@ -78,33 +78,6 @@ namespace Umbraco.Core.Composing
return This;
}
/// <summary>
/// Appends a type after another type.
/// </summary>
/// <typeparam name="TAfter">The other type.</typeparam>
/// <typeparam name="T">The type to append.</typeparam>
/// <returns>The builder.</returns>
/// <remarks>Throws if both types are identical, or if the other type does not already belong to the collection.</remarks>
public TBuilder AppendAfter<TAfter, T>()
where TAfter : TItem
where T : TItem
{
Configure(types =>
{
var typeAfter = typeof (TAfter);
var type = typeof(T);
if (typeAfter == type) throw new InvalidOperationException();
var index = types.IndexOf(typeAfter);
if (index < 0) throw new InvalidOperationException();
if (types.Contains(type)) types.Remove(type);
index = types.IndexOf(typeAfter); // in case removing type changed index
types.Insert(index + 1, type);
});
return This;
}
/// <summary>
/// Inserts a type into the collection.
/// </summary>
@@ -206,6 +179,69 @@ namespace Umbraco.Core.Composing
return This;
}
/// <summary>
/// Inserts a type after another type.
/// </summary>
/// <typeparam name="TAfter">The other type.</typeparam>
/// <typeparam name="T">The type to append.</typeparam>
/// <returns>The builder.</returns>
/// <remarks>Throws if both types are identical, or if the other type does not already belong to the collection.</remarks>
public TBuilder InsertAfter<TAfter, T>()
where TAfter : TItem
where T : TItem
{
Configure(types =>
{
var typeAfter = typeof(TAfter);
var type = typeof(T);
if (typeAfter == type) throw new InvalidOperationException();
var index = types.IndexOf(typeAfter);
if (index < 0) throw new InvalidOperationException();
if (types.Contains(type)) types.Remove(type);
index = types.IndexOf(typeAfter); // in case removing type changed index
index += 1; // insert here
if (index == types.Count)
types.Add(type);
else
types.Insert(index, type);
});
return This;
}
/// <summary>
/// Inserts a type after another type.
/// </summary>
/// <param name="typeAfter">The other type.</param>
/// <param name="type">The type to insert.</param>
/// <returns>The builder.</returns>
/// <remarks>Throws if both types are identical, or if the other type does not already belong to the collection.</remarks>
public TBuilder InsertAfter(Type typeAfter, Type type)
{
Configure(types =>
{
EnsureType(typeAfter, "find");
EnsureType(type, "register");
if (typeAfter == type) throw new InvalidOperationException();
var index = types.IndexOf(typeAfter);
if (index < 0) throw new InvalidOperationException();
if (types.Contains(type)) types.Remove(type);
index = types.IndexOf(typeAfter); // in case removing type changed index
index += 1; // insert here
if (index == types.Count)
types.Add(type);
else
types.Insert(index, type);
});
return This;
}
/// <summary>
/// Removes a type from the collection.
/// </summary>
@@ -18,14 +18,14 @@ namespace Umbraco.Core.Composing
/// Creates a new instance of the configured container.
/// </summary>
/// <remarks>
/// To override the default LightInjectContainer, add an appSetting named umbracoContainerType with
/// To override the default LightInjectContainer, add an appSetting named 'Umbraco.Core.RegisterType' with
/// a fully qualified type name to a class with a static method "Create" returning an IRegister.
/// </remarks>
public static IRegister Create()
{
Type type;
var configuredTypeName = ConfigurationManager.AppSettings["umbracoRegisterType"];
var configuredTypeName = ConfigurationManager.AppSettings[Constants.AppSettings.RegisterType];
if (configuredTypeName.IsNullOrWhiteSpace())
{
// try to get the web LightInject container type,
@@ -0,0 +1,21 @@
using System;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Marks a composer to indicate a minimum and/or maximum runtime level for which the composer would compose.
/// </summary>
[AttributeUsage(AttributeTargets.Class /*, AllowMultiple = false, Inherited = true*/)]
public class RuntimeLevelAttribute : Attribute
{
/// <summary>
/// Gets or sets the minimum runtime level for which the composer would compose.
/// </summary>
public RuntimeLevel MinLevel { get; set; } = RuntimeLevel.Install;
/// <summary>
/// Gets or sets the maximum runtime level for which the composer would compose.
/// </summary>
public RuntimeLevel MaxLevel { get; set; } = RuntimeLevel.Run;
}
}
@@ -0,0 +1,18 @@
namespace Umbraco.Core.Composing
{
/// <summary>
/// Provides a base class for targeted service factories.
/// </summary>
/// <typeparam name="TService"></typeparam>
public abstract class TargetedServiceFactory<TService>
{
private readonly IFactory _factory;
protected TargetedServiceFactory(IFactory factory)
{
_factory = factory;
}
public TService For<TTarget>() => _factory.GetInstanceFor<TService, TTarget>();
}
}
@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Composing
{
/// <summary>
/// Provides a base class for collections of types.
/// </summary>
public abstract class TypeCollectionBuilderBase<TCollection, TConstraint> : ICollectionBuilder<TCollection, Type>
where TCollection : class, IBuilderCollection<Type>
{
private readonly HashSet<Type> _types = new HashSet<Type>();
private Type Validate(Type type, string action)
{
if (!typeof(TConstraint).IsAssignableFrom(type))
throw new InvalidOperationException($"Cannot {action} type {type.FullName} as it does not inherit from/implement {typeof(TConstraint).FullName}.");
return type;
}
public void Add(Type type) => _types.Add(Validate(type, "add"));
public void Add<T>() => Add(typeof(T));
public void Add(IEnumerable<Type> types)
{
foreach (var type in types) Add(type);
}
public void Remove(Type type) => _types.Remove(Validate(type, "remove"));
public void Remove<T>() => Remove(typeof(T));
public TCollection CreateCollection(IFactory factory)
{
return factory.CreateInstance<TCollection>(_types);
}
public void RegisterWith(IRegister register)
{
register.Register(CreateCollection, Lifetime.Singleton);
}
}
}

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