Compare commits

...

314 Commits

Author SHA1 Message Date
Niels Lyngsø 992cc48f56 added missing $location reference 2019-02-18 15:49:43 +01:00
Niels Lyngsø 897d6f2dde List & Grid should only open items as infinity editing if entityType is Content. 2019-02-18 15:38:39 +01: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
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
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
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
Bjarke Berg 354c45e0e2 #4477 - also refresh cache after migration 2019-02-08 10:32:21 +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
Niels Lyngsø 5c8fad330e motion added for umb-editor-navigation-item anchor-dropdown 2019-02-07 15:10:31 +01:00
Niels Lyngsø 0b19eab5a9 umb-group-panel for umbtabbedcontent 2019-02-07 13:59:20 +01:00
Niels Lyngsø 42803ff006 V8: umb-editor-navigation anchor-dropdown refined, remembers last active anchor, 2019-02-07 13:26:23 +01:00
Niels Lyngsø fb070928f7 V8: umb-editor-navigation-anchor-dropdown first version 2019-02-07 08:57:20 +01: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
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
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
Kenn Jacobsen b9d554908d Track redirects for invariant content under variant content 2019-02-04 21:03:45 +01:00
Niels Lyngsø bd4b4620d4 First part of refactoring umb-editor-navigation 2019-02-04 13:34:26 +01: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
664 changed files with 7034 additions and 9818 deletions
+161 -158
View File
@@ -1,160 +1,163 @@
#
# Umbraco Cms Git Ignore
#
# common files
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
*.orig
*.suo
*.vs10x
*.ndproj
#
# 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.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/
# 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
+2 -2
View File
@@ -27,9 +27,9 @@
<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-beta078,1.999999)" />
<dependency id="Examine" version="[1.0.0,1.999999)" />
<dependency id="HtmlAgilityPack" version="[1.8.14,1.999999)" />
<dependency id="ImageProcessor" version="[2.6.2.25,2.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)" />
+4 -4
View File
@@ -25,15 +25,15 @@
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.0-alpha.37]" />
<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="Umbraco.ModelsBuilder.Ui" version="[8.0.0-alpha.38]" />
<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>
+13 -7
View File
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
namespace Umbraco.Core.Cache
@@ -110,7 +111,7 @@ namespace Umbraco.Core.Cache
#region Lock
private bool _entered;
private const string ContextItemsLockKey = "Umbraco.Core.Cache.HttpRequestCache::LockEntered";
protected override void EnterReadLock() => EnterWriteLock();
@@ -118,7 +119,13 @@ namespace Umbraco.Core.Cache
{
if (HasContextItems)
{
System.Threading.Monitor.Enter(ContextItems.SyncRoot, ref _entered);
// 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;
}
}
@@ -126,11 +133,10 @@ namespace Umbraco.Core.Cache
protected override void ExitWriteLock()
{
if (_entered)
{
_entered = false;
System.Threading.Monitor.Exit(ContextItems.SyncRoot);
}
var entered = (bool?) ContextItems[ContextItemsLockKey] ?? false;
if (entered)
Monitor.Exit(ContextItems.SyncRoot);
ContextItems.Remove(ContextItemsLockKey);
}
#endregion
@@ -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,7 +3,7 @@ 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!
public sealed class RelateOnCopyComponent : IComponent
@@ -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
@@ -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"/>.
@@ -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
@@ -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.
@@ -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)
{
@@ -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
@@ -73,10 +73,10 @@ 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>();
@@ -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,7 +2,6 @@
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;
@@ -10,9 +9,9 @@ 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)
{
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be disabled.
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be disabled.
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be enabled.
@@ -1,6 +1,6 @@
using System;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Indicates that a composer should be enabled.
@@ -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.
@@ -1,4 +1,4 @@
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a core <see cref="IComposer"/>.
@@ -1,4 +1,4 @@
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a runtime <see cref="IComposer"/>.
@@ -1,4 +1,4 @@
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Represents a user <see cref="IComposer"/>.
@@ -1,7 +1,6 @@
using System;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Components
namespace Umbraco.Core.Composing
{
/// <summary>
/// Marks a composer to indicate a minimum and/or maximum runtime level for which the composer would compose.
+8 -26
View File
@@ -42,30 +42,30 @@ namespace Umbraco.Core.Composing
private string _currentAssembliesHash;
private IEnumerable<Assembly> _assemblies;
private bool _reportedChange;
private static LocalTempStorage _localTempStorage;
private static string _localTempPath;
private static string _fileBasePath;
/// <summary>
/// Initializes a new instance of the <see cref="TypeLoader"/> class.
/// </summary>
/// <param name="runtimeCache">The application runtime cache.</param>
/// <param name="localTempStorage">Files storage mode.</param>
/// <param name="localTempPath">Files storage location.</param>
/// <param name="logger">A profiling logger.</param>
public TypeLoader(IAppPolicyCache runtimeCache, LocalTempStorage localTempStorage, IProfilingLogger logger)
: this(runtimeCache, localTempStorage, logger, true)
public TypeLoader(IAppPolicyCache runtimeCache, string localTempPath, IProfilingLogger logger)
: this(runtimeCache, localTempPath, logger, true)
{ }
/// <summary>
/// Initializes a new instance of the <see cref="TypeLoader"/> class.
/// </summary>
/// <param name="runtimeCache">The application runtime cache.</param>
/// <param name="localTempStorage">Files storage mode.</param>
/// <param name="localTempPath">Files storage location.</param>
/// <param name="logger">A profiling logger.</param>
/// <param name="detectChanges">Whether to detect changes using hashes.</param>
internal TypeLoader(IAppPolicyCache runtimeCache, LocalTempStorage localTempStorage, IProfilingLogger logger, bool detectChanges)
internal TypeLoader(IAppPolicyCache runtimeCache, string localTempPath, IProfilingLogger logger, bool detectChanges)
{
_runtimeCache = runtimeCache ?? throw new ArgumentNullException(nameof(runtimeCache));
_localTempStorage = localTempStorage == LocalTempStorage.Unknown ? LocalTempStorage.Default : localTempStorage;
_localTempPath = localTempPath;
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
if (detectChanges)
@@ -388,25 +388,7 @@ namespace Umbraco.Core.Composing
if (_fileBasePath != null)
return _fileBasePath;
switch (_localTempStorage)
{
case LocalTempStorage.AspNetTemp:
_fileBasePath = Path.Combine(HttpRuntime.CodegenDir, "UmbracoData", "umbraco-types");
break;
case LocalTempStorage.EnvironmentTemp:
// include the appdomain hash is just a safety check, for example if a website is moved from worker A to worker B and then back
// to worker A again, in theory the %temp% folder should already be empty but we really want to make sure that its not
// utilizing an old path - assuming we cannot have SHA1 collisions on AppDomainAppId
var appDomainHash = HttpRuntime.AppDomainAppId.ToSHA1();
var cachePath = Path.Combine(Environment.ExpandEnvironmentVariables("%temp%"), "UmbracoData", appDomainHash);
_fileBasePath = Path.Combine(cachePath, "umbraco-types");
break;
case LocalTempStorage.Default:
default:
var tempFolder = IOHelper.MapPath(SystemDirectories.TempData.EnsureEndsWith('/') + "TypesCache");
_fileBasePath = Path.Combine(tempFolder, "umbraco-types." + NetworkHelper.FileSafeMachineName);
break;
}
_fileBasePath = Path.Combine(_localTempPath, "TypesCache", "umbraco-types." + NetworkHelper.FileSafeMachineName);
// ensure that the folder exists
var directory = Path.GetDirectoryName(_fileBasePath);
@@ -1,23 +1,22 @@
using System;
using Umbraco.Core.Cache;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Composing;
using Umbraco.Core.Dictionary;
using Umbraco.Core.IO;
using Umbraco.Core.Migrations;
using Umbraco.Core.Logging.Viewer;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PackageActions;
using Umbraco.Core.Persistence.Mappers;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
using Umbraco.Core.Logging.Viewer;
using Umbraco.Core.PackageActions;
namespace Umbraco.Core.Components
namespace Umbraco.Core
{
/// <summary>
/// Provides extension methods to the <see cref="Composition"/> class.
/// </summary>
public static class CompositionExtensions
public static partial class CompositionExtensions
{
#region FileSystems
@@ -110,13 +109,6 @@ namespace Umbraco.Core.Components
internal static ManifestValueValidatorCollectionBuilder Validators(this Composition composition)
=> composition.WithCollectionBuilder<ManifestValueValidatorCollectionBuilder>();
/// <summary>
/// Gets the post-migrations collection builder.
/// </summary>
/// <param name="composition">The composition.</param>
internal static PostMigrationCollectionBuilder PostMigrations(this Composition composition)
=> composition.WithCollectionBuilder<PostMigrationCollectionBuilder>();
/// <summary>
/// Gets the components collection builder.
/// </summary>
@@ -1,14 +1,14 @@
using Umbraco.Core.Cache;
using Umbraco.Core.Components;
using Umbraco.Core.Composing;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Composing
namespace Umbraco.Core
{
/// <summary>
/// Provides extension methods to the <see cref="Composition"/> class.
/// </summary>
public static class CompositionExtensions
public static partial class CompositionExtensions
{
#region Essentials
@@ -4,15 +4,8 @@ using System.Linq;
using System.Net.Configuration;
using System.Web;
using System.Web.Configuration;
using System.Web.Hosting;
using System.Web.Security;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using Umbraco.Core.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Security;
namespace Umbraco.Core.Configuration
{
@@ -277,12 +270,7 @@ namespace Umbraco.Core.Configuration
}
}
/// <summary>
/// This is the location type to store temporary files such as cache files or other localized files for a given machine
/// </summary>
/// <remarks>
/// Currently used for the xml cache file and the plugin cache files
/// </remarks>
/// <inheritdoc />
public LocalTempStorage LocalTempStorageLocation
{
get
@@ -295,6 +283,30 @@ namespace Umbraco.Core.Configuration
}
}
/// <inheritdoc />
public string LocalTempPath
{
get
{
switch (LocalTempStorageLocation)
{
case LocalTempStorage.AspNetTemp:
return System.IO.Path.Combine(HttpRuntime.CodegenDir, "UmbracoData");
case LocalTempStorage.EnvironmentTemp:
// include the appdomain hash is just a safety check, for example if a website is moved from worker A to worker B and then back
// to worker A again, in theory the %temp% folder should already be empty but we really want to make sure that its not
// utilizing an old path - assuming we cannot have SHA1 collisions on AppDomainAppId
var appDomainHash = HttpRuntime.AppDomainAppId.GenerateHash();
return System.IO.Path.Combine(Environment.ExpandEnvironmentVariables("%temp%"), "UmbracoData", appDomainHash);
//case LocalTempStorage.Default:
//case LocalTempStorage.Unknown:
default:
return IOHelper.MapPath("~/App_Data/TEMP");
}
}
}
/// <summary>
/// Gets the default UI language.
/// </summary>
@@ -348,10 +360,5 @@ namespace Umbraco.Core.Configuration
}
}
}
}
}
@@ -1,6 +1,4 @@
using System;
namespace Umbraco.Core.Configuration
namespace Umbraco.Core.Configuration
{
/// <summary>
/// Contains general settings information for the entire Umbraco instance based on information from web.config appsettings
@@ -61,11 +59,13 @@ namespace Umbraco.Core.Configuration
int VersionCheckPeriod { get; }
/// <summary>
/// This is the location type to store temporary files such as cache files or other localized files for a given machine
/// Gets the configuration for the location of temporary files.
/// </summary>
/// <remarks>
/// Used for some cache files and for specific environments such as Azure
/// </remarks>
LocalTempStorage LocalTempStorageLocation { get; }
/// <summary>
/// Gets the location of temporary files.
/// </summary>
string LocalTempPath { get; }
}
}
+3 -3
View File
@@ -77,7 +77,7 @@
/// alias for the macro tree.
/// </summary>
public const string Macros = "macros";
/// <summary>
/// alias for the datatype tree.
/// </summary>
@@ -92,7 +92,7 @@
/// alias for the dictionary tree.
/// </summary>
public const string Dictionary = "dictionary";
public const string Stylesheets = "stylesheets";
/// <summary>
@@ -121,7 +121,7 @@
public const string Templates = "templates";
public const string RelationTypes = "relationTypes";
public const string Languages = "languages";
/// <summary>
+6 -6
View File
@@ -219,7 +219,7 @@ namespace Umbraco.Core
},
{
FailedPasswordAttempts,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Integer, true, FailedPasswordAttempts)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Integer, true, FailedPasswordAttempts)
{
Name = FailedPasswordAttemptsLabel
}
@@ -240,35 +240,35 @@ namespace Umbraco.Core
},
{
LastLockoutDate,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Date, true, LastLockoutDate)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Date, true, LastLockoutDate)
{
Name = LastLockoutDateLabel
}
},
{
LastLoginDate,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Date, true, LastLoginDate)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Date, true, LastLoginDate)
{
Name = LastLoginDateLabel
}
},
{
LastPasswordChangeDate,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Date, true, LastPasswordChangeDate)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Date, true, LastPasswordChangeDate)
{
Name = LastPasswordChangeDateLabel
}
},
{
PasswordAnswer,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Nvarchar, true, PasswordAnswer)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Nvarchar, true, PasswordAnswer)
{
Name = PasswordAnswerLabel
}
},
{
PasswordQuestion,
new PropertyType(PropertyEditors.Aliases.NoEdit, ValueStorageType.Nvarchar, true, PasswordQuestion)
new PropertyType(PropertyEditors.Aliases.Label, ValueStorageType.Nvarchar, true, PasswordQuestion)
{
Name = PasswordQuestionLabel
}
+7 -11
View File
@@ -34,11 +34,7 @@ namespace Umbraco.Core
/// </summary>
public const string ContentPicker = "Umbraco.ContentPicker";
/// <summary>
/// Date.
/// </summary>
public const string Date = "Umbraco.Date";
/// <summary>
/// DateTime.
/// </summary>
@@ -48,7 +44,7 @@ namespace Umbraco.Core
/// DropDown List.
/// </summary>
public const string DropDownListFlexible = "Umbraco.DropDown.Flexible";
/// <summary>
/// Grid.
/// </summary>
@@ -105,9 +101,9 @@ namespace Umbraco.Core
public const string MultipleTextstring = "Umbraco.MultipleTextstring";
/// <summary>
/// NoEdit.
/// Label.
/// </summary>
public const string NoEdit = "Umbraco.NoEdit";
public const string Label = "Umbraco.Label";
/// <summary>
/// Picker Relations.
@@ -118,7 +114,7 @@ namespace Umbraco.Core
/// RadioButton list.
/// </summary>
public const string RadioButtonList = "Umbraco.RadioButtonList";
/// <summary>
/// Slider.
/// </summary>
@@ -142,7 +138,7 @@ namespace Umbraco.Core
/// <summary>
/// TinyMCE
/// </summary>
public const string TinyMce = "Umbraco.TinyMCEv3";
public const string TinyMce = "Umbraco.TinyMCE";
/// <summary>
/// Boolean.
@@ -163,7 +159,7 @@ namespace Umbraco.Core
/// Upload Field.
/// </summary>
public const string UploadField = "Umbraco.UploadField";
/// <summary>
/// Email Address.
/// </summary>
-64
View File
@@ -1,64 +0,0 @@
using System;
namespace Umbraco.Core
{
/// <summary>
/// Abstract implementation of IDisposable.
/// </summary>
/// <remarks>
/// This is for objects that DO have unmanaged resources. Use <see cref="DisposableObjectSlim"/>
/// for objects that do NOT have unmanaged resources, and avoid creating a finalizer.
///
/// Can also be used as a pattern for when inheriting is not possible.
///
/// See also: https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx
/// See also: https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/
///
/// Note: if an object's ctor throws, it will never be disposed, and so if that ctor
/// has allocated disposable objects, it should take care of disposing them.
/// </remarks>
public abstract class DisposableObject : IDisposable
{
private readonly object _locko = new object();
// gets a value indicating whether this instance is disposed.
// for internal tests only (not thread safe)
public bool Disposed { get; private set; }
// implements IDisposable
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// finalizer
~DisposableObject()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
// can happen if the object construction failed
if (_locko == null)
return;
lock (_locko)
{
if (Disposed) return;
Disposed = true;
}
DisposeUnmanagedResources();
if (disposing)
DisposeResources();
}
protected abstract void DisposeResources();
protected virtual void DisposeUnmanagedResources()
{ }
}
}
@@ -1,8 +1,9 @@
using System;
using System.Linq;
using System.Reflection;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Composing
namespace Umbraco.Core
{
/// <summary>
/// Provides extension methods to the <see cref="IFactory"/> class.
+2 -20
View File
@@ -1,6 +1,4 @@
using System;
using System.IO;
using System.Web;
using System.IO;
using Umbraco.Core.Configuration;
namespace Umbraco.Core.IO
@@ -12,23 +10,7 @@ namespace Umbraco.Core.IO
// TODO: Kill this off we don't have umbraco.config XML cache we now have NuCache
public static string GetContentCacheXml(IGlobalSettings globalSettings)
{
switch (globalSettings.LocalTempStorageLocation)
{
case LocalTempStorage.AspNetTemp:
return Path.Combine(HttpRuntime.CodegenDir, @"UmbracoData\umbraco.config");
case LocalTempStorage.EnvironmentTemp:
var appDomainHash = HttpRuntime.AppDomainAppId.ToSHA1();
var cachePath = Path.Combine(Environment.ExpandEnvironmentVariables("%temp%"), "UmbracoData",
//include the appdomain hash is just a safety check, for example if a website is moved from worker A to worker B and then back
// to worker A again, in theory the %temp% folder should already be empty but we really want to make sure that its not
// utilizing an old path
appDomainHash);
return Path.Combine(cachePath, "umbraco.config");
case LocalTempStorage.Default:
return IOHelper.ReturnPath(Constants.AppSettings.ContentXML, "~/App_Data/umbraco.config");
default:
throw new ArgumentOutOfRangeException();
}
return Path.Combine(globalSettings.LocalTempPath, "umbraco.config");
}
}
}
+1 -1
View File
@@ -41,7 +41,7 @@ namespace Umbraco.Core.Logging
}
// a lightweight disposable timer
private class LightDisposableTimer : DisposableObject
private class LightDisposableTimer : DisposableObjectSlim
{
private readonly Action<long> _callback;
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
@@ -22,6 +22,7 @@ namespace Umbraco.Core.Logging.Serilog
//Set this environment variable - so that it can be used in external config file
//add key="serilog:write-to:RollingFile.pathFormat" value="%BASEDIR%\logs\log.txt" />
Environment.SetEnvironmentVariable("BASEDIR", AppDomain.CurrentDomain.BaseDirectory, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("MACHINENAME", Environment.MachineName, EnvironmentVariableTarget.Process);
logConfig.MinimumLevel.Verbose() //Set to highest level of logging (as any sinks may want to restrict it to Errors only)
.Enrich.WithProcessId()
@@ -41,8 +41,6 @@ namespace Umbraco.Core.Logging.Serilog
var loggerConfig = new LoggerConfiguration();
loggerConfig
.MinimalConfiguration()
.OutputDefaultTextFile(LogEventLevel.Debug)
.OutputDefaultJsonFile()
.ReadFromConfigFile()
.ReadFromUserConfigFile();
@@ -1,4 +1,5 @@
using Umbraco.Core.Components;
using Umbraco.Core.Compose;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Logging.Viewer
{
+1 -1
View File
@@ -22,7 +22,7 @@ namespace Umbraco.Core.Logging
public void Stop(bool discardResults = false)
{ }
private class VoidDisposable : DisposableObject
private class VoidDisposable : DisposableObjectSlim
{
protected override void DisposeResources()
{ }
+1 -1
View File
@@ -101,7 +101,7 @@ namespace Umbraco.Core.Manifest
var gridEditors = new List<GridEditor>();
var contentApps = new List<ManifestContentAppDefinition>();
var dashboards = new List<ManifestDashboard>();
var sections = new List<ManifestBackOfficeSection>();
var sections = new List<ManifestSection>();
foreach (var manifest in manifests)
{
@@ -1,10 +1,10 @@
using System.Runtime.Serialization;
using Umbraco.Core.Models.Trees;
using Umbraco.Core.Models.Sections;
namespace Umbraco.Core.Manifest
{
[DataContract(Name = "section", Namespace = "")]
public class ManifestBackOfficeSection : IBackOfficeSection
public class ManifestSection : ISection
{
[DataMember(Name = "alias")]
public string Alias { get; set; }
+1 -1
View File
@@ -55,6 +55,6 @@ namespace Umbraco.Core.Manifest
/// Gets or sets the sections listed in the manifest.
/// </summary>
[JsonProperty("sections")]
public ManifestBackOfficeSection[] Sections { get; set; } = Array.Empty<ManifestBackOfficeSection>();
public ManifestSection[] Sections { get; set; } = Array.Empty<ManifestSection>();
}
}
@@ -1,4 +1,6 @@
using Umbraco.Core.Logging;
using System;
using System.Collections.Generic;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Migrations
@@ -32,5 +34,11 @@ namespace Umbraco.Core.Migrations
/// Gets or sets a value indicating whether an expression is being built.
/// </summary>
bool BuildingExpression { get; set; }
/// <summary>
/// Adds a post-migrations.
/// </summary>
void AddPostMigration<TMigration>()
where TMigration : IMigration;
}
}
@@ -1,12 +0,0 @@
using Semver;
using Umbraco.Core.Composing;
using Umbraco.Core.Logging;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Migrations
{
public interface IPostMigration : IDiscoverable
{
void Execute(string name, IScope scope, SemVersion originVersion, SemVersion targetVersion, ILogger logger);
}
}
@@ -27,7 +27,6 @@ namespace Umbraco.Core.Migrations.Install
private readonly IRuntimeState _runtime;
private readonly IMigrationBuilder _migrationBuilder;
private readonly IKeyValueService _keyValueService;
private readonly PostMigrationCollection _postMigrations;
private readonly ILogger _logger;
private DatabaseSchemaResult _databaseSchemaValidationResult;
@@ -35,7 +34,7 @@ namespace Umbraco.Core.Migrations.Install
/// <summary>
/// Initializes a new instance of the <see cref="DatabaseBuilder"/> class.
/// </summary>
public DatabaseBuilder(IScopeProvider scopeProvider, IGlobalSettings globalSettings, IUmbracoDatabaseFactory databaseFactory, IRuntimeState runtime, ILogger logger, IMigrationBuilder migrationBuilder, IKeyValueService keyValueService, PostMigrationCollection postMigrations)
public DatabaseBuilder(IScopeProvider scopeProvider, IGlobalSettings globalSettings, IUmbracoDatabaseFactory databaseFactory, IRuntimeState runtime, ILogger logger, IMigrationBuilder migrationBuilder, IKeyValueService keyValueService)
{
_scopeProvider = scopeProvider;
_globalSettings = globalSettings;
@@ -44,7 +43,6 @@ namespace Umbraco.Core.Migrations.Install
_logger = logger;
_migrationBuilder = migrationBuilder;
_keyValueService = keyValueService;
_postMigrations = postMigrations;
}
#region Status
@@ -483,7 +481,7 @@ namespace Umbraco.Core.Migrations.Install
/// configured and it is possible to connect to the database.</para>
/// <para>Runs whichever migrations need to run.</para>
/// </remarks>
public Result UpgradeSchemaAndData()
public Result UpgradeSchemaAndData(MigrationPlan plan)
{
try
{
@@ -496,8 +494,8 @@ namespace Umbraco.Core.Migrations.Install
_logger.Info<DatabaseBuilder>("Database upgrade started");
// upgrade
var upgrader = new UmbracoUpgrader();
upgrader.Execute(_scopeProvider, _migrationBuilder, _keyValueService, _logger, _postMigrations);
var upgrader = new Upgrader(plan);
upgrader.Execute(_scopeProvider, _migrationBuilder, _keyValueService, _logger);
var message = "<p>Upgrade completed!</p>";
@@ -271,17 +271,17 @@ namespace Umbraco.Core.Migrations.Install
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -88, EditorAlias = Constants.PropertyEditors.Aliases.TextBox, DbType = "Nvarchar" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -89, EditorAlias = Constants.PropertyEditors.Aliases.TextArea, DbType = "Ntext" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -90, EditorAlias = Constants.PropertyEditors.Aliases.UploadField, DbType = "Nvarchar" });
InsertDataTypeDto(Constants.DataTypes.LabelString, Constants.PropertyEditors.Aliases.NoEdit, "Nvarchar", "{\"umbracoDataValueType\":\"STRING\"}");
InsertDataTypeDto(Constants.DataTypes.LabelInt, Constants.PropertyEditors.Aliases.NoEdit, "Integer", "{\"umbracoDataValueType\":\"INT\"}");
InsertDataTypeDto(Constants.DataTypes.LabelBigint, Constants.PropertyEditors.Aliases.NoEdit, "Nvarchar", "{\"umbracoDataValueType\":\"BIGINT\"}");
InsertDataTypeDto(Constants.DataTypes.LabelDateTime, Constants.PropertyEditors.Aliases.NoEdit, "Date", "{\"umbracoDataValueType\":\"DATETIME\"}");
InsertDataTypeDto(Constants.DataTypes.LabelDecimal, Constants.PropertyEditors.Aliases.NoEdit, "Decimal", "{\"umbracoDataValueType\":\"DECIMAL\"}");
InsertDataTypeDto(Constants.DataTypes.LabelTime, Constants.PropertyEditors.Aliases.NoEdit, "Date", "{\"umbracoDataValueType\":\"TIME\"}");
InsertDataTypeDto(Constants.DataTypes.LabelString, Constants.PropertyEditors.Aliases.Label, "Nvarchar", "{\"umbracoDataValueType\":\"STRING\"}");
InsertDataTypeDto(Constants.DataTypes.LabelInt, Constants.PropertyEditors.Aliases.Label, "Integer", "{\"umbracoDataValueType\":\"INT\"}");
InsertDataTypeDto(Constants.DataTypes.LabelBigint, Constants.PropertyEditors.Aliases.Label, "Nvarchar", "{\"umbracoDataValueType\":\"BIGINT\"}");
InsertDataTypeDto(Constants.DataTypes.LabelDateTime, Constants.PropertyEditors.Aliases.Label, "Date", "{\"umbracoDataValueType\":\"DATETIME\"}");
InsertDataTypeDto(Constants.DataTypes.LabelDecimal, Constants.PropertyEditors.Aliases.Label, "Decimal", "{\"umbracoDataValueType\":\"DECIMAL\"}");
InsertDataTypeDto(Constants.DataTypes.LabelTime, Constants.PropertyEditors.Aliases.Label, "Date", "{\"umbracoDataValueType\":\"TIME\"}");
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -36, EditorAlias = Constants.PropertyEditors.Aliases.DateTime, DbType = "Date" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -37, EditorAlias = Constants.PropertyEditors.Aliases.ColorPicker, DbType = "Nvarchar" });
InsertDataTypeDto(Constants.DataTypes.DropDownSingle, Constants.PropertyEditors.Aliases.DropDownListFlexible, "Nvarchar", "{\"multiple\":false}");
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -40, EditorAlias = Constants.PropertyEditors.Aliases.RadioButtonList, DbType = "Nvarchar" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -41, EditorAlias = Constants.PropertyEditors.Aliases.Date, DbType = "Date" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -41, EditorAlias = "Umbraco.Date", DbType = "Date" });
InsertDataTypeDto(Constants.DataTypes.DropDownMultiple, Constants.PropertyEditors.Aliases.DropDownListFlexible, "Nvarchar", "{\"multiple\":true}");
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = -43, EditorAlias = Constants.PropertyEditors.Aliases.CheckBoxList, DbType = "Nvarchar" });
_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { NodeId = 1041, EditorAlias = Constants.PropertyEditors.Aliases.Tags, DbType = "Ntext",
@@ -321,7 +321,7 @@ namespace Umbraco.Core.Migrations.Install
{
// on install, initialize the umbraco migration plan with the final state
var upgrader = new UmbracoUpgrader();
var upgrader = new Upgrader(new UmbracoPlan());
var stateValueKey = upgrader.StateValueKey;
var finalState = upgrader.Plan.FinalState;
@@ -50,8 +50,6 @@ namespace Umbraco.Core.Migrations.Install
typeof (MemberTypeDto),
typeof (MemberDto),
typeof (Member2MemberGroupDto),
typeof (ContentXmlDto),
typeof (PreviewXmlDto),
typeof (PropertyTypeGroupDto),
typeof (PropertyTypeDto),
typeof (PropertyDataDto),
@@ -139,13 +137,18 @@ namespace Umbraco.Core.Migrations.Install
/// Validates the schema of the current database.
/// </summary>
internal DatabaseSchemaResult ValidateSchema()
{
return ValidateSchema(OrderedTables);
}
internal DatabaseSchemaResult ValidateSchema(IEnumerable<Type> orderedTables)
{
var result = new DatabaseSchemaResult(SqlSyntax);
result.IndexDefinitions.AddRange(SqlSyntax.GetDefinedIndexes(_database)
.Select(x => new DbIndexDefinition(x)));
result.TableDefinitions.AddRange(OrderedTables
result.TableDefinitions.AddRange(orderedTables
.Select(x => DefinitionFactory.GetTableDefinition(x, SqlSyntax)));
ValidateDbTables(result);
@@ -96,6 +96,12 @@ namespace Umbraco.Core.Migrations
return tables.Any(x => x.InvariantEquals(tableName));
}
protected bool IndexExists(string indexName)
{
var indexes = SqlSyntax.GetDefinedIndexes(Context.Database);
return indexes.Any(x => x.Item2.InvariantEquals(indexName));
}
protected bool ColumnExists(string tableName, string columnName)
{
var columns = SqlSyntax.GetColumnsInSchema(Context.Database).Distinct().ToArray();
@@ -1,11 +1,12 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Migrations
{
/// <summary>
/// Represents a migration context.
/// Implements <see cref="IMigrationContext"/>.
/// </summary>
internal class MigrationContext : IMigrationContext
{
@@ -32,5 +33,15 @@ namespace Umbraco.Core.Migrations
/// <inheritdoc />
public bool BuildingExpression { get; set; }
// this is only internally exposed
public List<Type> PostMigrations { get; } = new List<Type>();
/// <inheritdoc />
public void AddPostMigration<TMigration>()
where TMigration : IMigration
{
PostMigrations.Add(typeof(TMigration));
}
}
}
@@ -14,6 +14,7 @@ namespace Umbraco.Core.Migrations
public class MigrationPlan
{
private readonly Dictionary<string, Transition> _transitions = new Dictionary<string, Transition>();
private readonly List<Type> _postMigrationTypes = new List<Type>();
private string _prevState;
private string _finalState;
@@ -166,6 +167,25 @@ namespace Umbraco.Core.Migrations
return this;
}
/// <summary>
/// Prepares post-migrations.
/// </summary>
/// <remarks>
/// <para>This can be overriden to filter, complement, and/or re-order post-migrations.</para>
/// </remarks>
protected virtual IEnumerable<Type> PreparePostMigrations(IEnumerable<Type> types)
=> types;
/// <summary>
/// Adds a post-migration to the plan.
/// </summary>
public virtual MigrationPlan AddPostMigration<TMigration>()
where TMigration : IMigration
{
_postMigrationTypes.Add(typeof(TMigration));
return this;
}
/// <summary>
/// Creates a random, unique state.
/// </summary>
@@ -270,6 +290,7 @@ namespace Umbraco.Core.Migrations
throw new Exception($"Unknown state \"{origState}\".");
var context = new MigrationContext(scope.Database, logger);
context.PostMigrations.AddRange(_postMigrationTypes);
while (transition != null)
{
@@ -285,6 +306,20 @@ namespace Umbraco.Core.Migrations
throw new Exception($"Unknown state \"{origState}\".");
}
// prepare and de-duplicate post-migrations, only keeping the 1st occurence
var temp = new HashSet<Type>();
var postMigrationTypes = PreparePostMigrations(context.PostMigrations)
.Where(x => !temp.Contains(x))
.Select(x => { temp.Add(x); return x; });
// run post-migrations
foreach (var postMigrationType in postMigrationTypes)
{
logger.Info<MigrationPlan>($"PostMigration: {postMigrationType.FullName}.");
var postMigration = migrationBuilder.Build(postMigrationType, context);
postMigration.Migrate();
}
logger.Info<MigrationPlan>("Done (pending scope completion).");
// safety check
@@ -1,12 +0,0 @@
using System.Collections.Generic;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Migrations
{
public class PostMigrationCollection : BuilderCollectionBase<IPostMigration>
{
public PostMigrationCollection(IEnumerable<IPostMigration> items)
: base(items)
{ }
}
}
@@ -1,11 +0,0 @@
using Umbraco.Core.Composing;
namespace Umbraco.Core.Migrations
{
public class PostMigrationCollectionBuilder : LazyCollectionBuilderBase<PostMigrationCollectionBuilder, PostMigrationCollection, IPostMigration>
{
protected override PostMigrationCollectionBuilder This => this;
protected override Lifetime CollectionLifetime => Lifetime.Transient;
}
}
@@ -0,0 +1,18 @@
namespace Umbraco.Core.Migrations.PostMigrations
{
/// <summary>
/// Rebuilds the published snapshot.
/// </summary>
/// <remarks>
/// <para>This interface exists because the entire published snapshot lives in Umbraco.Web
/// but we may want to trigger rebuilds from Umbraco.Core. These two assemblies should
/// be refactored, really.</para>
/// </remarks>
public interface IPublishedSnapshotRebuilder
{
/// <summary>
/// Rebuilds.
/// </summary>
void Rebuild();
}
}
@@ -0,0 +1,12 @@
namespace Umbraco.Core.Migrations.PostMigrations
{
/// <summary>
/// Implements <see cref="IPublishedSnapshotRebuilder"/> in Umbraco.Core (doing nothing).
/// </summary>
public class PublishedSnapshotRebuilder : IPublishedSnapshotRebuilder
{
/// <inheritdoc />
public void Rebuild()
{ }
}
}
@@ -0,0 +1,24 @@
namespace Umbraco.Core.Migrations.PostMigrations
{
/// <summary>
/// Rebuilds the published snapshot.
/// </summary>
public class RebuildPublishedSnapshot : IMigration
{
private readonly IPublishedSnapshotRebuilder _rebuilder;
/// <summary>
/// Initializes a new instance of the <see cref="RebuildPublishedSnapshot"/> class.
/// </summary>
public RebuildPublishedSnapshot(IPublishedSnapshotRebuilder rebuilder)
{
_rebuilder = rebuilder;
}
/// <inheritdoc />
public void Migrate()
{
_rebuilder.Rebuild();
}
}
}
@@ -56,7 +56,7 @@ namespace Umbraco.Core.Migrations.Upgrade
}
}
// define the plan
// define the plan
protected void DefinePlan()
{
// MODIFYING THE PLAN
@@ -127,8 +127,16 @@ namespace Umbraco.Core.Migrations.Upgrade
To<ConvertRelatedLinksToMultiUrlPicker>("{ED28B66A-E248-4D94-8CDB-9BDF574023F0}");
To<UpdatePickerIntegerValuesToUdi>("{38C809D5-6C34-426B-9BEA-EFD39162595C}");
To<RenameUmbracoDomainsTable>("{6017F044-8E70-4E10-B2A3-336949692ADD}");
To<AddUserLoginDtoDateIndex>("{98339BEF-E4B2-48A8-B9D1-D173DC842BBE}");
Merge()
.To<DropXmlTables>("{CDBEDEE4-9496-4903-9CF2-4104E00FF960}")
.With()
.To<RadioAndCheckboxAndDropdownPropertyEditorsMigration>("{940FD19A-00A8-4D5C-B8FF-939143585726}")
.As("{0576E786-5C30-4000-B969-302B61E90CA3}");
To<RenameLabelAndRichTextPropertyEditorAliases>("{E0CBE54D-A84F-4A8F-9B13-900945FD7ED9}");
To<MergeDateAndDateTimePropertyEditor>("{78BAF571-90D0-4D28-8175-EF96316DA789}");
//FINAL
@@ -1,48 +0,0 @@
using System;
using System.Configuration;
using Semver;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
namespace Umbraco.Core.Migrations.Upgrade
{
/// <summary>
/// Represents the Umbraco upgrader.
/// </summary>
public class UmbracoUpgrader : Upgrader
{
private PostMigrationCollection _postMigrations;
/// <summary>
/// Initializes a new instance of the <see ref="UmbracoUpgrader" /> class.
/// </summary>
public UmbracoUpgrader()
: base(new UmbracoPlan())
{ }
/// <summary>
/// Executes.
/// </summary>
public void Execute(IScopeProvider scopeProvider, IMigrationBuilder migrationBuilder, IKeyValueService keyValueService, ILogger logger, PostMigrationCollection postMigrations)
{
_postMigrations = postMigrations;
Execute(scopeProvider, migrationBuilder, keyValueService, logger);
}
/// <inheritdoc />
public override void AfterMigrations(IScope scope, ILogger logger)
{
// assume we have something in web.config that makes some sense = the origin version
if (!SemVersion.TryParse(ConfigurationManager.AppSettings[Constants.AppSettings.ConfigurationStatus], out var originVersion))
throw new InvalidOperationException($"Could not get current version from web.config {Constants.AppSettings.ConfigurationStatus} appSetting.");
// target version is the code version
var targetVersion = UmbracoVersion.SemanticVersion;
foreach (var postMigration in _postMigrations)
postMigration.Execute(Name, scope, originVersion, targetVersion, logger);
}
}
}
@@ -53,7 +53,7 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
var dataTypeDto = new DataTypeDto
{
NodeId = id,
EditorAlias = Constants.PropertyEditors.Aliases.NoEdit,
EditorAlias = Constants.PropertyEditors.Aliases.Label,
DbType = dbType
};
@@ -0,0 +1,22 @@
using Umbraco.Core.Persistence.Dtos;
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class AddUserLoginDtoDateIndex : MigrationBase
{
public AddUserLoginDtoDateIndex(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
if (!IndexExists("IX_umbracoUserLogin_lastValidatedUtc"))
Create.Index("IX_umbracoUserLogin_lastValidatedUtc")
.OnTable(UserLoginDto.TableName)
.OnColumn("lastValidatedUtc")
.Ascending()
.WithOptions().NonClustered()
.Do();
}
}
}
@@ -1,6 +1,5 @@
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class DropTaskTables : MigrationBase
{
public DropTaskTables(IMigrationContext context)
@@ -0,0 +1,17 @@
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class DropXmlTables : MigrationBase
{
public DropXmlTables(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
if (TableExists("cmsContentXml"))
Delete.Table("cmsContentXml").Do();
if (TableExists("cmsPreviewXml"))
Delete.Table("cmsPreviewXml").Do();
}
}
}
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class MergeDateAndDateTimePropertyEditor : MigrationBase
{
public MergeDateAndDateTimePropertyEditor(IMigrationContext context)
: base(context)
{
}
public override void Migrate()
{
var dataTypes = GetDataTypes("Umbraco.Date");
foreach (var dataType in dataTypes)
{
DateTimeConfiguration config;
try
{
config = (DateTimeConfiguration) new CustomDateTimeConfigurationEditor().FromDatabase(
dataType.Configuration);
}
catch (Exception ex)
{
Logger.Error<DropDownPropertyEditorsMigration>(
ex,
"Invalid property editor configuration detected: \"{Configuration}\", cannot convert editor, values will be cleared",
dataType.Configuration);
continue;
}
config.OffsetTime = false;
dataType.EditorAlias = Constants.PropertyEditors.Aliases.DateTime;
dataType.Configuration = ConfigurationEditor.ToDatabase(config);
Database.Update(dataType);
}
}
private List<DataTypeDto> GetDataTypes(string editorAlias)
{
//need to convert the old drop down data types to use the new one
var dataTypes = Database.Fetch<DataTypeDto>(Sql()
.Select<DataTypeDto>()
.From<DataTypeDto>()
.Where<DataTypeDto>(x => x.EditorAlias == editorAlias));
return dataTypes;
}
private class CustomDateTimeConfigurationEditor : ConfigurationEditor<DateTimeConfiguration>
{
}
}
}
@@ -0,0 +1,183 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core.Logging;
using Umbraco.Core.Migrations.PostMigrations;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class RadioAndCheckboxAndDropdownPropertyEditorsMigration : MigrationBase
{
public RadioAndCheckboxAndDropdownPropertyEditorsMigration(IMigrationContext context)
: base(context)
{
}
public override void Migrate()
{
var refreshCache = false;
refreshCache |= Migrate(Constants.PropertyEditors.Aliases.RadioButtonList, (dto, configuration) => UpdateRadioOrCheckboxPropertyDataDto(dto, configuration, true));
refreshCache |= Migrate(Constants.PropertyEditors.Aliases.CheckBoxList, (dto, configuration) => UpdateRadioOrCheckboxPropertyDataDto(dto, configuration, false));
refreshCache |= Migrate(Constants.PropertyEditors.Aliases.DropDownListFlexible, UpdateDropDownPropertyDataDto);
if (refreshCache)
{
Context.AddPostMigration<RebuildPublishedSnapshot>();
}
}
private bool Migrate(string editorAlias, Func<PropertyDataDto, ValueListConfiguration, bool> updateRadioPropertyDataFunc)
{
var refreshCache = false;
var dataTypes = GetDataTypes(editorAlias);
foreach (var dataType in dataTypes)
{
ValueListConfiguration config;
if (dataType.Configuration.IsNullOrWhiteSpace())
continue;
// parse configuration, and update everything accordingly
try
{
config = (ValueListConfiguration) new ValueListConfigurationEditor().FromDatabase(
dataType.Configuration);
}
catch (Exception ex)
{
Logger.Error<DropDownPropertyEditorsMigration>(
ex,
"Invalid property editor configuration detected: \"{Configuration}\", cannot convert editor, values will be cleared",
dataType.Configuration);
continue;
}
// get property data dtos
var propertyDataDtos = Database.Fetch<PropertyDataDto>(Sql()
.Select<PropertyDataDto>()
.From<PropertyDataDto>()
.InnerJoin<PropertyTypeDto>()
.On<PropertyTypeDto, PropertyDataDto>((pt, pd) => pt.Id == pd.PropertyTypeId)
.InnerJoin<DataTypeDto>()
.On<DataTypeDto, PropertyTypeDto>((dt, pt) => dt.NodeId == pt.DataTypeId)
.Where<PropertyTypeDto>(x => x.DataTypeId == dataType.NodeId));
// update dtos
var updatedDtos = propertyDataDtos.Where(x => updateRadioPropertyDataFunc(x, config));
// persist changes
foreach (var propertyDataDto in updatedDtos) Database.Update(propertyDataDto);
UpdateDataType(dataType);
refreshCache = true;
}
return refreshCache;
}
private List<DataTypeDto> GetDataTypes(string editorAlias)
{
//need to convert the old drop down data types to use the new one
var dataTypes = Database.Fetch<DataTypeDto>(Sql()
.Select<DataTypeDto>()
.From<DataTypeDto>()
.Where<DataTypeDto>(x => x.EditorAlias == editorAlias));
return dataTypes;
}
private void UpdateDataType(DataTypeDto dataType)
{
dataType.DbType = ValueStorageType.Nvarchar.ToString();
Database.Update(dataType);
}
private bool UpdateRadioOrCheckboxPropertyDataDto(PropertyDataDto propData, ValueListConfiguration config, bool singleValue)
{
//Get the INT ids stored for this property/drop down
int[] ids = null;
if (!propData.VarcharValue.IsNullOrWhiteSpace())
{
ids = ConvertStringValues(propData.VarcharValue);
}
else if (!propData.TextValue.IsNullOrWhiteSpace())
{
ids = ConvertStringValues(propData.TextValue);
}
else if (propData.IntegerValue.HasValue)
{
ids = new[] {propData.IntegerValue.Value};
}
//if there are INT ids, convert them to values based on the configuration
if (ids == null || ids.Length <= 0) return false;
//map the ids to values
var values = new List<string>();
var canConvert = true;
foreach (var id in ids)
{
var val = config.Items.FirstOrDefault(x => x.Id == id);
if (val != null)
values.Add(val.Value);
else
{
Logger.Warn<DropDownPropertyEditorsMigration>(
"Could not find associated data type configuration for stored Id {DataTypeId}", id);
canConvert = false;
}
}
if (!canConvert) return false;
//The radio button only supports selecting a single value, so if there are multiple for some insane reason we can only use the first
propData.VarcharValue = singleValue ? values[0] : JsonConvert.SerializeObject(values);
propData.TextValue = null;
propData.IntegerValue = null;
return true;
}
private bool UpdateDropDownPropertyDataDto(PropertyDataDto propData, ValueListConfiguration config)
{
//Get the INT ids stored for this property/drop down
var values = propData.VarcharValue.Split(new []{","}, StringSplitOptions.RemoveEmptyEntries);
//if there are INT ids, convert them to values based on the configuration
if (values == null || values.Length <= 0) return false;
//The radio button only supports selecting a single value, so if there are multiple for some insane reason we can only use the first
propData.VarcharValue = JsonConvert.SerializeObject(values);
propData.TextValue = null;
propData.IntegerValue = null;
return true;
}
private int[] ConvertStringValues(string val)
{
var splitVals = val.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
var intVals = splitVals
.Select(x => int.TryParse(x, out var i) ? i : int.MinValue)
.Where(x => x != int.MinValue)
.ToArray();
//only return if the number of values are the same (i.e. All INTs)
if (splitVals.Length == intVals.Length)
return intVals;
return null;
}
private class ValueListConfigurationEditor : ConfigurationEditor<ValueListConfiguration>
{
}
}
}
@@ -0,0 +1,41 @@
using System.Collections.Generic;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Dtos;
namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0
{
public class RenameLabelAndRichTextPropertyEditorAliases : MigrationBase
{
public RenameLabelAndRichTextPropertyEditorAliases(IMigrationContext context)
: base(context)
{
}
public override void Migrate()
{
MigratePropertyEditorAlias("Umbraco.TinyMCEv3", Constants.PropertyEditors.Aliases.TinyMce);
MigratePropertyEditorAlias("Umbraco.NoEdit", Constants.PropertyEditors.Aliases.Label);
}
private void MigratePropertyEditorAlias(string oldAlias, string newAlias)
{
var dataTypes = GetDataTypes(oldAlias);
foreach (var dataType in dataTypes)
{
dataType.EditorAlias = newAlias;
Database.Update(dataType);
}
}
private List<DataTypeDto> GetDataTypes(string editorAlias)
{
var dataTypes = Database.Fetch<DataTypeDto>(Sql()
.Select<DataTypeDto>()
.From<DataTypeDto>()
.Where<DataTypeDto>(x => x.EditorAlias == editorAlias));
return dataTypes;
}
}
}
@@ -22,6 +22,7 @@ namespace Umbraco.Core.Models.Packaging
public RequirementsType UmbracoVersionRequirementsType { get; set; }
public string Author { get; set; }
public string AuthorUrl { get; set; }
public IList<string> Contributors { get; set; }
public string Readme { get; set; }
public string PackageView { get; set; }
public string IconUrl { get; set; }
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Models.Packaging
{
@@ -12,6 +13,7 @@ namespace Umbraco.Core.Models.Packaging
Version UmbracoVersion { get; }
string Author { get; }
string AuthorUrl { get; }
IList<string> Contributors { get; }
string Readme { get; }
/// <summary>
@@ -25,6 +25,7 @@ namespace Umbraco.Core.Models.Packaging
Actions = compiled.Actions,
Author = compiled.Author,
AuthorUrl = compiled.AuthorUrl,
Contributors = compiled.Contributors,
PackageView = compiled.PackageView,
IconUrl = compiled.IconUrl,
License = compiled.License,
@@ -79,6 +80,9 @@ namespace Umbraco.Core.Models.Packaging
[Url]
public string AuthorUrl { get; set; } = string.Empty;
[DataMember(Name = "contributors")]
public IList<string> Contributors { get; set; } = new List<string>();
[DataMember(Name = "license")]
public string License { get; set; } = "MIT License";
@@ -1,9 +1,9 @@
namespace Umbraco.Core.Models.Trees
namespace Umbraco.Core.Models.Sections
{
/// <summary>
/// Defines a back office section.
/// </summary>
public interface IBackOfficeSection
public interface ISection
{
/// <summary>
/// Gets the alias of the section.
@@ -43,6 +43,7 @@ namespace Umbraco.Core.Packaging
Name = package.Element("name")?.Value,
Author = author.Element("name")?.Value,
AuthorUrl = author.Element("website")?.Value,
Contributors = info.Element("contributors")?.Elements("contributor").Select(x => x.Value).ToList() ?? new List<string>(),
Version = package.Element("version")?.Value,
Readme = info.Element("readme")?.Value,
License = package.Element("license")?.Value,
@@ -102,8 +102,8 @@ namespace Umbraco.Core.Packaging
{
// TODO: I don't think this ordering is necessary
var orderedTypes = (from contentType in contentTypes
orderby contentType.ParentId descending, contentType.Id descending
select contentType).ToList();
orderby contentType.ParentId descending, contentType.Id descending
select contentType).ToList();
removedContentTypes.AddRange(orderedTypes);
contentTypeService.Delete(orderedTypes, userId);
}
@@ -157,7 +157,7 @@ namespace Umbraco.Core.Packaging
DictionaryItemsUninstalled = removedDictionaryItems,
DataTypesUninstalled = removedDataTypes,
LanguagesUninstalled = removedLanguages,
};
return summary;
@@ -188,8 +188,8 @@ namespace Umbraco.Core.Packaging
var element = packageDocument.XmlData;
var roots = from doc in element.Elements()
where (string)doc.Attribute("isDoc") == ""
select doc;
where (string)doc.Attribute("isDoc") == ""
select doc;
var contents = ParseDocumentRootXml(roots, parentId, importedDocumentTypes).ToList();
if (contents.Any())
@@ -289,13 +289,26 @@ namespace Umbraco.Core.Packaging
var nodeName = element.Attribute("nodeName").Value;
var path = element.Attribute("path").Value;
var templateId = element.AttributeValue<int?>("template");
var properties = from property in element.Elements()
where property.Attribute("isDoc") == null
select property;
//TODO: This will almost never work, we can't reference a template by an INT Id within a package manifest, we need to change the
// packager to package templates by UDI and resolve by the same, in 98% of cases, this isn't going to work, or it will resolve the wrong template.
var template = templateId.HasValue ? _fileService.GetTemplate(templateId.Value) : null;
//now double check this is correct since its an INT it could very well be pointing to an invalid template :/
if (template != null)
{
if (!contentType.IsAllowedTemplate(template.Alias))
{
//well this is awkward, we'll set the template to null and it will be wired up to the default template
// when it's persisted in the document repository
template = null;
}
}
IContent content = parent == null
? new Content(nodeName, parentId, contentType)
{
@@ -312,6 +325,12 @@ namespace Umbraco.Core.Packaging
Key = key
};
//Here we make sure that we take composition properties in account as well
//otherwise we would skip them and end up losing content
var propTypes = contentType.CompositionPropertyTypes.Any()
? contentType.CompositionPropertyTypes.ToDictionary(x => x.Alias, x => x)
: contentType.PropertyTypes.ToDictionary(x => x.Alias, x => x);
foreach (var property in properties)
{
string propertyTypeAlias = property.Name.LocalName;
@@ -319,10 +338,11 @@ namespace Umbraco.Core.Packaging
{
var propertyValue = property.Value;
var propertyType = contentType.PropertyTypes.FirstOrDefault(pt => pt.Alias == propertyTypeAlias);
//set property value
content.SetValue(propertyTypeAlias, propertyValue);
if (propTypes.TryGetValue(propertyTypeAlias, out var propertyType))
{
//set property value
content.SetValue(propertyTypeAlias, propertyValue);
}
}
}
@@ -335,7 +355,7 @@ namespace Umbraco.Core.Packaging
public IEnumerable<IContentType> ImportDocumentType(XElement docTypeElement, int userId)
{
return ImportDocumentTypes(new []{ docTypeElement }, userId);
return ImportDocumentTypes(new[] { docTypeElement }, userId);
}
/// <summary>
@@ -359,7 +379,7 @@ namespace Umbraco.Core.Packaging
public IEnumerable<IContentType> ImportDocumentTypes(IReadOnlyCollection<XElement> unsortedDocumentTypes, bool importStructure, int userId)
{
var importedContentTypes = new Dictionary<string, IContentType>();
//When you are importing a single doc type we have to assume that the dependencies are already there.
//Otherwise something like uSync won't work.
var graph = new TopoGraph<string, TopoGraph.Node<string, XElement>>(x => x.Key, x => x.Dependencies);
@@ -452,7 +472,7 @@ namespace Umbraco.Core.Packaging
if (updatedContentTypes.Any())
_contentTypeService.Save(updatedContentTypes, userId);
}
return list;
}
@@ -715,7 +735,7 @@ namespace Umbraco.Core.Packaging
property.Element("Name").Value, dataTypeDefinitionId, property.Element("Type").Value.Trim());
//convert to a label!
dataTypeDefinition = _dataTypeService.GetByEditorAlias(Constants.PropertyEditors.Aliases.NoEdit).FirstOrDefault();
dataTypeDefinition = _dataTypeService.GetByEditorAlias(Constants.PropertyEditors.Aliases.Label).FirstOrDefault();
//if for some odd reason this isn't there then ignore
if (dataTypeDefinition == null) continue;
}
@@ -854,7 +874,7 @@ namespace Umbraco.Core.Packaging
{
_dataTypeService.Save(dataTypes, userId, true);
}
return dataTypes;
}
@@ -937,7 +957,7 @@ namespace Umbraco.Core.Packaging
var items = new List<IDictionaryItem>();
foreach (var dictionaryItemElement in dictionaryItemElementList)
items.AddRange(ImportDictionaryItem(dictionaryItemElement, languages, parentId, userId));
return items;
}
@@ -1024,7 +1044,7 @@ namespace Umbraco.Core.Packaging
_localizationService.Save(langauge, userId);
list.Add(langauge);
}
return list;
}
@@ -1187,7 +1207,7 @@ namespace Umbraco.Core.Packaging
public IEnumerable<ITemplate> ImportTemplate(XElement templateElement, int userId)
{
return ImportTemplates(new[] {templateElement}, userId);
return ImportTemplates(new[] { templateElement }, userId);
}
/// <summary>
@@ -1234,7 +1254,7 @@ namespace Umbraco.Core.Packaging
var alias = templateElement.Element("Alias").Value;
var design = templateElement.Element("Design").Value;
var masterElement = templateElement.Element("Master");
var existingTemplate = _fileService.GetTemplate(alias) as Template;
var template = existingTemplate ?? new Template(templateName, alias);
template.Content = design;
@@ -39,6 +39,7 @@ namespace Umbraco.Core.Packaging
LicenseUrl = xml.Element("license")?.AttributeValue<string>("url") ?? string.Empty,
Author = xml.Element("author")?.Value ?? string.Empty,
AuthorUrl = xml.Element("author")?.AttributeValue<string>("url") ?? string.Empty,
Contributors = xml.Element("contributors")?.Elements("contributor").Select(x => x.Value).ToList() ?? new List<string>(),
Readme = xml.Element("readme")?.Value ?? string.Empty,
Actions = xml.Element("actions")?.ToString(SaveOptions.None) ?? "<actions></actions>", //take the entire outer xml value
ContentNodeId = xml.Element("content")?.AttributeValue<string>("nodeId") ?? string.Empty,
@@ -87,6 +88,8 @@ namespace Umbraco.Core.Packaging
new XCData(def.Author ?? string.Empty),
new XAttribute("url", def.AuthorUrl ?? string.Empty)),
new XElement("contributors", (def.Contributors ?? Array.Empty<string>()).Where(x => !x.IsNullOrWhiteSpace()).Select(x => new XElement("contributor", x))),
new XElement("readme", new XCData(def.Readme ?? string.Empty)),
actionsXml,
new XElement("datatypes", string.Join(",", def.DataTypes ?? Array.Empty<string>())),
@@ -573,12 +573,25 @@ namespace Umbraco.Core.Packaging
package.Add(requirements);
info.Add(package);
//Author
// Author
var author = new XElement("author", "");
author.Add(new XElement("name", definition.Author));
author.Add(new XElement("website", definition.AuthorUrl));
info.Add(author);
// Contributors
var contributors = new XElement("contributors", "");
if (definition.Contributors != null && definition.Contributors.Any())
{
foreach (var contributor in definition.Contributors)
{
contributors.Add(new XElement("contributor", contributor));
}
}
info.Add(contributors);
info.Add(new XElement("readme", new XCData(definition.Readme)));
return info;
@@ -608,10 +621,5 @@ namespace Umbraco.Core.Packaging
var packagesXml = XDocument.Load(packagesFile);
return packagesXml;
}
}
}
@@ -5,17 +5,16 @@ namespace Umbraco.Core
{
public static class DatabaseSchema
{
//TODO: Why aren't all table names with the same prefix?
public const string TableNamePrefix = "umbraco";
public static class Tables
{
public const string Lock = /*TableNamePrefix*/ "umbraco" + "Lock";
public const string Log = /*TableNamePrefix*/ "umbraco" + "Log";
public const string Lock = TableNamePrefix + "Lock";
public const string Log = TableNamePrefix + "Log";
public const string Node = /*TableNamePrefix*/ "umbraco" + "Node";
public const string Node = TableNamePrefix + "Node";
public const string NodeData = /*TableNamePrefix*/ "cms" + "ContentNu";
public const string NodeXml = /*TableNamePrefix*/ "cms" + "ContentXml"; // TODO: get rid of these with the xml cache
public const string NodePreviewXml = /*TableNamePrefix*/ "cms" + "PreviewXml"; // TODO: get rid of these with the xml cache
public const string ContentType = /*TableNamePrefix*/ "cms" + "ContentType";
public const string ContentChildType = /*TableNamePrefix*/ "cms" + "ContentTypeAllowedContentType";
@@ -37,22 +36,22 @@ namespace Umbraco.Core
public const string PropertyTypeGroup = /*TableNamePrefix*/ "cms" + "PropertyTypeGroup";
public const string PropertyData = TableNamePrefix + "PropertyData";
public const string RelationType = /*TableNamePrefix*/ "umbraco" + "RelationType";
public const string Relation = /*TableNamePrefix*/ "umbraco" + "Relation";
public const string RelationType = TableNamePrefix + "RelationType";
public const string Relation = TableNamePrefix + "Relation";
public const string Domain = /*TableNamePrefix*/ "umbraco" + "Domain";
public const string Language = /*TableNamePrefix*/ "umbraco" + "Language";
public const string Domain = TableNamePrefix + "Domain";
public const string Language = TableNamePrefix + "Language";
public const string DictionaryEntry = /*TableNamePrefix*/ "cms" + "Dictionary";
public const string DictionaryValue = /*TableNamePrefix*/ "cms" + "LanguageText";
public const string User = /*TableNamePrefix*/ "umbraco" + "User";
public const string UserGroup = /*TableNamePrefix*/ "umbraco" + "UserGroup";
public const string UserStartNode = /*TableNamePrefix*/ "umbraco" + "UserStartNode";
public const string User2UserGroup = /*TableNamePrefix*/ "umbraco" + "User2UserGroup";
public const string User2NodeNotify = /*TableNamePrefix*/ "umbraco" + "User2NodeNotify";
public const string UserGroup2App = /*TableNamePrefix*/ "umbraco" + "UserGroup2App";
public const string UserGroup2NodePermission = /*TableNamePrefix*/ "umbraco" + "UserGroup2NodePermission";
public const string ExternalLogin = /*TableNamePrefix*/ "umbraco" + "ExternalLogin";
public const string User = TableNamePrefix + "User";
public const string UserGroup = TableNamePrefix + "UserGroup";
public const string UserStartNode = TableNamePrefix + "UserStartNode";
public const string User2UserGroup = TableNamePrefix + "User2UserGroup";
public const string User2NodeNotify = TableNamePrefix + "User2NodeNotify";
public const string UserGroup2App = TableNamePrefix + "UserGroup2App";
public const string UserGroup2NodePermission = TableNamePrefix + "UserGroup2NodePermission";
public const string ExternalLogin = TableNamePrefix + "ExternalLogin";
public const string Macro = /*TableNamePrefix*/ "cms" + "Macro";
public const string MacroProperty = /*TableNamePrefix*/ "cms" + "MacroProperty";
@@ -61,21 +60,21 @@ namespace Umbraco.Core
public const string MemberType = /*TableNamePrefix*/ "cms" + "MemberType";
public const string Member2MemberGroup = /*TableNamePrefix*/ "cms" + "Member2MemberGroup";
public const string Access = /*TableNamePrefix*/ "umbraco" + "Access";
public const string AccessRule = /*TableNamePrefix*/ "umbraco" + "AccessRule";
public const string RedirectUrl = /*TableNamePrefix*/ "umbraco" + "RedirectUrl";
public const string Access = TableNamePrefix + "Access";
public const string AccessRule = TableNamePrefix + "AccessRule";
public const string RedirectUrl = TableNamePrefix + "RedirectUrl";
public const string CacheInstruction = /*TableNamePrefix*/ "umbraco" + "CacheInstruction";
public const string Server = /*TableNamePrefix*/ "umbraco" + "Server";
public const string CacheInstruction = TableNamePrefix + "CacheInstruction";
public const string Server = TableNamePrefix + "Server";
public const string Tag = /*TableNamePrefix*/ "cms" + "Tags";
public const string TagRelationship = /*TableNamePrefix*/ "cms" + "TagRelationship";
public const string KeyValue = TableNamePrefix + "KeyValue";
public const string AuditEntry = /*TableNamePrefix*/ "umbraco" + "Audit";
public const string Consent = /*TableNamePrefix*/ "umbraco" + "Consent";
public const string UserLogin = /*TableNamePrefix*/ "umbraco" + "UserLogin";
public const string AuditEntry = TableNamePrefix + "Audit";
public const string Consent = TableNamePrefix + "Consent";
public const string UserLogin = TableNamePrefix + "UserLogin";
}
}
}
@@ -30,11 +30,14 @@ namespace Umbraco.Core.Persistence.Dtos
/// Updated every time a user's session is validated
/// </summary>
/// <remarks>
/// This allows us to guess if a session is timed out if a user doesn't actively log out
/// and also allows us to trim the data in the table
/// <para>This allows us to guess if a session is timed out if a user doesn't actively
/// log out and also allows us to trim the data in the table.</para>
/// <para>The index is IMPORTANT as it prevents deadlocks during deletion of
/// old sessions (DELETE ... WHERE lastValidatedUtc &lt; date).</para>
/// </remarks>
[Column("lastValidatedUtc")]
[NullSetting(NullSetting = NullSettings.NotNull)]
[Index(IndexTypes.NonClustered, Name = "IX_userLoginDto_lastValidatedUtc")]
public DateTime LastValidatedUtc { get; set; }
/// <summary>
@@ -15,7 +15,7 @@ namespace Umbraco.Core.Persistence.Factories
{
if (!editors.TryGet(dto.EditorAlias, out var editor))
{
logger.Warn(typeof(DataTypeFactory), "Could not find an editor with alias {dto.EditorAlias}, converting to label", dto.EditorAlias);
logger.Warn(typeof(DataTypeFactory), "Could not find an editor with alias {EditorAlias}, converting to label", dto.EditorAlias);
//convert to label
editor = new LabelPropertyEditor(logger);
}
@@ -202,10 +202,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
"DELETE FROM " + Constants.DatabaseSchema.Tables.DocumentCultureVariation + " WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.DocumentVersion + " WHERE id IN (SELECT id FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id)",
"DELETE FROM " + Constants.DatabaseSchema.Tables.PropertyData + " WHERE versionId IN (SELECT id FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id)",
"DELETE FROM cmsPreviewXml WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.ContentVersionCultureVariation + " WHERE versionId IN (SELECT id FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id)",
"DELETE FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id",
"DELETE FROM cmsContentXml WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.Content + " WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.Access + " WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.Node + " WHERE id = @id"
@@ -66,8 +66,22 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
//no matter what we always must have node id ordered at the end
sql = ordering.Direction == Direction.Ascending ? sql.OrderBy("NodeId") : sql.OrderByDescending("NodeId");
var page = Database.Page<BaseDto>(pageIndex + 1, pageSize, sql);
var dtos = page.Items;
// for content we must query for ContentEntityDto entities to produce the correct culture variant entity names
var pageIndexToFetch = pageIndex + 1;
IEnumerable<BaseDto> dtos;
if(isContent)
{
var page = Database.Page<ContentEntityDto>(pageIndexToFetch, pageSize, sql);
dtos = page.Items;
totalRecords = page.TotalItems;
}
else
{
var page = Database.Page<BaseDto>(pageIndexToFetch, pageSize, sql);
dtos = page.Items;
totalRecords = page.TotalItems;
}
var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray();
if (isContent)
@@ -75,9 +89,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
// TODO: see https://github.com/umbraco/Umbraco-CMS/pull/3460#issuecomment-434903930 we need to not load any property data at all for media
if (isMedia)
BuildProperties(entities, dtos);
BuildProperties(entities, dtos.ToList());
totalRecords = page.TotalItems;
return entities;
}
@@ -199,7 +212,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
private IEnumerable<TreeEntityPath> PerformGetAllPaths(Guid objectType, Action<Sql<ISqlContext>> filter = null)
{
// NodeId is named Id on TreeEntityPath = use an alias
var sql = Sql().Select<NodeDto>(x => Alias(x.NodeId, "Id"), x => x.Path).From<NodeDto>().Where<NodeDto>(x => x.NodeObjectType == objectType);
var sql = Sql().Select<NodeDto>(x => Alias(x.NodeId, nameof(TreeEntityPath.Id)), x => x.Path).From<NodeDto>().Where<NodeDto>(x => x.NodeObjectType == objectType);
filter?.Invoke(sql);
return Database.Fetch<TreeEntityPath>(sql);
}
@@ -250,6 +250,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
lock (_codeIdMap)
{
if (_codeIdMap.TryGetValue(isoCode, out var id)) return id;
if (isoCode.Contains('-') && _codeIdMap.TryGetValue(isoCode.Split('-').First(), out var invariantId)) return invariantId;
}
if (throwOnNotFound)
throw new ArgumentException($"Code {isoCode} does not correspond to an existing language.", nameof(isoCode));
@@ -188,7 +188,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
"DELETE FROM cmsMember2MemberGroup WHERE Member = @id",
"DELETE FROM cmsMember WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id",
"DELETE FROM cmsContentXml WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.Content + " WHERE nodeId = @id",
"DELETE FROM umbracoNode WHERE id = @id"
};
@@ -135,7 +135,13 @@ namespace Umbraco.Core.Persistence.SqlSyntax
{
reader.Read();
// InstanceName can be NULL for the default instance
version = new ServerVersionInfo(reader.GetString(0), reader.GetString(2), reader.IsDBNull(3) ? "(default)" : reader.GetString(3), (EngineEdition) reader.GetInt32(5), reader.GetString(7), reader.GetString(9));
version = new ServerVersionInfo(
reader.GetString(0),
reader.IsDBNull(2) ? "(default)" : reader.GetString(2),
reader.IsDBNull(3) ? "" : reader.GetString(3),
(EngineEdition) reader.GetInt32(5),
reader.GetString(7),
reader.GetString(9));
}
connection.Close();
}
@@ -24,7 +24,7 @@ namespace Umbraco.Core.Persistence
/// </remarks>
// TODO: these comments are not true anymore
// TODO: this class needs not be disposable!
internal class UmbracoDatabaseFactory : DisposableObject, IUmbracoDatabaseFactory
internal class UmbracoDatabaseFactory : DisposableObjectSlim, IUmbracoDatabaseFactory
{
private readonly Lazy<IMapperCollection> _mappers;
private readonly ILogger _logger;
@@ -1,12 +1,13 @@
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors
namespace Umbraco.Core.PropertyEditors
{
/// <summary>
/// Represents the configuration for the datetime value editor.
/// </summary>
public class DateTimeConfiguration : DateConfiguration
public class DateTimeConfiguration
{
[ConfigurationField("format", "Date format", "textstring", Description = "If left empty then the format is YYYY-MM-DD. (see momentjs.com for supported formats)")]
public string Format { get; set; }
public DateTimeConfiguration()
{
// different default values
@@ -16,4 +17,4 @@ namespace Umbraco.Web.PropertyEditors
[ConfigurationField("offsetTime", "Offset time", "boolean", Description = "When enabled the time displayed will be offset with the server's timezone, this is useful for scenarios like scheduled publishing when an editor is in a different timezone than the hosted server")]
public bool OffsetTime { get; set; }
}
}
}
@@ -5,7 +5,7 @@ namespace Umbraco.Core.PropertyEditors
/// <summary>
/// Represents a property editor for label properties.
/// </summary>
[DataEditor(Constants.PropertyEditors.Aliases.NoEdit, "Label", "readonlyvalue", Icon = "icon-readonly")]
[DataEditor(Constants.PropertyEditors.Aliases.Label, "Label", "readonlyvalue", Icon = "icon-readonly")]
public class LabelPropertyEditor : DataEditor
{
/// <summary>
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core.Models.PublishedContent;
namespace Umbraco.Core.PropertyEditors.ValueConverters
@@ -8,8 +9,6 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
[DefaultPropertyValueConverter]
public class CheckboxListValueConverter : PropertyValueConverterBase
{
private static readonly char[] Comma = { ',' };
public override bool IsConverter(PublishedPropertyType propertyType)
=> propertyType.EditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases.CheckBoxList);
@@ -26,7 +25,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
if (string.IsNullOrEmpty(sourceString))
return Enumerable.Empty<string>();
return sourceString.Split(Comma, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim());
return JsonConvert.DeserializeObject<string[]>(sourceString);
}
}
}
@@ -8,14 +8,8 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
[DefaultPropertyValueConverter]
public class DatePickerValueConverter : PropertyValueConverterBase
{
private static readonly string[] PropertyEditorAliases =
{
Constants.PropertyEditors.Aliases.DateTime,
Constants.PropertyEditors.Aliases.Date
};
public override bool IsConverter(PublishedPropertyType propertyType)
=> PropertyEditorAliases.Contains(propertyType.EditorAlias);
=> propertyType.EditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases.DateTime);
public override Type GetPropertyValueType(PublishedPropertyType propertyType)
=> typeof (DateTime);
@@ -17,7 +17,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
public class LabelValueConverter : PropertyValueConverterBase
{
public override bool IsConverter(PublishedPropertyType propertyType)
=> Constants.PropertyEditors.Aliases.NoEdit.Equals(propertyType.EditorAlias);
=> Constants.PropertyEditors.Aliases.Label.Equals(propertyType.EditorAlias);
public override Type GetPropertyValueType(PublishedPropertyType propertyType)
{
@@ -10,17 +10,17 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
=> propertyType.EditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases.RadioButtonList);
public override Type GetPropertyValueType(PublishedPropertyType propertyType)
=> typeof (int);
=> typeof (string);
public override PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType)
=> PropertyCacheLevel.Element;
public override object ConvertSourceToIntermediate(IPublishedElement owner, PublishedPropertyType propertyType, object source, bool preview)
{
var intAttempt = source.TryConvertTo<int>();
var attempt = source.TryConvertTo<string>();
if (intAttempt.Success)
return intAttempt.Result;
if (attempt.Success)
return attempt.Result;
return null;
}
@@ -1,4 +1,6 @@
namespace Umbraco.Core.Composing
using Umbraco.Core.Composing;
namespace Umbraco.Core
{
/// <summary>
/// Provides extension methods to the <see cref="IRegister"/> class.
+1 -3
View File
@@ -6,7 +6,6 @@ using System.Reflection;
using System.Threading;
using System.Web;
using Umbraco.Core.Cache;
using Umbraco.Core.Components;
using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Exceptions;
@@ -113,8 +112,7 @@ namespace Umbraco.Core.Runtime
var configs = GetConfigs();
// type loader
var localTempStorage = configs.Global().LocalTempStorageLocation;
var typeLoader = new TypeLoader(appCaches.RuntimeCache, localTempStorage, ProfilingLogger);
var typeLoader = new TypeLoader(appCaches.RuntimeCache, configs.Global().LocalTempPath, ProfilingLogger);
// runtime state
// beware! must use '() => _factory.GetInstance<T>()' and NOT '_factory.GetInstance<T>'

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