Compare commits

...
325 Commits
Author SHA1 Message Date
Andy Butland c6ab394947 Merge branch 'release/10.8.11' into v10/dev
# Conflicts:
#	version.json
2025-07-02 06:32:18 +02:00
Kenn JacobsenandGitHub d8f68d2c40 Merge commit from fork 2025-06-24 08:39:17 +02:00
Andy Butland ff88617db0 Bumped version to 10.8.11. 2025-06-05 07:49:09 +02:00
Andy Butland 9f912aea0e Merge branch 'release/10.8.10' into v10/dev
# Conflicts:
#	version.json
2025-05-06 07:15:10 +02:00
Andy Butland ba95c12f09 Resolved failures in unit tests. 2025-05-06 05:37:30 +02:00
Andy ButlandandGitHub 14fbd20665 Merge commit from fork
* Backport user enumeration fix.

* Supress warning on use of .NET 6 with TimeProvider dependency.

* Replace TimeProvider with Stopwatch, as the former isn't tested against .NET 6.0 and generates warnings.

* Remove full path details from exception when requesting a path outside of the physical file system's root.

* Added randomness to login duration.

* Ensured against negative duration.
2025-05-06 05:11:03 +02:00
mole 2d8b5e8786 Use windows agent for nuget push 2025-04-28 10:48:26 +02:00
Andy Butland 747e095178 Bump version to 10.8.10. 2025-04-22 10:06:27 +02:00
Andy Butland 1cfa5a225e Merge branch 'release/10.8.9' into v10/dev
# Conflicts:
#	version.json
2025-03-11 09:20:51 +01:00
7888b9a4ce Merge commit from fork
* Bumped version to 10.8.9.

* Fixed parsing of node if in content and media permission querystring handlers to retrieve expected value when multiple are provided in the querystring.

# Conflicts:
#	tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandlerTests.cs
#	tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/MediaPermissionsQueryStringHandlerTests.cs

* Add HttpPost attributes to backoffice endpoints that should only accept post requests.

* Narrow PermissionQueryString parsing to the releveant UmbracoObjectType

* Add missed update from v10

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2025-03-11 05:11:08 +01:00
Andy Butland e31582b297 Backport bumped imagesharp to prevent CVE-2025-27598 #18602 2025-03-09 08:58:25 +01:00
Nikolaj Geisle 75cc017a18 Merge branch 'release/10.8.8' into v10/dev
# Conflicts:
#	version.json
2025-01-23 11:08:09 +01:00
d60137e6da Merge commit from fork
* Ensure preview can only be requested with a valid culture code.

* Update src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Restricted to predefined culture codes.

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2025-01-20 14:14:28 +01:00
Andy Butland 9f9c88781a Bumped version to 10.8.8. 2025-01-07 10:08:01 +01:00
c7014e159b Sort manifest file paths alphabetically (#14466)
* Sort manifest file paths alphabetically

* Update src/Umbraco.Infrastructure/Manifest/ManifestParser.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

---------

Co-authored-by: Ronald Barendse <ronald@barend.se>
2024-11-21 16:19:48 +01:00
Zeegaan 31e1acce67 Merge remote-tracking branch 'origin/release/10.8.7' into v10/dev
# Conflicts:
#	version.json
2024-10-23 08:48:08 +02:00
Sven GeusensandNikolaj Geisle 35c51a029a Prevents XSS when viewing an uploaded SVG
from the media-info and image-preview components.
2024-10-21 12:42:06 +02:00
ElitsaandNikolaj Geisle 8c1128c85b Update the HttpContext's user with the authenticated user's principal 2024-10-21 12:41:42 +02:00
ElitsaandNikolaj Geisle c9021ab2d2 Reduce the time when getRemainingTimeoutSeconds request is made from 30s to 20s, so fewer calls are made 2024-10-21 12:41:18 +02:00
ElitsaandNikolaj Geisle 67a71f8f82 Make sure that the client shows the login screen as close to the server's timout time as possible 2024-10-21 12:41:17 +02:00
Andreas ZerbstandAndreas Zerbst edd0a4a4a9 Updated message pack (#17320)
(cherry picked from commit 11270eaaf5)
2024-10-21 11:46:43 +02:00
Andreas ZerbstandGitHub 11270eaaf5 Updated message pack (#17320) 2024-10-21 11:00:47 +02:00
Bjarke BergandGitHub 2d71b5a63b Updated image sharp to a non vulnerable version (#17290) 2024-10-16 12:16:38 +02:00
Nikolaj Geisle 9bab74d30e Bump version.json 2024-10-07 11:55:34 +02:00
Bjarke Berg 0ee0db8071 Merge remote-tracking branch 'refs/remotes/origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2024-05-21 08:44:27 +02:00
Bjarke BergandGitHub c17d4e1a60 Merge pull request from GHSA-j74q-mv2c-rxmp 2024-05-17 08:37:51 +02:00
Bjarke Berg fee222daff Bump version 2024-05-03 09:29:37 +02:00
119fde2033 V10: Fix for fallback file upload (#14892) (#15868)
* Fix for fallback file upload (#14892)

* Added check for file type

* Removed unneeded null checks and fixed tabs

* Cleaning

* Cleanups, cleanups, and removal of unneeded null checks

* Reverted removal of relationshipservice

* Revert null check removals (too risky)

---------

Co-authored-by: Ambert van Unen <AvanUnen@ilionx.com>
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>

(cherry picked from commit 0b5d1f8aa6)

* Fix up formatting

---------

Co-authored-by: Ambert van Unen <ambertvu@gmail.com>
2024-04-24 13:44:20 +02:00
Andy ButlandandGitHub 52c21b0fca Updates JSON schema for Umbraco 10 with latest references for Forms and Deploy (#15918) 2024-03-20 13:20:40 +01:00
Bjarke Berg 99d5a7e609 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2024-03-19 08:43:59 +01:00
JeyandBjarke Berg 7e1d1a1968 Merge pull request from GHSA-552f-97wf-pmpq
Co-authored-by: jey <jey@umbraco.dk>
(cherry picked from commit b743f6a2df)
2024-03-18 08:28:25 +01:00
b743f6a2df Merge pull request from GHSA-552f-97wf-pmpq
Co-authored-by: jey <jey@umbraco.dk>
2024-03-18 08:27:41 +01:00
Bjarke Berg a2511ff09b Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>
(cherry picked from commit 2c23e67c65)
2024-03-15 14:55:20 +01:00
2c23e67c65 Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-03-15 10:56:02 +01:00
Bjarke Berg 8e837d387d Merge remote-tracking branch 'origin/v10/dev' into release/10.8
# Conflicts:
#	version.json
2024-03-14 14:53:42 +01:00
Bjarke Berg 801fb5f885 Bump version 2024-03-14 14:48:09 +01:00
Bjarke BergandGitHub ed517ecd86 Update Imagesharp (#15885) 2024-03-14 14:31:30 +01:00
Bjarke Berg b5e46ba880 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2024-02-06 11:07:16 +01:00
Nikolaj GeisleandGitHub cbf9f9bcd1 Merge pull request from GHSA-gvpc-3pj6-4m9w
* Add MarkDownPropertyValueEditor with html sanitizer

* Implement IMarkdownSanitizer.
2024-02-06 09:53:40 +01:00
Bjarke Berg 2735f17ed8 Merge remote-tracking branch 'origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2024-02-01 11:09:47 +01:00
Ronald BarendseandBjarke Berg e37cf30690 Skip cache refresher operations for content blueprints (#15633)
* Skip cache refresher operations for content blueprints

* Fix JsonPayload deserialization error by adding a default constructor and property initializers

* Obsolete JsonPayload constructor and update usages

(cherry picked from commit 3e28e10cdf)
2024-02-01 10:00:42 +01:00
Bjarke BergandGitHub 118ac8e230 V10+ version of https://github.com/umbraco/Umbraco-CMS/pull/15638 (#15664) 2024-02-01 09:58:42 +01:00
Ronald BarendseandGitHub 3e28e10cdf Skip cache refresher operations for content blueprints (#15633)
* Skip cache refresher operations for content blueprints

* Fix JsonPayload deserialization error by adding a default constructor and property initializers

* Obsolete JsonPayload constructor and update usages
2024-02-01 09:55:09 +01:00
AleksanderandBjarke Berg b18b6cc5e7 Pass cache level to properties when creating published content in nucache
(cherry picked from commit d9d2b66e85)

# Conflicts:
#	src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs
(cherry picked from commit 040495f359)
2024-01-31 10:52:01 +01:00
Elitsa MarinovskaandBjarke Berg 7a04baf9ef V10: Pass in variation context to published cache (#15563)
* Make sure that we always have variation context

* Fix references

(cherry picked from commit 57b3a196bf)
2024-01-30 15:57:33 +01:00
Sven GeusensandBjarke Berg bc1ddaed8c Run the same cleanup with scaffolding content as when copying. (#15541)
* Run the same cleanup with scaffolding content as when copying.

- Added a new ContentScaffoldedNotification
- Published the notification when a new scaffold has been created from a blueprint (content template)
- Linked up the ComplextPEContent handler to do the same cleanup for the new notification as when copying.
- registered handlers to the event for blocklist, blockgrid and nested content

* PR pattern matching suggestion

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
(cherry picked from commit dff90c6ec0)
2024-01-30 15:54:33 +01:00
Bjarke Berg 860afb35f2 Bump version 2024-01-30 15:53:21 +01:00
Ronald BarendseandGitHub 9799c550f4 Create shadow file systems in configured LocalTempPath (#15637) 2024-01-29 08:48:45 +01:00
Ronald BarendseandGitHub b7e43a8def Get references from macro parameters using IDataValueReferenceFactory (#15625) 2024-01-23 16:08:17 +01:00
Ronald BarendseandGitHub cdbbd6a921 Optimize relation tracking for adding new and keeping existing relations (#15596)
* Include automatic relation type aliases from factory and fix SQL parameter overflow (#15141)

* Include automatic relation type aliases from factory

* Remove unnessecary distinct and fix SQL parameter overflow issue

* Fixed assertions and test distinct aliases

* Simplified collection assertions

* Improve logging of invalid reference relations (#15160)

* Include automatic relation type aliases from factory

* Remove unnessecary distinct and fix SQL parameter overflow issue

* Fixed assertions and test distinct aliases

* Simplified collection assertions

* Improve logging of invalid reference relations

* Always get all automatic relation type aliases

* Do not set relation type alias for unknown entity types

* Get references from recursive (nested/block) properties

* Optimize relation tracking for adding new and keeping existing relations

* Optimize getting references by grouping by property editor alias and avoiding duplicate parsing of the same value
2024-01-22 14:53:20 +01:00
Ronald BarendseandGitHub 5198e7c52d Backport relation tracking fixes and get references from recursive (nested/block) properties (#15593)
* Include automatic relation type aliases from factory and fix SQL parameter overflow (#15141)

* Include automatic relation type aliases from factory

* Remove unnessecary distinct and fix SQL parameter overflow issue

* Fixed assertions and test distinct aliases

* Simplified collection assertions

* Improve logging of invalid reference relations (#15160)

* Include automatic relation type aliases from factory

* Remove unnessecary distinct and fix SQL parameter overflow issue

* Fixed assertions and test distinct aliases

* Simplified collection assertions

* Improve logging of invalid reference relations

* Always get all automatic relation type aliases

* Do not set relation type alias for unknown entity types

* Get references from recursive (nested/block) properties
2024-01-19 20:02:57 +01:00
Andy ButlandandGitHub 49f5d2e2d4 Updates JSON schema for Umbraco 10 to include details of additional configuration introduced in Forms and Deploy. (#15566) 2024-01-12 13:13:20 +01:00
Elitsa MarinovskaandGitHub 57b3a196bf V10: Pass in variation context to published cache (#15563)
* Make sure that we always have variation context

* Fix references
2024-01-11 12:46:31 +01:00
dff90c6ec0 Run the same cleanup with scaffolding content as when copying. (#15541)
* Run the same cleanup with scaffolding content as when copying.

- Added a new ContentScaffoldedNotification
- Published the notification when a new scaffold has been created from a blueprint (content template)
- Linked up the ComplextPEContent handler to do the same cleanup for the new notification as when copying.
- registered handlers to the event for blocklist, blockgrid and nested content

* PR pattern matching suggestion

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-01-10 12:22:36 +01:00
AleksanderandSebastiaan Janssen 040495f359 Pass cache level to properties when creating published content in nucache
(cherry picked from commit d9d2b66e85)

# Conflicts:
#	src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs
2024-01-08 14:42:17 +01:00
Bjarke Berg a2ad95d965 Change content 2023-12-22 13:49:57 +01:00
Bjarke Berg 64f2447c0e Added script to update default version 2023-12-22 13:15:13 +01:00
Bjarke Berg b648126d19 Use wildcard as default valid 2023-12-22 12:59:13 +01:00
812b414d96 Batched more update calls to avoid Sql paramater count error (#15487)
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-12-21 09:43:37 +01:00
Bjarke Berg ec91c47158 Merge remote-tracking branch 'origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2023-12-20 09:51:14 +01:00
Kenn JacobsenandGitHub e04a41be45 Add policies for content template handling (#15482) 2023-12-19 14:18:48 +01:00
Chris Fitz-AvonandBjarke Berg d5156aced2 Remove content section access policy from GetAllLanguages endpoint. #15435 (#15450)
(cherry picked from commit cedfdcc9b2)
2023-12-18 08:25:00 +01:00
Bjarke Berg fa9b0e4718 Bump version 2023-12-18 08:23:34 +01:00
Bjarke Berg 8915064780 Merge remote-tracking branch 'origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2023-12-13 09:28:19 +01:00
ZeegaanandBjarke Berg 677ff59d04 Loosen up policies so editors can get what they need 2023-12-12 15:46:46 +01:00
Bjarke Berg 1fe2ec08be bump version 2023-12-12 15:35:15 +01:00
Bjarke Berg 5dfa76600a Post fix 2023-12-11 16:32:38 +01:00
Bjarke Berg 83bcd37250 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2023-12-11 14:37:10 +01:00
Kenn JacobsenandGitHub 4a7ad4a562 Merge pull request from GHSA-v98m-398x-269r 2023-12-11 14:00:23 +01:00
cdd4d2a000 Merge pull request from GHSA-cfr5-7p54-4qg8
* Bump version

* Apply authorization policies to controllers

* Return bad request if we urltracking is disabled

* Apply authorization policies to controllers

* Return bad request if we urltracking is disabled

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-12-11 13:59:59 +01:00
be5a740c96 Merge pull request from GHSA-8qp8-9rpw-j46c
* Added Exception handling and replicated error and info message

* Update auth.resource.js

Fixed the message

* Changed Delay introduction to early phase to avoid repeating code.

---------

Co-authored-by: jey <jey@umbraco.dk>
Co-authored-by: Jey <cyaqublu@gmail.com>
2023-12-11 13:59:35 +01:00
13cc320f19 Merge pull request from GHSA-6324-52pr-h4p5
* Bump version

* Fix https://github.com/umbraco/Umbraco-CMS/security/advisories/GHSA-6324-52pr-h4p5

* Fix https://github.com/umbraco/Umbraco-CMS/security/advisories/GHSA-6324-52pr-h4p5

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-12-11 13:59:03 +01:00
ZeegaanandBjarke Berg b5544aa520 Suppress flow when queueing background threads 2023-12-11 12:43:25 +01:00
Bjarke Berg 9e3f8c7d0c Merge remote-tracking branch 'origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2023-12-08 13:12:33 +01:00
Bjarke Berg cb76554455 Bugfix: Count existing media correct (#15206)
* https://github.com/umbraco/Umbraco-CMS/issues/15205
Count media correct

* Fix content should be document

(cherry picked from commit d2ff2ea46e)
2023-12-07 09:21:25 +01:00
Jacob Overgaard 37e4d80ce8 Update nightly build (#15359)
* cherry-pick templateParameters from v14/dev

* add isNightly parameter

* remove v9

* add parameter check for myget isNightly
2023-12-05 12:45:23 +01:00
Bjarke Berg d5d4edbe92 Bump Version 2023-11-30 21:51:54 +01:00
Bjarke Berg 8d9343b564 Merge branch 'release/10.8' into v10/dev
# Conflicts:
#	version.json
2023-11-27 18:10:40 +01:00
Bjarke Berg 1ee891c8d5 Merge remote-tracking branch 'origin/release/10.8' into release/10.8 2023-11-27 18:09:41 +01:00
Bjarke Berg bf1a5b9b28 Bump version 2023-11-27 18:09:30 +01:00
Bjarke Berg 696b74cdb6 Merge branch 'release/10.8' into v10/dev 2023-11-27 18:08:30 +01:00
Bjarke BergandGitHub bf8af4588e Centralised NuGet packages (#15293)
* Moved to centralized nuget packages

* Handle JsonSchema

* Change PackageReference to PackageVersion

* Opt out of central package management for mangement api (at least for versions less than 14) and the UI project

* ManagePackageVersionsCentrally = false

* Change folder acceptance tests are build, to avoid reading the test Directory.Packages.props

* Change folder acceptance tests are build, to avoid reading the test Directory.Packages.props

* change working directory

* workingDirectory

* Force the template to use local nuget packages

* Force the template to use local nuget packages

* clean up

* added wait on

* added wait on
2023-11-27 15:18:00 +01:00
Kenn JacobsenandBjarke Berg 4781fb1d8b Ensure content types are updated in ContentStore when a data type changes (#15239) 2023-11-17 10:37:23 +01:00
Bjarke Berg d714741bee Fixed build 2023-11-15 09:53:28 +01:00
Bjarke Berg ea33b73daa Added scope.complete in edge cases. (#15207)
(cherry picked from commit 28e8ac11f0)
2023-11-15 09:46:24 +01:00
Bjarke Berg ba64b46824 Merge remote-tracking branch 'origin/release/10.8' into release/10.8 2023-11-15 09:45:30 +01:00
Bjarke Berg 04e59e9a9d Fixed a couple of occurrences where scopes was auto-completed while modified db state (#14947)
* Fixed a couple of occurrences where scopes was auto-complated while actually modified the state of the database.

* Added temp ctor to fix boot issue

(cherry picked from commit 41f8f03c2c)
2023-11-15 09:45:23 +01:00
Jacob OvergaardandGitHub be39b9c19a V10: Update @umbraco-ui/uui, jQuery, ace-editor, nouislider, spectrum-colorpicker2 (#15197)
* V13: Add support for Node.js 20 (#15022)

* update versionSpec to nodejs 20 and avoid specifying minor and patch versions to improve Azure Pipelines stability

* update engines and package lock files

* update helpful displayNames for npm builds

* add retry to counter nodejs.org timeouts

add retryCountOnTaskFailure as suggested on https://developercommunity.visualstudio.com/t/NodeTool0-task-to-install-nodejs-fails/10455454

* update lockfile

* bump nvm support to latest node.js 20.9 LTS

* build(deps): bump @umbraco-ui/uui from 1.3.0 to 1.5.0

* build(deps): bump public dependencies to latest

* build(deps-dev): bump build dependencies to latest

* build(deps-dev): bump test tools to latest

* build: add script to lint and run --fix

* revert login merge from v13
2023-11-14 13:08:29 +01:00
Bjarke Berg 9a143c0850 Merge remote-tracking branch 'origin/release/10.8' into release/10.8 2023-11-14 11:46:26 +01:00
Bjarke Berg df4cd63962 https://github.com/umbraco/Umbraco-CMS/issues/15195 Fixed issue with media not cached correct (#15196) 2023-11-14 10:59:30 +01:00
Bjarke Berg a17e398f28 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2023-11-14 09:29:36 +01:00
Bjarke Berg 9af9dd2c02 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2023-11-14 09:29:09 +01:00
Bjarke BergandGitHub 2266a98fc6 https://github.com/umbraco/Umbraco-CMS/issues/15195 Fixed issue with media not cached correct (#15196) 2023-11-14 09:14:01 +01:00
151fccee97 Performance optimisations related to blocks (and multi url picker) (#15184)
* Added content types to property index value factory, because the deep cloning is too expensive to execute often

* Do not use entityservice in ToEditor, as it goes to the database. We need to use something that is cached.

* Small performance optimization for nested content too

* A little formatting and an obsoletion message

---------

Co-authored-by: kjac <kja@umbraco.dk>
2023-11-14 08:12:05 +01:00
Bjarke Berg abfa07367f Bump version 2023-11-13 18:06:41 +01:00
Bjarke BergandGitHub e5de8bf56b Updated nuget packages (#15192) 2023-11-13 14:59:52 +01:00
Bjarke Berg 00bb5170a0 Merge remote-tracking branch 'origin/v10/dev' into release/10.8
# Conflicts:
#	version.json
2023-11-09 13:53:46 +01:00
919138c299 #14835 Update link on permissionsreport.html (#14872)
* #14835 Update link on permissionsreport.html

Updated link to permissions page to point to 10-LTS documentation

* retrigger checks

---------

Co-authored-by: Rasmus Berntsen <rasmus.berntsen@isobar.com>
2023-11-09 13:53:18 +01:00
Ronald BarendseandGitHub ed65645a33 Add global.json and cleanup UI project file (#14900)
* Add global.json with minimum .NET 6.0.5 SDK version and roll forward policy

* Clean up UI project file
2023-11-09 13:52:21 +01:00
Ronald BarendseandGitHub d0be4ab263 Publish ContentTreeChangeNotification after saving/deleting blueprints (#14898) 2023-11-09 13:51:05 +01:00
Bjarke Berg ddb26632f9 Bump to rc 2023-11-09 13:38:34 +01:00
Bjarke Berg d5b1f5875b Bump version 2023-11-09 13:38:13 +01:00
Bjarke Berg f8c1a560ff Bump version 2023-11-09 13:36:57 +01:00
9e5ff305c8 Batched bulk WhereIn query to avoid To mana paramaters error (#15004)
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-11-07 10:49:46 +01:00
Elitsa MarinovskaandGitHub ffaa77eb25 Update correct action (#15142) 2023-11-06 17:54:16 +01:00
Kenn JacobsenandGitHub 6777145079 Ensure that missing access rules do not break the site (#15081) 2023-11-02 08:45:27 +01:00
Elitsa MarinovskaandGitHub 92af8ac881 Check content permissions before performing action (#15043)
* Setting actionContext.Result when authz wasn't successful

* Taking into account permissions when it is a new node

* Cleanup

* Passing nodeId as path when new item
2023-11-01 11:30:32 +01:00
Lucas Bach BisgaardandSebastiaan Janssen bde88caf14 Fixes #14351 - Using Fallback to default langauge on a specific item changes the whole VariationContext (#14620)
(cherry picked from commit 738749b705)
2023-10-26 11:47:44 +02:00
Bjarke BergandGitHub f4ac6cdded Added "pr: none" to nightly trigger (#15044) 2023-10-26 09:01:25 +02:00
Elitsa MarinovskaandGitHub 132935c2d7 Handle corrupted index (#14889) 2023-10-09 10:19:36 +02:00
Kenn JacobsenandGitHub 04b05714e5 Add notification state to "final" published notification when publishing with descendants (#14922)
* Revert "V10/bugfix/14543 publish descendants (#14763)"

This reverts commit f750bca453.

* Add notification state to "final" published notification when publishing with descendants
2023-10-05 14:39:00 +02:00
Kenn JacobsenandGitHub 7be1852827 Make sure to sign out external users if an error occurs during sign-in (#14867) 2023-09-28 13:25:11 +02:00
Andreas ZerbstandGitHub 158cef1692 V10 fixed up failing acceptance test (#14829)
* Updated playwright, our builders, and our helpers

* Updated the use of our testhelper methods, we removed the need for sending umbracoApi through the methods as a parameter since it was unnecessary

* Added a timeout

* Updated successNotifications and added a locator

* Removed timeout from successNotification

* Added additional timeouts and updated old locators which were failing

* Updated locator so it only finds one element

* Removed timeouts and added a waitForTimeout

* Removed timeouts

* Removed timeouts

* Added timeouts

* Updated locator

* Added a timeout

* Updated locators for clicking button

* Changed locator for adding the image, sometimes the old locator would find 2 locators
2023-09-20 12:15:24 +02:00
Bjarke Berg 1a4f3981eb Merge remote-tracking branch 'origin/v10/dev' into v10/dev 2023-09-20 09:42:28 +02:00
Bjarke Berg 7765f98ee1 Added random delay in forgot password to lessen the risk the response times can be use to determine whether the mail exist or not. 2023-09-20 09:02:32 +02:00
6b72880c0b fix: ensured that allowed user name characters are supported in backoffice users as well (#14810) (#14825)
Co-authored-by: Arkadiusz Biel <bielu@bielu.com.pl>
2023-09-19 09:01:35 +02:00
Andy ButlandandGitHub d9f3936a43 Updated dependencies to Forms and Deploy for JSON schema generation. (#14826) 2023-09-19 08:54:41 +02:00
bf09c87f87 Mention MultiUrlPickerValueConverter instead (#14818)
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-09-18 13:48:11 +02:00
Sven GeusensandGitHub ec2134dea0 Disabled nighly build branch trigger (#14807) 2023-09-15 10:02:29 +02:00
Nikolaj GeisleandGitHub 8ccc2faee0 Add UsePagedSqlQuery setting to NucacheSettings (#14806)
* imlement UsePagedSqlQuery

* Remove unneccesary spacing
2023-09-14 20:11:08 +02:00
Jacob Overgaard 0a4cc27a5d V12: Property editors should only contain layout when in preview mode (#14796)
* Revert "Make sure the property editor layout is contained within its container (prevent Z-index bleed-through) (#13583)"

This reverts commit 8463d906a7.

* remove seemingly unused attribute readonly

* contain everything with contain:layout

this is set if the property editor is in preview mode to make sure all overlays work

* Revert "remove seemingly unused attribute readonly"

This reverts commit 7a2743e8f6.
2023-09-14 13:19:36 +02:00
c8e054baa2 V10/feature/pipeline test filters (#14766)
* Add configuration/code to not run certain tests based on variables/release builds

* Applied longrunning testAttribute to the worst offenders (>200ms on my machine)

* Fix yaml notation

* split up windows/non windows test runs

* Added supression for moved tests

* Fix yaml validation issues

* Change yaml string parameter null value to empty string

* Convert empty strings to whitespace strings

* Rename and cleanup some paramater to better reflect why we use them

* Nightly build test

* Change nightly build authentication type

* template paramater fix

* Update nightly pipeline name

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-09-12 14:16:27 +02:00
Bjarke Berg 95ffdae475 Merge remote-tracking branch 'origin/v10/dev' into v10/dev 2023-09-12 09:43:52 +02:00
Andreas ZerbstandJacob Overgaard ca8ac21f4b Added test for checking if settings model contains default value (#14513)
* Added test for checking if a settings model contains default value.
Fixed tests

* Bumped version

* Moved createSliderWithDefaultValue function to our testHelpers. Removed the use of count in test since there was only one
2023-09-11 15:13:08 +02:00
Jacob Overgaard f85a0d1715 Render all tabs in the background to ensure they register their initial state on any $scope.model in the stack. (#14493)
Sometimes a tab, e.g. a "block list settings model" might register some default values, but if the user never clicks on the tab then they are not registered due to how AngularJS renders views with "ng-if".
2023-09-11 15:12:48 +02:00
Andreas ZerbstandGitHub 2fc29e638c Limbo models builder changes the content to element when using Compositions (#14776) 2023-09-07 17:18:57 +02:00
Andreas ZerbstandGitHub 56486b1ace V10 Cherrypicked issuu RTE embed (#14777)
* Added a UserAgent to header

* Added the use of iframe. This allows us to see the issuu embed in the RTE
2023-09-07 16:28:11 +02:00
Bjarke Berg fd043f6ecf Merge remote-tracking branch 'origin/v10/dev' into release/10.7 2023-09-05 10:19:13 +02:00
Bjarke Berg 39a102ed8a rollback version 2023-09-05 10:14:21 +02:00
f750bca453 V10/bugfix/14543 publish descendants (#14763)
* WIP: Fix publish descendants and related notifications

* Removed related entitities from publish notification

* Fixed root not being saved when publishingWithDescendants

* Updated integrationtests to reflect the update view on when to save the root when its part of a branch

* PR formatting fix

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* PR Cleanup

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Spicing up the codebase with some PR pattern matching

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2023-09-05 10:14:06 +02:00
Bjarke Berg 7e36203f60 Merge remote-tracking branch 'origin/release/10.7' into v10/dev
# Conflicts:
#	version.json
2023-09-04 10:24:22 +02:00
Bjarke Berg 334dff8645 bump version number 2023-09-04 10:23:44 +02:00
Bjarke Berg 9fd140f81d Merge remote-tracking branch 'origin/release/10.7' into v10/dev 2023-08-28 11:35:41 +02:00
Bjarke BergandGitHub 1198c76d67 Remove parsing of short into integer (#14721) 2023-08-25 13:07:42 +02:00
Nikolaj 869b480dae Bump version 2023-08-24 10:49:50 +02:00
Nikolaj 12704b112e Merge branch 'release/10.7' into v10/dev 2023-08-24 10:49:11 +02:00
Ronald BarendseandNikolaj 3c37653012 Fix exceptions in Slider and Tags property value converters (#13782)
* Fix IndexOutOfRangeException when converting single value to range in SliderValueConverter

* Fix NullReferenceException while deserializing empty value in TagsValueConverter

* Use invariant decimal parsing

* Handle converting from slider to single value

* Fix parsing range as single value

* Make Handle methods autonomous

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2023-08-23 10:50:25 +02:00
e5a8d01004 Fix exceptions in Slider and Tags property value converters (#13782)
* Fix IndexOutOfRangeException when converting single value to range in SliderValueConverter

* Fix NullReferenceException while deserializing empty value in TagsValueConverter

* Use invariant decimal parsing

* Handle converting from slider to single value

* Fix parsing range as single value

* Make Handle methods autonomous

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2023-08-23 10:09:43 +02:00
Andy ButlandandBjarke Berg 9fd0b1986c Updated JSON schema reference for Umbraco Forms. (#14701) 2023-08-22 13:30:26 +02:00
Andy ButlandandGitHub 80ea5174c6 Updated JSON schema reference for Umbraco Forms. (#14701) 2023-08-22 13:28:01 +02:00
Niels Lyngsøandkjac e1b4aebb0f directly render labels without angularJS template code (#14700) 2023-08-22 11:35:38 +02:00
Niels LyngsøandGitHub 38910a8d5c directly render labels without angularJS template code (#14700) 2023-08-22 11:27:16 +02:00
Kenn JacobsenandGitHub 0dc18982ee Do not allow content type property aliases that conflict with IPublishedElement (#14683) 2023-08-21 13:17:15 +02:00
311d322129 Add code infrastructure to validate file content (#14657)
* Implemented modular architecture for filestream security sanitization with an svg-html example

* 31440: Refactoring, applied to more entry points and removed test analyzer

* 31440 Added Unittests for FileStreamSecurityValidator

* PR fixes and better unittest mock names

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-08-21 13:08:26 +02:00
Andreas ZerbstandGitHub e7af98027d Updated the name of our Acceptance test project in the pipeline (#14691)
* Updated the name of our Acceptance test project.

The reason is because we want the naming to be clear and concise.

* Changed the name of the e2e pipeline project name for linux

* Updated dll file
2023-08-18 13:36:54 +03:00
Anders ReusandBjarke Berg 30f0cfc15d Add exclusion filter setting to typefinder settings (#14426)
* Obsolete constructor with deprecated IScopeProvider

* Add exclusion setting to typefinder settings

* The old TypeFinder constructor calls the new constructor now instead and excluded duplicates by using Union instead of Concat.

* Revert "The old TypeFinder constructor calls the new constructor now instead and excluded duplicates by using Union instead of Concat."

This reverts commit 87801c6c1c.

* Add changes to TypeFinder

* Do not use null when type is not nullable

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2023-08-15 09:58:58 +02:00
Ronald BarendseandBjarke Berg b743e715d4 Add DynamicRequestCultureProviderBase and improve locking (#14064) 2023-08-10 11:16:23 +02:00
d3243f8700 Bugfix 31584 - Remove Lazy "caching" that retains keys of deleted ContentTypes which causes unecesary validation errors (#14643)
The validation errors should not happen as the model mapping cleans up block data for entity types that do not longer exist (which is checked on the aformentioned key)

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-08-09 13:11:44 +02:00
264e4f8b57 Add config so it is configurable whether to explicitly index each nested property (#14648)
* Added new configuration "Umbraco:CMS:Examine:ExplicitlyIndexEachNestedProperty" that can be used to avoid nested properties like block grid to index each property individually.

* Moved the setting "Umbraco:CMS:Examine:ExplicitlyIndexEachNestedProperty" to "Umbraco:CMS:Indexing:ExplicitlyIndexEachNestedProperty" to make it more future proof

* Added missing registration

* Fixed registration

* Small readability improvement

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-08-09 11:47:45 +02:00
Sven Geusens 2b3f048db7 Revert "Implemented modular architecture for filestream security sanitization with an svg-html example"
This reverts commit 18ee016ae9.
2023-08-08 16:26:59 +02:00
Sven Geusens 18ee016ae9 Implemented modular architecture for filestream security sanitization with an svg-html example 2023-08-08 14:49:18 +02:00
Bjarke BergandGitHub 512199c8ab Pass the existing notification state to the ContentUnpublishingNotification so it can be shared. (#14638) 2023-08-08 09:40:44 +02:00
Bjarke BergandGitHub 4e410a9dd5 Stop event propagation when clicking on the expand-arrow in the tree. (#14637) 2023-08-08 09:27:23 +02:00
Jacob OvergaardandNiels Lyngsø e16e36c68f V12: Remove avatar step from login (#14629)
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
2023-08-07 11:02:53 +02:00
Bjarke Berg f384e0c30c Allow newlines in invite email and escape other html (#14618) 2023-08-02 14:17:39 +02:00
Bjarke Berg 04b74dddd0 Added missing async awaits in notifications that ensures objects are not disposed too early
Fixes https://github.com/umbraco/Umbraco-CMS/issues/14574
2023-08-02 11:37:39 +02:00
Kenn JacobsenandGitHub 43700d2bcb Ensure that the Slider does not crash the back-office (#14601)
* Ensure that the Slider does not crash the back-office

* Add field descriptions to config
2023-07-25 08:39:59 +02:00
Adrian CojocariuandGitHub eed9feb5f3 Fix method invoke. (#14597) 2023-07-24 15:18:23 +02:00
b2a5ce3e48 V10: Dropzone should handle internal and external errors when uploading (#14578)
* fix: mark files that result in error as processed

* fix: for safety measure check that a file is truthy before trying to upload it

* fix: push an error when file.$error is encountered to make sure it does not get uploaded

* fix: remove header from error messages since it is not being used anyway

* fix: check for maxFileSize before uploading pasted images in tinymce

* use stored blob variable

* feat: add property to fileManager to get and format the maxFileSize

* fix: make tinymce use fileManager to get maxFileSize

* fix(image cropper): check for maxFileSize before setting file to upload

* multiply by 1000 to get bytes

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2023-07-24 10:17:21 +02:00
Andy ButlandandGitHub 0ae404ce03 Extends JSON schema/Intellisense to full details of InstallDefaultData settings. (#14568)
* Fixes an incorrect property name used for generating JSON schema.

* Added JSON schema/intellisense for default data dictionary keys.

* Renamed private variable to match setting name.
2023-07-20 13:51:05 +02:00
ab836d2326 V10: Find and persist embedded images in rich text (#14546)
* add method to find and persist embedded base64 (data-uri) images in a html string

* use method to find embedded images in the Umbraco.TinyMce and Umbraco.Grid property editors

* rename method to better reflect what it does

* set allowed upload file types for integration tests

* add test for embedded images in Umbraco.TinyMce

* let old ctor call new ctor

* Apply suggestions from code review

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* apply pattern matching

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2023-07-18 09:17:19 +02:00
Andy ButlandandGitHub c12cce6d8c Fixes an incorrect property name used for generating JSON schema. (#14542) 2023-07-14 09:27:02 +02:00
nikolajlauridsen 78e1da3231 Merge branch 'release/10.6' into v10/dev 2023-07-13 10:55:36 +02:00
82eae48d09 Merge pull request from GHSA-h8wc-r4jh-mg7m
* Don't login after install

* Fail the install if database is not created

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Nikolaj <nikolajlauridsen@protonmail.ch>
2023-07-13 06:03:39 +02:00
Elitsa MarinovskaandGitHub a5ba32bfd7 Store tags as text (instead of nvarchar) (#14510)
* Migrate tags from NVarchar To NText

* Cleanup
2023-07-07 14:23:32 +02:00
Bjarke Berg c695f2192f Merge remote-tracking branch 'origin/release/10.6' into v10/dev
# Conflicts:
#	version.json
2023-07-07 08:27:51 +02:00
Zeegaan dc5c7a14a5 Bump version 2023-07-06 10:40:50 +02:00
Zeegaan c751e90928 Merge branch 'release/10.6' into v10/dev
# Conflicts:
#	version.json
2023-07-06 09:20:47 +02:00
Zeegaan d86e4b2d38 Bumb version 2023-07-05 10:46:14 +02:00
MaartenandSebastiaan Janssen 3f196a9de4 Fix broken CookieAuthenticationRedirect caused by PR #14036 for non-api requests (#14399)
* Fix broken CookieAuthenticationRedirect caused by PR #14036 when not in an API controller

* Added Integration Tests for the MemberAuthorizationFilter

* Fix merge conflict

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
(cherry picked from commit 1d239a30ca)
2023-07-04 11:10:58 +02:00
Nikolaj Brask-NielsenandSebastiaan Janssen 30ec9d9bc7 fix: Allows copying from unsaved content (#14464)
#14459

(cherry picked from commit 1d14158d82)
2023-07-04 11:08:39 +02:00
Anders BjernerandSebastiaan Janssen 3087fc3ba9 Added missing Danish translation for general_change (#14461)
* Added missing Danish translation for `general_change`

* Update en_us.xml

(cherry picked from commit a090997aa1)
2023-07-04 11:07:21 +02:00
christophnzandSebastiaan Janssen 7fd7a8715d Fixed typo "optinal" to "optional" for translation dictionary import dialog and 2 other occurrences
(cherry picked from commit 77a2e4b557)
2023-07-04 10:42:56 +02:00
Bjarne FyrstenborgandSebastiaan Janssen 62fd860a9e Show SVG icons for toolbar in configuration of richtext editor (#14404)
* Load default icons to show them next to checkboxes in configuration of richtext editor

* More mapping of icons

* Fix vertical align items centered not reflected

* Wrap mapping in function

* Map a few more icons

* Cleanup and formatting

* Cleanup

* Cleanup

* Add period in description

(cherry picked from commit 583965cf9d)
2023-07-04 10:41:40 +02:00
Mads Mørch SchouandSebastiaan Janssen 76ad99beb0 Makes sure the nucache is not truncated when its null (#14395)
* Makes sure the nucache is not truncated when its null
* Removed parentheses

(cherry picked from commit 0a4a938b88)
2023-07-04 10:36:57 +02:00
Jason ElkinandSebastiaan Janssen ebe375d23b Add ContentDeletingNotification to EmptyRecycleBin (#14397)
* Add ContentDeletingNotification to EmptyRecycleBin

* Fix formatting.

(cherry picked from commit 118f914158)
2023-07-04 10:35:08 +02:00
Marco TeodoroandSebastiaan Janssen 2f35967bb2 fix: #12253 Anchor picker does not appear (#13492)
* fix: #12253 Anchor picker does not appear

* Update ContentServiceExtensions.cs

fix: #12253  #13492 ; implement PR suggestions, test the new changes to confirm that they fix the issue with the anchorlink implementation on RTE from blocklist, blockgrid and normal RTE properties
Co-Authored-By: Laura Neto <12862535+lauraneto@users.noreply.github.com>

* Removed unnecessary using and code

* Small adjustments

---------

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
(cherry picked from commit 1ba834a9ca)
2023-07-04 10:33:05 +02:00
Paul SealandSebastiaan Janssen f93f3d88da Fix/delete language error message 14333 (#14396)
* Update the tour text to the correct text and to save confusion

* Added extra information to the delete language warning to inform the user that it will also delete all content related to the language

* Updated language files with same message re deletion

---------

Co-authored-by: Paul Seal <p.seal@clerkswell.com>
Co-authored-by: Emma Garland <emma.garland@rocksolidknowledge.com>
(cherry picked from commit 542d0f7f74)
2023-07-04 10:06:26 +02:00
Bjarne FyrstenborgandSebastiaan Janssen dbd009ffcd Update label in Danish translation
(cherry picked from commit 575f00d6f0)
2023-07-04 10:05:17 +02:00
alevak09andSebastiaan Janssen b99e14e288 Add Croatian Language (#14379)
Croatian language translation of Umbraco backoffice and culture settings

(cherry picked from commit 9f4d3e5525)
2023-07-04 10:03:42 +02:00
Paul SealandSebastiaan Janssen b8415ed7f0 Update the tour text to the correct text and to save confusion
(cherry picked from commit 5073a26e7f)
2023-07-04 10:00:09 +02:00
Miguel PintoandSebastiaan Janssen 8f6370a480 Swapped the sortCreateDateAscending and sortCreateDateDescending translation values to match the intended behavior (#14315)
(cherry picked from commit 76cb85224e)
2023-07-04 09:53:46 +02:00
RussellandSebastiaan Janssen aa4a1b3498 Fix for User null from IP address "::1" has logged out (#14322)
(cherry picked from commit dd59ef17f5)
2023-07-04 09:51:59 +02:00
RussellandSebastiaan Janssen b716e98780 Change "Media Picker" in RTE to "Image Picker" (#14321)
(cherry picked from commit 0220621337)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
2023-07-04 09:49:34 +02:00
Elitsa MarinovskaandGitHub e86fb0eeb6 Adding null check and descriptive error (#14469) 2023-06-27 13:35:01 +02:00
Elitsa MarinovskaandGitHub fe1080dd64 Check the cases where there might be a custom image type, instead of an the default Umbraco image type (#14463) 2023-06-27 10:33:46 +02:00
Bjarke Berg 1133c4e7f2 Merge remote-tracking branch 'origin/release/10.6' into v10/dev 2023-06-27 09:06:17 +02:00
Jacob Overgaard f5b834974d package-lock.json sync 2023-06-26 14:28:59 +02:00
Nikolaj 75113a90fb Bump version 2023-06-22 09:18:57 +02:00
miguelcrpintoandZeegaan 7e573c70a3 Updated the IsoDateTimeConverter initialization in the JsonDateTimeFormatAttribute to set the Culture to InvariantCulture so that the custom DateTime format symbols ( date and time separators) are respected independent of the CurrentCulture being used. 2023-06-21 14:04:56 +02:00
dependabot[bot]andNikolaj 5c5de77965 Bump socket.io-parser from 4.2.1 to 4.2.4 in /src/Umbraco.Web.UI.Client
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.1 to 4.2.4.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.1...4.2.4)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-21 09:45:50 +02:00
dependabot[bot]andNikolaj 2f486610bb Bump fast-xml-parser and is-svg in /src/Umbraco.Web.UI.Client
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) and [is-svg](https://github.com/sindresorhus/is-svg). These dependencies needed to be updated together.

Updates `fast-xml-parser` from 3.20.3 to 4.2.4
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/commits)

Updates `is-svg` from 4.3.1 to 4.4.0
- [Release notes](https://github.com/sindresorhus/is-svg/releases)
- [Commits](https://github.com/sindresorhus/is-svg/compare/v4.3.1...v4.4.0)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
- dependency-name: is-svg
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-21 09:45:45 +02:00
Nikolaj d19a30768f Merge remote-tracking branch 'origin/v10/dev' into v10/dev 2023-06-21 09:20:26 +02:00
Nikolaj b451bb802b Revert "Case-insensitive tag names with SQLite provider (#14012)"
This reverts commit bb7752c483.
2023-06-21 08:45:54 +02:00
MoleandGitHub 785390efd7 Add Noop property indexer to multi url picker (#14416) 2023-06-20 12:14:35 +02:00
nikolajlauridsenandBjarke Berg 3b3e1cec40 Add Noop property indexer to multi url picker 2023-06-20 12:12:00 +02:00
Jacob OvergaardandGitHub 89d104e176 v10: Backoffice JS updates (#14406)
* update @umbraco-ui/uui to 1.3.0

* update ace editor to 1.22.1

* update diff to 5.1.0

* update autoprefixer to 10.4.14

* update underscore to 1.13.6

* update jQuery to 3.7.0

* fix pr-first-response workflow
2023-06-20 09:24:07 +02:00
Bjarne FyrstenborgandNikolaj 9a3e655645 Fix transparent background after upgrade of spectrum color picker (#14251) 2023-06-19 08:50:57 +02:00
Andy ButlandandGitHub 5f15b8abb1 Updated Forms and Deploy references in JSON schema project for Umbraco 10. (#14383) 2023-06-16 10:01:09 +02:00
Andreas ZerbstandGitHub 4df3e19af7 Added a mapper for the IPropertyType (#14373) 2023-06-12 11:18:57 +02:00
89d670372d Update security stamps on logout (#14362)
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-06-12 09:56:04 +02:00
Mole b5ab115318 Remove external login tokens before removing external logins (#14341) 2023-06-06 14:11:20 +02:00
407263d090 V10: Handle blob images (#14317)
* Handle blob images

* remove dots from mapping

* Revert bad formatting

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-05-31 08:43:14 +02:00
b37bb517ab V10: Implement varying blocklist indexing (#14287)
* Implement available culture in Interface and base classes

* Add available cultures

* DI localizationService and use it

* Make the new method have default implementation to avoid breaking change

* Create implementations for old method

* Pass available cultures

* Pass localization service

* Create new method that takes available cultures

* Add ILocalizationService to DI

* implement missing method

* Add database for schema test

* Fixed issue with indexes not added correctly to nested types..

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2023-05-25 08:36:42 +02:00
MoleandGitHub 999a83995e V10: Add external login provider count to detailed telemetry (#14282)
* Add backoffice external login provider count to telemetry

* Update translation

* Fix integration test
2023-05-24 11:48:56 +02:00
Kenn Jacobsenandnikolajlauridsen b3a93ac86c Ensure that blocks always open automatically when added to block list or block grid (#14294) 2023-05-24 10:23:40 +02:00
Andy ButlandandGitHub e79246368b Update JSON schema package references for Forms and Deploy. (#14285) 2023-05-23 09:38:01 +02:00
Sebastiaan Janssen b67c7fbe77 Cherry pick b8d6613bd8 accidentally kept both lines instead of just the one, this fixes the problem. 2023-05-22 15:15:19 +02:00
Dhanesh Kumar MjandSebastiaan Janssen 16f448a802 [Fix] Block editor labels showing Angular JS on first load. (#14143)
Co-authored-by: Dhanesh Kumar <“dhanesh.kumar@phases.io”>
(cherry picked from commit 58695b6e9f)
2023-05-19 11:25:15 +02:00
b3bedb4efe XPath can unambiguously use $site/$parent (#14127)
* XPath can unambiguously use $site/$parent

* add deprecation notices and obsolete methods

* Update deprecation description text/instruction

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>

* Small spelling fix on deprecation description

* keep depr. getByQuery and handle legacy usage

---------

Co-authored-by: Kalle Macklin <karlmacklin@users.noreply.github.co>
Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
2023-05-15 08:48:36 +02:00
Andreas ZerbstandGitHub 5b73fc19ee V10: Fix NoopPublishedValuefallback varation context member not implemented (#14227)
* Added missing VariationContextAccessor

* Fixed identation
2023-05-10 14:31:40 +02:00
4cdab08910 Fixes #14102 - NestedPropertyIndexValueFactoryBase ignores compositions (#14115) (#14219)
Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>
2023-05-09 09:49:04 +02:00
MoleandGitHub 391cade75f Merge pull request #14205 from umbraco/v10/bugfix/fix_acceptance_test
Fix acceptance test
2023-05-04 10:24:24 +02:00
Anders BrohusandSebastiaan Janssen e27e8d1189 Fixing danish typos (#14184)
* Fixed typo

* Fixed another typo

* Removed space from translation

(cherry picked from commit 7df5c9c212)
2023-05-04 10:13:51 +02:00
MichałandSebastiaan Janssen 1e0ace7a34 Save and preview translation.
(cherry picked from commit 0765a2ebbb)
2023-05-04 10:10:56 +02:00
Nikolaj 21c6828b59 Use regex for class 2023-05-04 09:32:32 +02:00
Nikolaj f7f361239c Try quick fix for test 2023-05-04 09:32:27 +02:00
Nikolaj 05908e2c78 Remove test.only 2023-05-04 09:32:18 +02:00
Jacob Overgaard 3a7ba530a2 Fix: Form elements in thirdparty dashboard views get removed (#14152) 2023-05-03 11:07:33 +02:00
Jacob Overgaard f4073c1dc7 update @umbraco-ui/uui to 1.2.1 2023-05-03 11:07:10 +02:00
Niels LyngsøandJacob Overgaard 7b5233803e fix situation when config was not available. (#14148) 2023-05-03 08:42:19 +02:00
Jacob OvergaardandGitHub 822febb8e8 update @umbraco-ui/uui to 1.2.1 (#14186) 2023-05-03 08:07:04 +02:00
MoleandGitHub bf7b9a20a8 Set culture variation when getting property types for indexing (#14167) 2023-04-26 14:51:55 +02:00
Elitsa MarinovskaandGitHub 9aadb41f4a Change state to publishing before handling ContentSavingNotification (#14114) 2023-04-25 15:08:15 +02:00
Mark DrakeandSebastiaan Janssen aaec419672 Edge Cases for Issue #13838: Hotkey Actions Triggered from Web Components (#14098)
(cherry picked from commit 1436fe4e15)
2023-04-21 14:13:02 +02:00
Dhanesh Kumar MjandSebastiaan Janssen 66b1add0d0 Save and Preview blank on second use #14052 (#14094)
(cherry picked from commit 00eab03d50)
2023-04-21 11:31:47 +02:00
Søren KottalandSebastiaan Janssen 81c6a1b8e6 Adds padding to the icon in btn-social (#14080)
(cherry picked from commit c4cf5f910d)
2023-04-18 16:30:40 +02:00
Nikolaj GeisleandSebastiaan Janssen 747f2e7599 V11: Fix decimal variants (#13741)
* fix sqlite with variants

* Create and register SqlSpecificMapper

* Delete obsolete file

* Add back inheritance

Co-authored-by: Zeegaan <nge@umbraco.dk>
(cherry picked from commit c868c60ed2)
2023-04-18 15:22:39 +02:00
Markus JohanssonandSebastiaan Janssen f9aaf1984a #14016 Fixed, added cache buster to Block Grid Editor stylesheets
(cherry picked from commit 80f6bb404a)
2023-04-18 14:48:08 +02:00
Mark DrakeandSebastiaan Janssen 539640f995 resolve spacing issues with block list inline editor when it is the last property editor on the current tab
(cherry picked from commit 9a638b6edc)
2023-04-18 14:46:56 +02:00
Dhanesh KumarandSebastiaan Janssen 07a45d02f9 fix for the char limit(512) for textboxdatatype
(cherry picked from commit 2c580e8d4f)
2023-04-18 14:45:31 +02:00
Lewis HazellandSebastiaan Janssen bb7752c483 Case-insensitive tag names with SQLite provider (#14012)
* Ensure case insensitivity in tag name queries.

Use LIKE instead of = to ignore collation rules.

* Add integration test for creating tag relations with mixed casing.

(cherry picked from commit 37d737f9bc)
2023-04-18 14:41:06 +02:00
Lucas Bach BisgaardandSebastiaan Janssen d1975ee2cf Fix bug, in multiurlpicker where you cannot deselect a selected entity.
(cherry picked from commit 3385947c4e)
2023-04-18 14:40:10 +02:00
Bjarne FyrstenborgandSebastiaan Janssen 4d13345b14 Support readonly set via SendingContentNotification (#13557)
* Support readonly set via SendingContentNotification

* Apply changes to second umb-property-editor as well

* Remove check on property.supportsReadOnly

* Disable allow unlock

* Add check on property.readonly

* Small adjustment in the order of preview checks

---------

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
(cherry picked from commit e30587f90d)
2023-04-18 14:37:23 +02:00
Andreas ZerbstandGitHub 02e16992b4 V10/qa/added more acceptance tests (#14100)
* Imported BlockGrid tests from v11

* Updated existing tests

* Updated version of playwright, our models builders and testhelpers

* More imported tests

* Updated flaky tests
2023-04-18 08:13:01 +02:00
Nikolaj 5d3546e1b5 Bump version 2023-04-13 08:53:47 +02:00
Nikolaj 5828080589 Merge branch 'release/10.5' into v10/dev 2023-04-13 08:47:41 +02:00
Nikolaj 8e32ac3e20 Bump to non-rc 2023-04-12 09:35:23 +02:00
Elitsa MarinovskaandGitHub 22328598db Adding dedicated Forbidden and Unauthorized handling for members (#14036) 2023-04-11 15:41:55 +02:00
ce47281c04 Determine correct if we can create a database with current connectionstring (#14030)
* Fix CanForceCreateDatabase method and add some unit tests

* Fixed an old copy/paste error

* A little nitpicking over wording and formatting

---------

Co-authored-by: kjac <kja@umbraco.dk>
2023-03-31 11:44:56 +02:00
BatJanandSebastiaan Janssen 83ad463e81 Change style to class
(cherry picked from commit 69010baceb)
2023-03-28 12:56:22 +02:00
Matthew CareandSebastiaan Janssen 06f527e87b Fix pressing enter in a property editor name field (#13329)
Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
(cherry picked from commit 7349ae1c5c)
2023-03-28 12:55:50 +02:00
Sebastiaan Janssen 6bc999bca4 Unit tests need updating now that the WriterId is properly being set after merging #12843
(cherry picked from commit a88d0c0ec9)
2023-03-28 10:28:33 +02:00
patrickdemooij9andSebastiaan Janssen 5f8ba2e864 Memory improvements to ShortStringHelper (#13089)
(cherry picked from commit b17d9004fd)
2023-03-28 10:19:43 +02:00
patrickdemooij9andSebastiaan Janssen eee6207f19 Performance improvement for ReplaceFirst function (#13018)
* Some benchmarks for replacefirst & span method

(cherry picked from commit e550a4ce3a)
2023-03-28 10:14:42 +02:00
LandLogic ITandSebastiaan Janssen 888173ac5b Add it key translation
(cherry picked from commit 99268f6211)
2023-03-28 10:11:57 +02:00
DennisandSebastiaan Janssen 7208f591c7 Fix equality check on property group (#13133)
* Fix equality check on property group

Also fix circular reference on PropertyTypeCollection

(cherry picked from commit f64f634979)
2023-03-28 10:08:48 +02:00
gadgetfbiandSebastiaan Janssen 391bfb73e8 Fixes: listitem: <li> elements must be contained in a <ul> or <ol> (#13120)
Co-authored-by: Rob Nicolson <rob.nicolson@brightwire.net>
(cherry picked from commit 1f6307944b)
2023-03-28 09:38:51 +02:00
Matthew CareandSebastiaan Janssen 9f2e79e9db Prevent overflowing property values (#12943)
(cherry picked from commit b34a93ed59)
2023-03-27 12:49:20 +02:00
Ealse BoumaandSebastiaan Janssen 40285b76b9 Fix: Infinite Editor creates each save action a new version when content is invalid (#12713)
(cherry picked from commit 93a85a46f3)
2023-03-27 11:30:53 +02:00
Patrick de MooijandSebastiaan Janssen aab6539d1f 12748: Make sure to set writerId
(cherry picked from commit 3ee9bfbc93)
2023-03-27 09:57:51 +02:00
Nikolaj 5598cc2491 Convert path to absolute 2023-03-23 09:21:07 +01:00
Andy ButlandandNikolaj b665099657 Updated reference for JSON schema to latest release of Forms 10. (#13996) 2023-03-23 09:14:23 +01:00
Andy ButlandandGitHub 010f722fa0 Updated reference for JSON schema to latest release of Forms 10. (#13996) 2023-03-23 08:59:28 +01:00
NuklonandSebastiaan Janssen 4f8b8b3415 Fixes #13732 - IsBackOfficeRequest is extremely inefficient (#13743)
* Update UmbracoRequestPaths.cs

* Update UmbracoRequestPaths.cs

* remove redundant check

---------

Co-authored-by: Michael <michael@crossingpaths.be>
(cherry picked from commit de27eb697e)

# Conflicts:
#	src/Umbraco.Core/Routing/UmbracoRequestPaths.cs
2023-03-21 08:24:13 +01:00
jesperweberandSebastiaan Janssen b1fd9e6f16 Added sort audit to nodes actually being sorted
(cherry picked from commit 36069aa813)
2023-03-20 16:23:12 +01:00
Joel MandellandSebastiaan Janssen d31bd8755e Fixing issue #13865 (i.e. Rich text link picker not resolving correct variant when using .ValueFor()). (#13889)
(cherry picked from commit 451d1cec6a)
2023-03-20 15:59:08 +01:00
Dhanesh Kumar MjandSebastiaan Janssen 6b208362cc [fix] Infinite Editor from member property with a media picker (#13817)
(cherry picked from commit 71e7836001)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
2023-03-17 12:24:39 +01:00
Lennard FonteijnandSebastiaan Janssen 9d1140165e Fixed issue where filtering allowed element types with a NotificationHandler causes issues with Block Grid areas
(cherry picked from commit e10ff16fa1)
2023-03-17 08:52:46 +01:00
Matt BegentandSebastiaan Janssen f70533e3a0 Add skip links to header (#13938)
* Add skip links to header

* Tweak skip link z-index

(cherry picked from commit f6ebcdcfb6)
2023-03-17 08:51:41 +01:00
Jason ElkinandSebastiaan Janssen 53c547fb61 Use correct listenAddress for Karma on node 18+
(cherry picked from commit 50c4f8c6b5)
2023-03-17 08:50:31 +01:00
Erik-Jan WestendorpandSebastiaan Janssen 82c21da5b7 Add Romanian language (#13965)
(cherry picked from commit 11b20cc6cc)
2023-03-17 08:49:35 +01:00
Karn BlackmoreandSebastiaan Janssen 2d32f46d80 Fix algiment issues by setting the editor to position fix.
(cherry picked from commit daf54468b1)
2023-03-17 08:48:56 +01:00
kiasynandSebastiaan Janssen e9d17d3b9f Fix ViewContext.FormContext not being set during BeginUmbracoForm (#13914)
* Fix ViewContext.FormContext not being set during BeginUmbracoForm

Client validation is broken without this if there are multiple forms with the same field names on a page.

* Tweaked comment

(cherry picked from commit 62b49c7ea7)
2023-03-17 08:47:48 +01:00
ChadandSebastiaan Janssen 7c77fd1ca9 Faster cache key generation (#13504)
* Reduce the number of string concatenations required to generate cache keys.
* Updated to match existing Nucache keys.

---------

(cherry picked from commit 7c30da9fbf)
2023-03-17 08:46:29 +01:00
Joe GlombekandSebastiaan Janssen d4970ed752 Add checkered background to file upload
(including SVGs added to the media library)

(cherry picked from commit 066276a532)
2023-03-17 08:44:47 +01:00
AaronandSebastiaan Janssen 66c786a42d Changed to cast double to long (#13935)
(cherry picked from commit ca515c3ed7)
2023-03-17 08:43:27 +01:00
Sean ThorneandSebastiaan Janssen e6c0826d39 update block label not assigning fixes: #13833 (#13937)
Co-authored-by: Sean Thorne <sean.thorne@truedigital.co.uk>
Co-authored-by: georgebid <91198628+georgebid@users.noreply.github.com>
(cherry picked from commit 64bd310037)
2023-03-17 08:42:13 +01:00
AaronandSebastiaan Janssen 8a3cf2731e Solves tooltip issue for block column editor on remove block column editor option
(cherry picked from commit 393845ce4d)
2023-03-17 08:40:16 +01:00
Paul SealandSebastiaan Janssen b8d6613bd8 Fix the reference to the .targets file (#13847)
Updates the reference to the .targets file to use the correct folder name of `buildTransitive` instead of `build`

(cherry picked from commit d8f204ddf9)
2023-03-17 08:38:04 +01:00
ChadandSebastiaan Janssen 12414013d5 Faster full nucache table rebuild (#13501)
* SQL Server Truncate when full nucache SQL rebuild.

* Optimize truncate for SQL Lite

* Remove comment.

* Use current DB Types

* I added a couple of formatting changes.

---------

Co-authored-by: georgebid <91198628+georgebid@users.noreply.github.com>
(cherry picked from commit be72c8147d)
2023-03-17 08:37:05 +01:00
CyberReiterandSebastiaan Janssen 5fcbd4e4cd Fall back to object if PublishedPropertyType modelType is null (#13553)
* add null check

* return object when type is null

(cherry picked from commit 0cfc1fb664)
2023-03-17 08:36:05 +01:00
CyberReiterandSebastiaan Janssen 6b309dc3be Fix install when adding custom default languages (#13904)
* Adding ids to language installation

---------

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
(cherry picked from commit 30abbb0c5d)
2023-03-17 08:35:12 +01:00
Miska HusgafvelandSebastiaan Janssen 458688aed6 Ensure cropperHelper.pixelsToCoordinates returns valid coordinates
(cherry picked from commit 282b7ac3d5)
2023-03-17 08:31:40 +01:00
Erik-Jan WestendorpandSebastiaan Janssen a56a6bae31 Map BackOfficeNotification in ContentMapDefinitions (#13874)
* Map Notifications

* Empty line

(cherry picked from commit 5158d8119d)
2023-03-17 08:29:20 +01:00
Erik-Jan WestendorpandSebastiaan Janssen 010ea5a2aa IsNullOrWhiteSpace Extension method for HtmlEncodedString (#13747)
* Add IsNullOrWhiteSpace Extension method

IsNullOrWhiteSpace extension method for IHtmlEncodedString

* Move extension method

* Add a UnitTest for the IsNullOrWhiteSpace extension method

* Update unit test

(cherry picked from commit 9771e77243)
2023-03-17 08:21:21 +01:00
Menno MoutandSebastiaan Janssen 84d81b20ef Added a CalculateMediaStartNodeIds method call when the startNode passed in as parameter is null. When this does return an array of startNodes the first one is being used. The question remains if this is desired behaviour. With this implementation the user has no real control over where the file is going to go. Atleast with this implementation the user can now see the file.
(cherry picked from commit ca23784898)
2023-03-17 08:19:57 +01:00
mwillebrandsandSebastiaan Janssen d148e93b45 Fix for #13860
Undefined error when inserting an empty link in the RTE editor

(cherry picked from commit 6ce30fb561)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
2023-03-17 08:06:49 +01:00
niekvanderreestandSebastiaan Janssen 0ce2fdb23b Change GetMinNonAlphaNumericChars() to return 1 (#13876)
(cherry picked from commit 27e38e1606)
2023-03-17 08:03:45 +01:00
Menno MoutandSebastiaan Janssen 273e7708e5 Listview batch publishing on multi language site, publishes all variants #13755 - Fix (#13772)
* Modified PostPublishById to handle content that is culture variant. Added model and modified the javascript function that call the api endpoint.

* Added separate method for publishing with cultures. Added if else statment to js function.

* Moved check for all cultures being published to the top of PostPublishByIdAndCulture. Added parameter to ngDoc. Added Where Query.

(cherry picked from commit 37db3ae3da)
2023-03-16 13:03:16 +01:00
Bjarne FyrstenborgandSebastiaan Janssen 154021801e Reset selected index/searcher (#13866)
(cherry picked from commit 62fdbd159c)
2023-03-16 12:49:39 +01:00
Smayke95andSebastiaan Janssen d418d06c02 Add Bosnian language (#13854)
* Add Bosnian language

* fix

* Fix issue with Marketplace

(cherry picked from commit 42d143c6b2)
2023-03-16 12:47:50 +01:00
Simone ChiarettaandSebastiaan Janssen c684b38247 Changed modifier for ContentPickerValueConverter (#13864)
Changed internal to public for ContentPickerValueConverter, which was the only property value converter defined as `internal`
Fixes issue umbraco#13858

(cherry picked from commit 362832b594)
2023-03-16 12:46:38 +01:00
tristanjthompsonandSebastiaan Janssen dca1c1b1be Update JITOptimizerValidator error message.
(cherry picked from commit e9f5b562ad)
2023-03-16 11:35:28 +01:00
Sebastiaan Janssen 86247b4578 Revert "Add DefaultLanguage fallback policy for published values (#13814)"
This reverts commit ef4c9c508d.
2023-03-16 11:32:35 +01:00
Ronald BarendseandSebastiaan Janssen ef4c9c508d Add DefaultLanguage fallback policy for published values (#13814)
* Add DefaultLanguage fallback

* Implement DefaultLanguage fallback

* Add DefaultLanguage fallback test

(cherry picked from commit 7348171c01)
2023-03-16 11:31:30 +01:00
Anders BrohusandSebastiaan Janssen f7ba2cfe96 2FA translations
Added and changed some translations about 2FA

(cherry picked from commit 559e56949f)
2023-03-16 11:21:15 +01:00
Dhanesh Kumar MjandSebastiaan Janssen 80a2839797 Mini-list view search by id,name & key is fixed. (#13735)
* Mini-list view search by id,name & key is fixed.
Added  multiple conditions in the query to consider id or name or key from the filter param(search bar from minilistview)

* make it more simple ,now using || instead of clause conditions.

---------

Co-authored-by: Dhanesh Kumar <dhanesh.kumar@phases.dk>
Co-authored-by: Michael <michael@crossingpaths.be>
(cherry picked from commit 2f5726384d)
2023-03-16 11:20:00 +01:00
Erik-Jan WestendorpandSebastiaan Janssen aacac4997d Remove special characters in avatar [part 2] (#13796)
* Update regex

* Update src/Umbraco.Web.UI.Client/src/common/directives/components/umbavatar.directive.js

Co-authored-by: Ronald Barendse <ronald@barend.se>

---------

Co-authored-by: Ronald Barendse <ronald@barend.se>
(cherry picked from commit 280fbdd870)

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/directives/components/umbavatar.directive.js
2023-03-16 11:17:02 +01:00
Jeroen BreuerandSebastiaan Janssen 815eb5b9c8 Make methods virtual so they can be redefined in derived classes.
(cherry picked from commit ff3d8c1c6c)
2023-03-16 11:06:19 +01:00
Ealse BoumaandSebastiaan Janssen 5966ad4a05 Changed default initialized button permissions for listviews
(cherry picked from commit 5c0673930a)
2023-03-16 11:01:45 +01:00
Warren BuckleyandSebastiaan Janssen 06b89963e4 Fixes #13715 Simple LogViewer queries not returning results (#13748)
* Fixes #13715 issue with simple logviewer searches

* Update Logviewer test - to ensure MessageLike and simple equivalent returns same result count to help catch

(cherry picked from commit d38fabea4a)
2023-03-16 10:57:52 +01:00
Marc GoodsonandSebastiaan Janssen caa4ca510e Add .woff2 to BrowsableFileExtensions
(cherry picked from commit 23b03f408e)
2023-03-16 10:53:44 +01:00
Sebastiaan Janssen 0ecb613b4a Revert "add the s html element to allow list for TinyMCE (#13697)"
This reverts commit 48ad91392f.
2023-03-16 10:45:47 +01:00
Jacob OvergaardandSebastiaan Janssen 48ad91392f add the s html element to allow list for TinyMCE (#13697)
Fixes #13637

(cherry picked from commit cfdc4a9573)

# Conflicts:
#	src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs
2023-03-16 10:43:47 +01:00
CyberReiterandSebastiaan Janssen 5e555c6129 Updating german translation (#13684)
* updating german translations

* translating missing sections

* added missing closing tag

Co-authored-by: Michael <michael@crossingpaths.be>
(cherry picked from commit 8fdb5a55ea)
2023-03-16 10:38:20 +01:00
Mike MaseyandSebastiaan Janssen 47078bcc70 fix: move list view selection options to after list in focus order
(cherry picked from commit 3ebd15b67e)
2023-03-16 10:37:11 +01:00
ustadstarandSebastiaan Janssen 0ba1254e7d Fix copy content with descendants not copying sort order (#13464)
(cherry picked from commit fd992f65bb)
2023-03-16 10:33:39 +01:00
Erik-Jan WestendorpandSebastiaan Janssen d0e34c38a0 Translate dictionary area
(cherry picked from commit 045c755ccf)
2023-03-16 10:11:58 +01:00
Mykola GorbatenkoandSebastiaan Janssen 6be8d2e885 added Ukrainian language
(cherry picked from commit b52a4363c4)
2023-03-16 10:08:54 +01:00
CyberReiterandSebastiaan Janssen bfd29dfc3b minor improvements to indexing performance
(cherry picked from commit b7a26360e5)
2023-03-16 09:19:41 +01:00
Robert FosterandSebastiaan Janssen 4b2af296be fix for #13623 by hiding Member Edit Action Menu on Infinite editing … (#13624)
* fix for #13623 by hiding Member Edit Action Menu on Infinite editing for consistency

* added missing attribute to umb-editor-header for Member editing

(cherry picked from commit e7a986b1c3)
2023-03-16 09:18:23 +01:00
MehmetandSebastiaan Janssen 17aa9cee51 Rename title marketplace to packages (#13625)
(cherry picked from commit 59c5226d68)
2023-03-16 09:14:21 +01:00
Mario LopezandSebastiaan Janssen f035b2bee2 fixes data-element attribute on media section (#13621)
* fixes data-element attribute on media section

* Revert "fixes data-element attribute on media section"

This reverts commit 2a35c9fbed.

* use property alias on members umb-property

Co-authored-by: Mario Lopez <mario@luminary.com>
(cherry picked from commit dc46b649f7)
2023-03-16 09:10:57 +01:00
Calvin DavisandSebastiaan Janssen 4d4b5b7007 Add margin-right to block card name and subname
(cherry picked from commit 4fbb0805e8)
2023-03-16 09:08:05 +01:00
Bjarne FyrstenborgandSebastiaan Janssen c04b11cf17 Only show rollback button if allowed action
(cherry picked from commit 05a511a16c)
2023-03-16 09:06:14 +01:00
Bjarke Berg 6404f2dae8 Merge remote-tracking branch 'origin/release/10.4.1' into v10/dev
# Conflicts:
#	version.json
2023-03-15 16:21:40 +01:00
Nikolaj 0c6632eeb4 Bump version 2023-03-14 14:25:02 +01:00
Bjarke Berg 4e3ac66865 Check the tmpimg path is in the expected folder 2023-03-14 08:27:17 +01:00
Bjarke BergandGitHub de6e9aeb31 Prioritise surface controller requests highest (#13919)
* Fixed issue mentioned in https://github.com/umbraco/Umbraco-CMS/issues/13836

Now surface controller requests always has higher priority than other. So if this is both a surface controller request and a virtual page request, it will execute the surface controller.

* Moved some login into private methods

* More clean up

* Clean up

* Only handle valid candidates
2023-03-08 13:43:35 +01:00
Nikolaj GeisleandGitHub a8a8a7fea5 Make Detailed telemetry the default (#13918) 2023-03-07 13:14:23 +01:00
MoleandGitHub 84e20e74d3 Don't replace hyphen and underscore with empty string (#13896)
Replace it with a space instead
2023-03-07 11:31:15 +01:00
Bjarke BergandNikolaj Geisle 220414114e Fallback to use ActivatorUtilities to create controller from type, if it is not registered in DI (#13910) 2023-03-07 11:24:44 +01:00
MoleandGitHub 2538f946fc Check explicitly for MaintenanceResult in published request filter (#13911)
LGTM 💪
2023-03-07 08:15:19 +01:00
Bjarke BergandGitHub eb07998cf2 Merge pull request #13900 from umbraco/v10/bugfix/12200
Add allowlist of media hosts.
2023-03-02 14:34:05 +01:00
Bjarke Berg 7119253e6f Add allowlist of media hosts. 2023-03-01 15:17:08 +01:00
9cfda6e05c new up settings so they are no longer null (#13879)
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-02-23 14:22:33 +01:00
555f6e2514 Add obsolete messages to no longer used properties (#13859)
Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-02-21 08:13:44 +01:00
Elitsa MarinovskaandGitHub cc76289a36 Fix mapping (#13844) 2023-02-17 09:38:39 +01:00
Andy ButlandandGitHub f9ed9c0ae8 Bumped dependencies on Forms and Deploy to latest releases in JSON schema project. (#13827) 2023-02-14 08:01:08 +01:00
d9f342bee7 Added missing property index value factories (#13819)
* Added missing PropertyIndexValueFactories, for Block Grid, Block List, Nested Content, Tags and added No-op for image picker, image cropper etc, where the content dont make any sense anyway.

Made it replace for block grid/list, nested content and tags

* Fixed tests

* Ensure raw-fields are the prefix

* Code clean up

* build fix

* Minor cleanup

* Fixed issue with published values / external index

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2023-02-13 14:47:26 +01:00
Kenn JacobsenandGitHub e529818560 Make the default lockout time configurable for users and members (#13808)
* Make the default lock timeout configurable for users and members

* Update obsoletion to V13
2023-02-10 10:56:55 +01:00
Kenn JacobsenandGitHub 45f8ffcd0b Support notifications for multiple root nodes (#13805) 2023-02-10 10:49:39 +01:00
Kenn JacobsenandGitHub 7d9e07ff7c Don't show DB details on install screen when using a pre-configured connection string (#13809) 2023-02-10 10:45:19 +01:00
b83c88e9f1 V10: fix content version cleanup dto migration (#13788)
* Add DoesPrimaryKeyExist method

* Add primary key name to dto

* Add extension method PrimaryKeyExists

* Dont use sql_master table

* Implement DoesPrimaryKeyExists

* Rename without plural s

* Refactor to get proper primary key name and not column name

* Use primary key name and not column name

* Dont filter tables in memory

* Remove .Where

* Don't select all, select only sql

* throw NotImplementedException by default

* USe virtual instead of abstract to avoid breaking change

* Reinstert primary key attribute

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-02-07 13:46:14 +01:00
491 changed files with 27383 additions and 5564 deletions
+2 -7
View File
@@ -11,15 +11,10 @@ jobs:
issues: write
pull-requests: write
steps:
- name: Install dependencies
run: |
npm install node-fetch@2
- name: Fetch random comment 🗣️ and add it to the PR
uses: actions/github-script@v6
with:
script: |
const fetch = require('node-fetch')
const response = await fetch('https://collaboratorsv2.euwest01.umbraco.io/umbraco/api/comments/PostComment', {
method: 'post',
body: JSON.stringify({
@@ -46,13 +41,13 @@ jobs:
});
} else {
console.log("Returned data not indicate success.");
if(response.status !== 200) {
console.log("Status code:", response.status)
}
console.log("Returned data:", data);
if(data === '') {
console.log("An empty response usually indicates that either no comment was found or the actor user was not eligible for getting an automated response (HQ users are not getting auto-responses).")
}
+1
View File
@@ -49,4 +49,5 @@
<PropertyGroup>
<GitVersionBaseDirectory>$(MSBuildThisFileDirectory)</GitVersionBaseDirectory>
</PropertyGroup>
</Project>
+104 -56
View File
@@ -21,9 +21,33 @@ parameters:
displayName: Upload API docs
type: boolean
default: false
- name: forceReleaseTestFilter
displayName: Force to use the release test filters
type: boolean
default: false
- name: integrationNonReleaseTestFilter
displayName: TestFilter used for non-release type builds
type: string
default: '--filter TestCategory!=LongRunning&TestCategory!=NonCritical'
- name: integrationReleaseTestFilter
displayName: TestFilter used for release type builds
type: string
default: ' '
- name: nonWindowsIntegrationNonReleaseTestFilter
displayName: TestFilter used for non-release type builds on non windows agents
type: string
default: '--filter TestCategory!=LongRunning&TestCategory!=NonCritical'
- name: nonWindowsIntegrationReleaseTestFilter
displayName: TestFilter used for release type builds on non windows agents
type: string
default: ' '
- name: isNightly
displayName: 'Is nightly build (used for MyGet feed)'
type: boolean
default: false
variables:
nodeVersion: 14.18.1
nodeVersion: 20
dotnetVersion: 6.x
dotnetIncludePreviewVersions: false
solution: umbraco.sln
@@ -49,6 +73,7 @@ stages:
steps:
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
inputs:
versionSpec: $(nodeVersion)
- task: Cache@2
@@ -61,9 +86,9 @@ stages:
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: src/Umbraco.Web.UI.Client
displayName: Run npm ci
displayName: Run npm ci (Backoffice)
- task: gulp@0
displayName: Run gulp build
displayName: Run gulp build (Backoffice)
inputs:
gulpFile: src/Umbraco.Web.UI.Client/gulpfile.js
targets: coreBuild
@@ -80,44 +105,12 @@ stages:
command: restore
projects: $(solution)
- task: DotNetCoreCLI@2
displayName: Run dotnet build
name: build
displayName: Run dotnet build and generate NuGet packages
inputs:
command: build
projects: $(solution)
arguments: '--configuration $(buildConfiguration) --no-restore -p:ContinuousIntegrationBuild=true'
- script: |
version="$(Build.BuildNumber)"
echo "varsion: $version"
major="$(echo $version | cut -d '.' -f 1)"
echo "major version: $major"
echo "##vso[task.setvariable variable=majorVersion;isOutput=true]$major"
displayName: Set major version
name: determineMajorVersion
- task: PowerShell@2
displayName: Prepare nupkg
inputs:
targetType: inline
script: |
$umbracoVersion = "$(Build.BuildNumber)" -replace "\+",".g"
$templatePaths = Get-ChildItem 'templates/**/.template.config/template.json'
foreach ($templatePath in $templatePaths) {
$a = Get-Content $templatePath -Raw | ConvertFrom-Json
if ($a.symbols -and $a.symbols.UmbracoVersion) {
$a.symbols.UmbracoVersion.defaultValue = $umbracoVersion
$a | ConvertTo-Json -Depth 32 | Set-Content $templatePath
}
}
dotnet pack $(solution) --configuration $(buildConfiguration) -p:BuildProjectReferences=false --output $(Build.ArtifactStagingDirectory)/nupkg
- script: |
sha="$(Build.SourceVersion)"
sha=${sha:0:7}
buildnumber="$(Build.BuildNumber)_$(Build.BuildId)_$sha"
echo "##vso[build.updatebuildnumber]$buildnumber"
displayName: Update build number
arguments: '--configuration $(buildConfiguration) --no-restore --property:ContinuousIntegrationBuild=true --property:GeneratePackageOnBuild=true --property:PackageOutputPath=$(Build.ArtifactStagingDirectory)/nupkg'
- task: PublishPipelineArtifact@1
displayName: Publish nupkg
inputs:
@@ -130,11 +123,11 @@ stages:
artifactName: build_output
- stage: Build_Docs
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.buildApiDocs}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.buildApiDocs}}))
displayName: Prepare API Documentation
dependsOn: Build
variables:
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['determineMajorVersion.majorVersion'] ]
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ]
jobs:
# C# API Reference
- job:
@@ -188,9 +181,10 @@ stages:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
displayName: Use Node.js 10.15.0
displayName: Use Node.js 10.15.x
retryCountOnTaskFailure: 3
inputs:
versionSpec: 10.15.0 # Won't work with higher versions
versionSpec: 10.15.x # Won't work with higher versions
- script: |
npm ci --no-fund --no-audit --prefer-offline
npx gulp docs
@@ -259,6 +253,8 @@ stages:
- stage: Integration
displayName: Integration Tests
dependsOn: Build
variables:
releaseTestFilter: eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True')
jobs:
# Integration Tests (SQLite)
- job:
@@ -286,12 +282,30 @@ stages:
performMultiLevelLookup: true
includePreviewVersions: $(dotnetIncludePreviewVersions)
- task: DotNetCoreCLI@2
displayName: Run dotnet test
displayName: Run dotnet test Windows
condition: eq(variables['Agent.OS'],'Windows_NT')
inputs:
command: test
projects: '**/*.Tests.Integration.csproj'
arguments: '--configuration $(buildConfiguration) --no-build'
testRunTitle: Integration Tests SQLite - $(Agent.OS)
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) ${{parameters.integrationNonReleaseTestFilter}}'
env:
Tests__Database__DatabaseType: 'Sqlite'
Umbraco__CMS__Global__MainDomLock: 'FileSystemMainDomLock'
- task: DotNetCoreCLI@2
displayName: Run dotnet test Non Windows
condition: ne(variables['Agent.OS'],'Windows_NT')
inputs:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQLite - $(Agent.OS)
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}'
env:
Tests__Database__DatabaseType: 'Sqlite'
Umbraco__CMS__Global__MainDomLock: 'FileSystemMainDomLock'
@@ -299,7 +313,7 @@ stages:
# Integration Tests (SQL Server)
- job:
timeoutInMinutes: 120
condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.sqlServerIntegrationTests}})
condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerIntegrationTests}})
displayName: Integration Tests (SQL Server)
strategy:
matrix:
@@ -310,7 +324,7 @@ stages:
Linux:
vmImage: 'ubuntu-latest'
testDb: SqlServer
connectionString: 'Server=localhost,1433;User Id=sa;Password=$(SA_PASSWORD);'
connectionString: 'Server=localhost,1433;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=true'
pool:
vmImage: $(vmImage)
variables:
@@ -321,6 +335,11 @@ stages:
inputs:
artifact: build_output
path: $(Build.SourcesDirectory)
- task: UseDotNet@2
displayName: Use .NET $(dotnetVersion)
inputs:
version: $(dotnetVersion)
includePreviewVersions: $(dotnetIncludePreviewVersions)
- powershell: sqllocaldb start mssqllocaldb
displayName: Start localdb (Windows only)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
@@ -328,12 +347,31 @@ stages:
displayName: Start SQL Server (Linux only)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
- task: DotNetCoreCLI@2
displayName: Run dotnet test
displayName: Run dotnet test Windows
condition: eq(variables['Agent.OS'],'Windows_NT')
inputs:
command: test
projects: '**/*.Tests.Integration.csproj'
arguments: '--configuration $(buildConfiguration) --no-build'
testRunTitle: Integration Tests SQL Server - $(Agent.OS)
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationNonReleaseTestFilter}}'
env:
Tests__Database__DatabaseType: $(testDb)
Tests__Database__SQLServerMasterConnectionString: $(connectionString)
Umbraco__CMS__Global__MainDomLock: 'SqlMainDomLock'
- task: DotNetCoreCLI@2
displayName: Run dotnet test NonWindows
condition: ne(variables['Agent.OS'],'Windows_NT')
inputs:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQL Server - $(Agent.OS)
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}'
env:
Tests__Database__DatabaseType: $(testDb)
Tests__Database__SQLServerMasterConnectionString: $(connectionString)
@@ -361,6 +399,7 @@ stages:
dockerImageName: umbraco-linux
Windows:
vmImage: 'windows-latest'
DOTNET_GENERATE_ASPNET_CERTIFICATE: true # Automatically generate HTTPS development certificate on Windows
# Enable console logging in Release mode
Serilog__WriteTo__0__Name: Async
Serilog__WriteTo__0__Args__configure__0__Name: Console
@@ -368,7 +407,7 @@ stages:
Umbraco__CMS__Unattended__InstallUnattended: true
Umbraco__CMS__Global__InstallMissingDatabase: true
UmbracoDatabaseServer: (LocalDB)\MSSQLLocalDB
UmbracoDatabaseName: Playwright
UmbracoDatabaseName: AcceptanceTestDB
ConnectionStrings__umbracoDbDSN: Server=$(UmbracoDatabaseServer);Database=$(UmbracoDatabaseName);Integrated Security=true;
# Custom Umbraco settings
Umbraco__CMS__Global__VersionCheckPeriod: 0
@@ -385,6 +424,7 @@ stages:
path: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/misc/nupkg
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
inputs:
versionSpec: $(nodeVersion)
- task: Cache@2
@@ -429,7 +469,7 @@ stages:
workingDirectory: tests/Umbraco.Tests.AcceptanceTest/misc
- pwsh: |
dotnet new --install ./nupkg/Umbraco.Templates.*.nupkg
dotnet new umbraco --name Playwright --no-restore --output .
dotnet new umbraco --name AcceptanceTestProject --no-restore --output .
dotnet restore --configfile ./nuget.config
dotnet build --configuration $(buildConfiguration) --no-restore
dotnet dev-certs https
@@ -450,6 +490,8 @@ stages:
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
env:
CI: true
CommitId: $(Build.SourceVersion)
AgentOs: $(Agent.OS)
- pwsh: |
docker logs $(dockerImageName) > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1
docker stop $(dockerImageName)
@@ -488,9 +530,11 @@ stages:
- Unit
- Integration
# - E2E # TODO: Enable when stable.
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.myGetDeploy}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.myGetDeploy}}))
jobs:
- job:
pool:
vmImage: "windows-latest" # NuGetCommand@2 is no longer supported on Ubuntu 24.04 so we'll use windows until an alternative is available.
displayName: Push to pre-release feed
steps:
- checkout: none
@@ -505,16 +549,20 @@ stages:
command: 'push'
packagesToPush: $(Build.ArtifactStagingDirectory)/**/*.nupkg
nuGetFeedType: 'external'
publishFeedCredentials: 'MyGet - Pre-releases'
${{ if eq(parameters.isNightly, true) }}:
publishFeedCredentials: 'MyGet - Umbraco Nightly'
${{ else }}:
publishFeedCredentials: 'MyGet - Pre-releases'
- stage: Deploy_NuGet
displayName: NuGet release
dependsOn:
- Deploy_MyGet
- Build_Docs
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.nuGetDeploy}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.nuGetDeploy}}))
jobs:
- job:
pool:
vmImage: "windows-latest" # NuGetCommand@2 is no longer supported on Ubuntu 24.04 so we'll use windows until an alternative is available.
displayName: Push to NuGet
steps:
- checkout: none
@@ -535,12 +583,12 @@ stages:
pool:
vmImage: 'windows-latest' # Apparently AzureFileCopy is windows only :(
variables:
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['determineMajorVersion.majorVersion'] ]
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ]
displayName: Upload API Documention
dependsOn:
- Build
- Deploy_NuGet
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.uploadApiDocs}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.uploadApiDocs}}))
jobs:
- job:
displayName: Upload C# Docs
+35
View File
@@ -0,0 +1,35 @@
name: Nightly_$(TeamProject)_$(Build.DefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)
pr: none
trigger: none
schedules:
- cron: '0 0 * * *'
displayName: Daily midnight build
branches:
include:
- v10/dev
- v12/dev
- v13/dev
- v14/dev
steps:
- checkout: none
- task: TriggerBuild@4
inputs:
definitionIsInCurrentTeamProject: true
buildDefinition: '301'
queueBuildForUserThatTriggeredBuild: true
ignoreSslCertificateErrors: false
useSameSourceVersion: false
useCustomSourceVersion: false
useSameBranch: true
waitForQueuedBuildsToFinish: false
storeInEnvironmentVariable: false
templateParameters: 'sqlServerIntegrationTests: true, forceReleaseTestFilter: true, myGetDeploy: true, isNightly: true'
authenticationMethod: 'OAuth Token'
enableBuildInQueueCondition: false
dependentOnSuccessfulBuildCondition: false
dependentOnFailedBuildCondition: false
checkbuildsoncurrentbranch: false
failTaskIfConditionsAreNotFulfilled: false
+6
View File
@@ -0,0 +1,6 @@
{
"sdk": {
"version": "6.0.300",
"rollForward": "latestFeature"
}
}
+67
View File
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<NoWarn>NU1507</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Dazinator.Extensions.FileProviders" Version="2.0.0" />
<PackageVersion Include="Examine" Version="3.0.1" />
<PackageVersion Include="Examine.Core" Version="3.0.1" />
<PackageVersion Include="HtmlAgilityPack" Version="1.11.54" />
<PackageVersion Include="IPNetwork2" Version="2.6.618" />
<PackageVersion Include="K4os.Compression.LZ4" Version="1.3.6" />
<PackageVersion Include="MailKit" Version="3.2.0" />
<PackageVersion Include="Markdown" Version="2.2.1" />
<PackageVersion Include="MessagePack" Version="2.5.187" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.24" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.24" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="6.0.24" />
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.24" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="6.0.24" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="6.0.24" />
<PackageVersion Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
<PackageVersion Include="MiniProfiler.Shared" Version="4.2.22" />
<PackageVersion Include="ncrontab" Version="3.3.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="NPoco.SqlServer" Version="5.3.2" />
<PackageVersion Include="Serilog" Version="2.12.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageVersion Include="Serilog.Enrichers.Process" Version="2.0.2" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageVersion Include="Serilog.Expressions" Version="3.4.1" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="4.2.0" />
<PackageVersion Include="Serilog.Formatting.Compact" Version="1.1.0" />
<PackageVersion Include="Serilog.Formatting.Compact.Reader" Version="1.0.5" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="3.4.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageVersion Include="Serilog.Sinks.Map" Version="1.0.2" />
<PackageVersion Include="SixLabors.ImageSharp" Version="2.1.10" />
<PackageVersion Include="SixLabors.ImageSharp.Web" Version="2.0.2" />
<PackageVersion Include="Smidge.InMemory" Version="4.3.0" />
<PackageVersion Include="Smidge.Nuglify" Version="4.2.1" />
<PackageVersion Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageVersion Include="System.Security.Cryptography.Pkcs" Version="6.0.4" />
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="6.0.0" />
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
<PackageVersion Include="System.Runtime.Caching" Version="6.0.0" />
<PackageVersion Include="Umbraco.CSharpTest.Net.Collections" Version="14.906.1403.1085" />
<!-- Add dependencies that we force an update to, even that we do not use them explicitly and they seems to be taken from the framework instead of from Nuget -->
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<PackageVersion Include="System.Security.Cryptography.Xml" Version="6.0.1" />
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>
</Project>
+16 -1
View File
@@ -51,6 +51,7 @@ namespace JsonSchema
public ImagingSettings? Imaging { get; set; }
public IndexCreatorSettings? Examine { get; set; }
public IndexingSettings? Indexing { get; set; }
public KeepAliveSettings? KeepAlive { get; set; }
@@ -88,13 +89,27 @@ namespace JsonSchema
public HelpPageSettings? HelpPage { get; set; }
public InstallDefaultDataSettings? DefaultDataCreation { get; set; }
public InstallDefaultData? InstallDefaultData { get; set; }
public DataTypesSettings? DataTypes { get; set; }
public MarketplaceSettings? Marketplace { get; set; }
}
/// <summary>
/// Configurations for the Umbraco CMS InstallDefaultData configuration.
/// </summary>
public class InstallDefaultData
{
public InstallDefaultDataSettings? Languages { get; set; }
public InstallDefaultDataSettings? DataTypes { get; set; }
public InstallDefaultDataSettings? MediaTypes { get; set; }
public InstallDefaultDataSettings? MemberTypes { get; set; }
}
/// <summary>
/// Configurations for the Umbraco Forms package to Umbraco CMS
/// </summary>
+4 -3
View File
@@ -3,16 +3,17 @@
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
<EnablePackageValidation>false</EnablePackageValidation>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.9.1" />
<PackageReference Include="NJsonSchema" Version="10.7.2" />
<PackageReference Include="NJsonSchema" Version="10.9.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Umbraco.Core\Umbraco.Core.csproj" />
<PackageReference Include="Umbraco.Deploy.Core" Version="10.1.2" />
<PackageReference Include="Umbraco.Forms.Core" Version="10.2.1" />
<PackageReference Include="Umbraco.Deploy.Core" Version="10.4.0" />
<PackageReference Include="Umbraco.Forms.Core" Version="10.5.4" />
</ItemGroup>
</Project>
@@ -4,6 +4,7 @@
<Description>Contains the presentation layer for the Umbraco CMS Management API.</Description>
<IsPackable>false</IsPackable>
<EnablePackageValidation>false</EnablePackageValidation>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
@@ -12,7 +13,7 @@
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0" />
<PackageReference Include="NSwag.AspNetCore" Version="13.16.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Umbraco.Infrastructure\Umbraco.Infrastructure.csproj" />
<ProjectReference Include="..\Umbraco.New.Cms.Core\Umbraco.New.Cms.Core.csproj" />
@@ -20,7 +21,7 @@
<ProjectReference Include="..\Umbraco.New.Cms.Web.Common\Umbraco.New.Cms.Web.Common.csproj" />
<ProjectReference Include="..\Umbraco.Web.Common\Umbraco.Web.Common.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="OpenApi.json" />
</ItemGroup>
@@ -1,12 +1,12 @@
namespace Umbraco.Cms.Persistence.SqlServer;
/// <summary>
/// Constants related to SQLite.
/// Constants related to SQL Server.
/// </summary>
public static class Constants
{
/// <summary>
/// SQLite provider name.
/// SQL Server provider name.
/// </summary>
public const string ProviderName = "Microsoft.Data.SqlClient";
}
@@ -1,4 +1,5 @@
using System.Runtime.Serialization;
using Microsoft.Data.SqlClient;
using Umbraco.Cms.Core.Install.Models;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Extensions;
@@ -50,6 +51,25 @@ public class SqlAzureDatabaseProviderMetadata : IDatabaseProviderMetadata
/// <inheritdoc />
public bool ForceCreateDatabase => false;
/// <inheritdoc />
public bool CanRecognizeConnectionString(string? connectionString)
{
if (connectionString is null)
{
return false;
}
try
{
var builder = new SqlConnectionStringBuilder(connectionString);
return string.IsNullOrEmpty(builder.AttachDBFilename) && builder.DataSource.Contains("database.windows.net");
}
catch (ArgumentException)
{
return false;
}
}
/// <inheritdoc />
public string GenerateConnectionString(DatabaseModel databaseModel)
{
@@ -51,6 +51,27 @@ public class SqlLocalDbDatabaseProviderMetadata : IDatabaseProviderMetadata
/// <inheritdoc />
public bool ForceCreateDatabase => true;
/// <inheritdoc />
public bool CanRecognizeConnectionString(string? connectionString)
{
if (connectionString is null)
{
return false;
}
try
{
var builder = new SqlConnectionStringBuilder(connectionString);
return !string.IsNullOrEmpty(builder.AttachDBFilename);
}
catch (ArgumentException)
{
return false;
}
}
/// <inheritdoc />
public string GenerateConnectionString(DatabaseModel databaseModel)
{
@@ -1,6 +1,9 @@
using System.Data.Common;
using System.Runtime.Serialization;
using Microsoft.Data.SqlClient;
using Umbraco.Cms.Core.Install.Models;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Extensions;
namespace Umbraco.Cms.Persistence.SqlServer.Services;
@@ -49,6 +52,26 @@ public class SqlServerDatabaseProviderMetadata : IDatabaseProviderMetadata
/// <inheritdoc />
public bool ForceCreateDatabase => false;
/// <inheritdoc />
public bool CanRecognizeConnectionString(string? connectionString)
{
if (connectionString is null)
{
return false;
}
try
{
var builder = new SqlConnectionStringBuilder(connectionString);
return string.IsNullOrEmpty(builder.AttachDBFilename);
}
catch (ArgumentException)
{
return false;
}
}
/// <inheritdoc />
public string GenerateConnectionString(DatabaseModel databaseModel) =>
databaseModel.IntegratedAuth
@@ -134,9 +134,10 @@ public class SqlServerDistributedLockingMechanism : IDistributedLockingMechanism
const string query = "SELECT value FROM umbracoLock WITH (REPEATABLEREAD) WHERE id=@id";
db.Execute("SET LOCK_TIMEOUT " + _timeout.TotalMilliseconds + ";");
var lockTimeoutQuery = $"SET LOCK_TIMEOUT {_timeout.TotalMilliseconds}";
var i = db.ExecuteScalar<int?>(query, new { id = LockId });
// execute the lock timeout query and the actual query in a single server roundtrip
var i = db.ExecuteScalar<int?>($"{lockTimeoutQuery};{query}", new { id = LockId });
if (i == null)
{
@@ -169,9 +170,10 @@ public class SqlServerDistributedLockingMechanism : IDistributedLockingMechanism
const string query =
@"UPDATE umbracoLock WITH (REPEATABLEREAD) SET value = (CASE WHEN (value=1) THEN -1 ELSE 1 END) WHERE id=@id";
db.Execute("SET LOCK_TIMEOUT " + _timeout.TotalMilliseconds + ";");
var lockTimeoutQuery = $"SET LOCK_TIMEOUT {_timeout.TotalMilliseconds}";
var i = db.Execute(query, new { id = LockId });
// execute the lock timeout query and the actual query in a single server roundtrip
var i = db.Execute($"{lockTimeoutQuery};{query}", new { id = LockId });
if (i == 0)
{
@@ -0,0 +1,11 @@
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Infrastructure.Persistence;
namespace Umbraco.Cms.Persistence.SqlServer.Services;
public class SqlServerSpecificMapperFactory : IProviderSpecificMapperFactory
{
public string ProviderName => Constants.ProviderName;
public NPocoMapperCollection Mappers => new(() => new[] { new UmbracoDefaultMapper() });
}
@@ -272,6 +272,13 @@ where tbl.[name]=@0 and col.[name]=@1;",
return !constraintName.IsNullOrWhiteSpace();
}
public override bool DoesPrimaryKeyExist(IDatabase db, string tableName, string primaryKeyName)
{
IEnumerable<SqlPrimaryKey>? keys = db.Fetch<SqlPrimaryKey>($"select * from sysobjects where xtype='pk' and parent_obj in (select id from sysobjects where name='{tableName}')")
.Where(x => x.Name == primaryKeyName);
return keys.FirstOrDefault() is not null;
}
public override bool DoesTableExist(IDatabase db, string tableName)
{
var result =
@@ -453,4 +460,9 @@ _sqlInspector ??= new SqlInspectionUtilities();
}
#endregion
private class SqlPrimaryKey
{
public string Name { get; set; } = null!;
}
}
@@ -22,6 +22,8 @@ public static class UmbracoBuilderExtensions
/// </summary>
public static IUmbracoBuilder AddUmbracoSqlServerSupport(this IUmbracoBuilder builder)
{
builder.Services.TryAddEnumerable(ServiceDescriptor
.Singleton<IProviderSpecificMapperFactory, SqlServerSpecificMapperFactory>());
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ISqlSyntaxProvider, SqlServerSyntaxProvider>());
builder.Services.TryAddEnumerable(ServiceDescriptor
.Singleton<IBulkSqlInsertProvider, SqlServerBulkSqlInsertProvider>());
@@ -1,3 +1,4 @@
using System.Globalization;
using NPoco;
namespace Umbraco.Cms.Persistence.Sqlite.Mappers;
@@ -28,6 +29,24 @@ public class SqlitePocoGuidMapper : DefaultMapper
};
}
if (destType == typeof(decimal))
{
return value =>
{
var result = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
return result;
};
}
if (destType == typeof(decimal?))
{
return value =>
{
var result = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
return result;
};
}
return base.GetFromDbConverter(destType, sourceType);
}
}
@@ -56,6 +56,26 @@ public class SqliteDatabaseProviderMetadata : IDatabaseProviderMetadata
/// </remarks>
public bool ForceCreateDatabase => true;
/// <inheritdoc />
public bool CanRecognizeConnectionString(string? connectionString)
{
if (connectionString is null)
{
return false;
}
try
{
var builder = new SqliteConnectionStringBuilder(connectionString);
return !string.IsNullOrEmpty(builder.DataSource);
}
catch (ArgumentException)
{
return false;
}
}
/// <inheritdoc />
public string GenerateConnectionString(DatabaseModel databaseModel)
{
@@ -154,7 +154,7 @@ public class SqliteDistributedLockingMechanism : IDistributedLockingMechanism
try
{
var i = command.ExecuteNonQuery();
var i = db.ExecuteNonQuery(command);
if (i == 0)
{
@@ -174,6 +174,14 @@ public class SqliteSyntaxProvider : SqlSyntaxProviderBase<SqliteSyntaxProvider>
return false;
}
public override bool DoesPrimaryKeyExist(IDatabase db, string tableName, string primaryKeyName)
{
IEnumerable<string> items = db.Fetch<string>($"select sql from sqlite_master where type = 'table' and name = '{tableName}'")
.Where(x => x.Contains($"CONSTRAINT {primaryKeyName} PRIMARY KEY"));
return items.Any();
}
public override string GetFieldNameForUpdate<TDto>(Expression<Func<TDto, object?>> fieldSelector, string? tableAlias = null)
{
var field = ExpressionHelper.FindProperty(fieldSelector).Item1 as PropertyInfo;
@@ -5,7 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="6.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite" />
</ItemGroup>
<ItemGroup>
+1
View File
@@ -4,6 +4,7 @@
<Description>Installs Umbraco CMS with all default dependencies in your ASP.NET Core project.</Description>
<IncludeBuildOutput>false</IncludeBuildOutput>
<IncludeSymbols>false</IncludeSymbols>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
@@ -84,8 +84,8 @@ public sealed class ContentCacheRefresher : PayloadCacheRefresherBase<ContentCac
isolatedCache.ClearOfType<IContent>((k, v) => v.Path?.Contains(pathid) ?? false);
}
// if the item is being completely removed, we need to refresh the domains cache if any domain was assigned to the content
if (payload.ChangeTypes.HasTypesAny(TreeChangeTypes.Remove))
// if the item is not a blueprint and is being completely removed, we need to refresh the domains cache if any domain was assigned to the content
if (payload.Blueprint is false && payload.ChangeTypes.HasTypesAny(TreeChangeTypes.Remove))
{
idsRemoved.Add(payload.Id);
}
@@ -120,7 +120,11 @@ public sealed class ContentCacheRefresher : PayloadCacheRefresherBase<ContentCac
// should rename it, and then, this is only for Deploy, and then, ???
// if (Suspendable.PageCacheRefresher.CanUpdateDocumentCache)
// ...
NotifyPublishedSnapshotService(_publishedSnapshotService, AppCaches, payloads);
if (payloads.Any(x => x.Blueprint is false))
{
// Only notify if the payload contains actual (non-blueprint) contents
NotifyPublishedSnapshotService(_publishedSnapshotService, AppCaches, payloads);
}
base.Refresh(payloads);
}
@@ -157,8 +161,13 @@ public sealed class ContentCacheRefresher : PayloadCacheRefresherBase<ContentCac
}
}
// TODO (V14): Change into a record
public class JsonPayload
{
public JsonPayload()
{ }
[Obsolete("Use the default constructor and property initializers.")]
public JsonPayload(int id, Guid? key, TreeChangeTypes changeTypes)
{
Id = id;
@@ -166,11 +175,13 @@ public sealed class ContentCacheRefresher : PayloadCacheRefresherBase<ContentCac
ChangeTypes = changeTypes;
}
public int Id { get; }
public int Id { get; init; }
public Guid? Key { get; }
public Guid? Key { get; init; }
public TreeChangeTypes ChangeTypes { get; }
public TreeChangeTypes ChangeTypes { get; init; }
public bool Blueprint { get; init; }
}
#endregion
@@ -88,10 +88,6 @@ public sealed class DataTypeCacheRefresher : PayloadCacheRefresherBase<DataTypeC
}
}
// TODO: not sure I like these?
TagsValueConverter.ClearCaches();
SliderValueConverter.ClearCaches();
// refresh the models and cache
_publishedModelFactory.WithSafeLiveFactoryReset(() =>
_publishedSnapshotService.Notify(payloads));
@@ -134,8 +134,14 @@ public sealed class LanguageCacheRefresher : PayloadCacheRefresherBase<LanguageC
ContentCacheRefresher.RefreshContentTypes(AppCaches); // we need to evict all IContent items
// now refresh all nucache
ContentCacheRefresher.JsonPayload[] clearContentPayload =
new[] { new ContentCacheRefresher.JsonPayload(0, null, TreeChangeTypes.RefreshAll) };
ContentCacheRefresher.JsonPayload[] clearContentPayload = new[]
{
new ContentCacheRefresher.JsonPayload()
{
ChangeTypes = TreeChangeTypes.RefreshAll
}
};
ContentCacheRefresher.NotifyPublishedSnapshotService(_publishedSnapshotService, AppCaches, clearContentPayload);
}
+31 -8
View File
@@ -9,6 +9,9 @@ namespace Umbraco.Cms.Core.Cache;
/// </summary>
public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
{
private static readonly TimeSpan _readLockTimeout = TimeSpan.FromSeconds(5);
private static readonly TimeSpan _writeLockTimeout = TimeSpan.FromSeconds(5);
private readonly ReaderWriterLockSlim _locker = new(LockRecursionPolicy.SupportsRecursion);
private bool _disposedValue;
@@ -33,7 +36,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
Lazy<object?>? result;
try
{
_locker.EnterReadLock();
if (_locker.TryEnterReadLock(_readLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when getting item");
}
result = MemoryCache.Get(key) as Lazy<object?>; // null if key not found
}
finally
@@ -195,7 +201,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
{
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when clearing item");
}
if (MemoryCache[key] == null)
{
return;
@@ -223,8 +232,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
var isInterface = type.IsInterface;
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when clearing by type");
}
// ToArray required to remove
foreach (var key in MemoryCache
.Where(x =>
@@ -259,7 +270,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
{
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when clearing by generic type");
}
Type typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
@@ -296,7 +310,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
{
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when clearing generic type with predicate");
}
Type typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
@@ -338,7 +355,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
{
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cache when clearing with prefix");
}
// ToArray required to remove
foreach (var key in MemoryCache
@@ -365,7 +385,10 @@ public class ObjectCacheAppCache : IAppPolicyCache, IDisposable
try
{
_locker.EnterWriteLock();
if (_locker.TryEnterWriteLock(_writeLockTimeout) is false)
{
throw new TimeoutException("Timeout exceeded to the memory cach when clearing by regex");
}
// ToArray required to remove
foreach (var key in MemoryCache
@@ -3,30 +3,26 @@ using System.Collections;
namespace Umbraco.Cms.Core.Composing;
/// <summary>
/// Provides a base class for builder collections.
/// Provides a base class for builder collections.
/// </summary>
/// <typeparam name="TItem">The type of the items.</typeparam>
public abstract class BuilderCollectionBase<TItem> : IBuilderCollection<TItem>
{
private readonly LazyReadOnlyCollection<TItem> _items;
/// Initializes a new instance of the
/// <see cref="BuilderCollectionBase{TItem}" />
/// with items.
/// <summary>
/// Initializes a new instance of the <see cref="BuilderCollectionBase{TItem}" /> with items.
/// </summary>
/// <param name="items">The items.</param>
public BuilderCollectionBase(Func<IEnumerable<TItem>> items) => _items = new LazyReadOnlyCollection<TItem>(items);
public BuilderCollectionBase(Func<IEnumerable<TItem>> items)
=> _items = new LazyReadOnlyCollection<TItem>(items);
/// <inheritdoc />
public int Count => _items.Count;
/// <summary>
/// Gets an enumerator.
/// </summary>
/// <inheritdoc />
public IEnumerator<TItem> GetEnumerator() => _items.GetEnumerator();
/// <summary>
/// Gets an enumerator.
/// </summary>
/// <inheritdoc />
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
@@ -1,13 +1,16 @@
namespace Umbraco.Cms.Core.Composing;
/// <summary>
/// Represents a builder collection, ie an immutable enumeration of items.
/// Represents a builder collection, ie an immutable enumeration of items.
/// </summary>
/// <typeparam name="TItem">The type of the items.</typeparam>
public interface IBuilderCollection<out TItem> : IEnumerable<TItem>
{
/// <summary>
/// Gets the number of items in the collection.
/// Gets the number of items in the collection.
/// </summary>
/// <value>
/// The count.
/// </value>
int Count { get; }
}
+10 -1
View File
@@ -21,7 +21,7 @@ public class TypeFinder : ITypeFinder
/// its an exact name match
/// NOTE this means that "foo." will NOT exclude "foo.dll" but only "foo.*.dll"
/// </remarks>
internal static readonly string[] KnownAssemblyExclusionFilter =
internal static string[] KnownAssemblyExclusionFilter =
{
"mscorlib,", "netstandard,", "System,", "Antlr3.", "AutoMapper,", "AutoMapper.", "Autofac,", // DI
"Autofac.", "AzureDirectory,", "Castle.", // DI, tests
@@ -49,11 +49,20 @@ public class TypeFinder : ITypeFinder
private string[]? _assembliesAcceptingLoadExceptions;
private volatile HashSet<Assembly>? _localFilteredAssemblyCache;
[Obsolete("Please use the constructor taking all parameters. This constructor will be removed in V14.")]
public TypeFinder(ILogger<TypeFinder> logger, IAssemblyProvider assemblyProvider, ITypeFinderConfig? typeFinderConfig = null)
: this(logger, assemblyProvider, null, typeFinderConfig)
{ }
public TypeFinder(ILogger<TypeFinder> logger, IAssemblyProvider assemblyProvider, string[]? additionalExlusionAssemblies, ITypeFinderConfig? typeFinderConfig = null)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_assemblyProvider = assemblyProvider;
_typeFinderConfig = typeFinderConfig;
if (additionalExlusionAssemblies is not null)
{
KnownAssemblyExclusionFilter = KnownAssemblyExclusionFilter.Union(additionalExlusionAssemblies).ToArray();
}
}
/// <inheritdoc />
@@ -262,4 +262,9 @@ public class ContentSettings
/// </summary>
[DefaultValue(StaticDisallowedUploadFiles)]
public string[] DisallowedUploadedFileExtensions { get; set; } = StaticDisallowedUploadFiles.Split(',');
/// <summary>
/// Gets or sets the allowed external host for media. If empty only relative paths are allowed.
/// </summary>
public string[] AllowedMediaHosts { get; set; } = Array.Empty<string>();
}
@@ -0,0 +1,18 @@
using System.ComponentModel;
namespace Umbraco.Cms.Core.Configuration.Models;
/// <summary>
/// Typed configuration options for index creator settings.
/// </summary>
[UmbracoOptions(Constants.Configuration.ConfigIndexing)]
public class IndexingSettings
{
private const bool StaticExplicitlyIndexEachNestedProperty = true;
/// <summary>
/// Gets or sets a value for whether each nested property should have it's own indexed value. Requires a rebuild of indexes when changed.
/// </summary>
[DefaultValue(StaticExplicitlyIndexEachNestedProperty)]
public bool ExplicitlyIndexEachNestedProperty { get; set; } = StaticExplicitlyIndexEachNestedProperty;
}
@@ -14,6 +14,7 @@ public class NuCacheSettings
internal const string StaticNuCacheSerializerType = "MessagePack";
internal const int StaticSqlPageSize = 1000;
internal const int StaticKitBatchSize = 1;
internal const bool StaticUsePagedSqlQuery = true;
/// <summary>
/// Gets or sets a value defining the BTree block size.
@@ -40,4 +41,7 @@ public class NuCacheSettings
public int KitBatchSize { get; set; } = StaticKitBatchSize;
public bool UnPublishedContentCompression { get; set; } = false;
[DefaultValue(StaticUsePagedSqlQuery)]
public bool UsePagedSqlQuery { get; set; } = true;
}
@@ -116,18 +116,18 @@ public class RichTextEditorSettings
new Dictionary<string, string> { ["entity_encoding"] = "raw" };
/// <summary>
/// HTML RichText Editor TinyMCE Commands
/// HTML RichText Editor TinyMCE Commands.
/// </summary>
/// WB-TODO Custom Array of objects
public RichTextEditorCommand[] Commands { get; set; } = Default_commands;
/// <summary>
/// HTML RichText Editor TinyMCE Plugins
/// HTML RichText Editor TinyMCE Plugins.
/// </summary>
public string[] Plugins { get; set; } = Default_plugins;
/// <summary>
/// HTML RichText Editor TinyMCE Custom Config
/// HTML RichText Editor TinyMCE Custom Config.
/// </summary>
/// WB-TODO Custom Dictionary
public IDictionary<string, string> CustomConfig { get; set; } = Default_custom_config;
@@ -138,7 +138,7 @@ public class RichTextEditorSettings
public string ValidElements { get; set; } = StaticValidElements;
/// <summary>
/// Invalid HTML elements for RichText Editor
/// Invalid HTML elements for RichText Editor.
/// </summary>
[DefaultValue(StaticInvalidElements)]
public string InvalidElements { get; set; } = StaticInvalidElements;
@@ -2,6 +2,7 @@
// See LICENSE for more details.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Umbraco.Cms.Core.Configuration.Models;
@@ -22,6 +23,11 @@ public class SecuritySettings
internal const string StaticAllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+\\";
internal const int StaticMemberDefaultLockoutTimeInMinutes = 30 * 24 * 60;
internal const int StaticUserDefaultLockoutTimeInMinutes = 30 * 24 * 60;
private const long StaticUserDefaultFailedLoginDurationInMilliseconds = 1000;
private const long StaticUserMinimumFailedLoginDurationInMilliseconds = 250;
/// <summary>
/// Gets or sets a value indicating whether to keep the user logged in.
/// </summary>
@@ -65,12 +71,14 @@ public class SecuritySettings
/// <summary>
/// Gets or sets a value for the user password settings.
/// </summary>
public UserPasswordConfigurationSettings? UserPassword { get; set; }
[Obsolete("This no longer works. You can now inject this by using IOptions<UserPasswordConfigurationSettings> instead, scheduled for removal in v13")]
public UserPasswordConfigurationSettings? UserPassword { get; set; } = new();
/// <summary>
/// Gets or sets a value for the member password settings.
/// </summary>
public MemberPasswordConfigurationSettings? MemberPassword { get; set; }
[Obsolete("This no longer works. You can now inject this by using IOptions<MemberPasswordConfigurationSettings> instead, scheduled for removal in v13")]
public MemberPasswordConfigurationSettings? MemberPassword { get; set; } = new();
/// <summary>
/// Gets or sets a value indicating whether to bypass the two factor requirement in Umbraco when using external login
@@ -86,10 +94,44 @@ public class SecuritySettings
[DefaultValue(StaticUserBypassTwoFactorForExternalLogins)]
public bool UserBypassTwoFactorForExternalLogins { get; set; } = StaticUserBypassTwoFactorForExternalLogins;
/// <summary>
/// Gets or sets a value for how long (in minutes) a member is locked out when a lockout occurs.
/// </summary>
[DefaultValue(StaticMemberDefaultLockoutTimeInMinutes)]
public int MemberDefaultLockoutTimeInMinutes { get; set; } = StaticMemberDefaultLockoutTimeInMinutes;
/// <summary>
/// Gets or sets a value for how long (in minutes) a user is locked out when a lockout occurs.
/// </summary>
[DefaultValue(StaticUserDefaultLockoutTimeInMinutes)]
public int UserDefaultLockoutTimeInMinutes { get; set; } = StaticUserDefaultLockoutTimeInMinutes;
/// <summary>
/// Gets or sets a value indicating whether to allow editing invariant properties from a non-default language variation.
/// </summary>
[Obsolete("Use ContentSettings.AllowEditFromInvariant instead")]
[DefaultValue(StaticAllowEditInvariantFromNonDefault)]
public bool AllowEditInvariantFromNonDefault { get; set; } = StaticAllowEditInvariantFromNonDefault;
/// <summary>
/// Gets or sets the default duration (in milliseconds) of failed login attempts.
/// </summary>
/// <value>
/// The default duration (in milliseconds) of failed login attempts.
/// </value>
/// <remarks>
/// The user login endpoint ensures that failed login attempts take at least as long as the average successful login.
/// However, if no successful logins have occurred, this value is used as the default duration.
/// </remarks>
[DefaultValue(StaticUserDefaultFailedLoginDurationInMilliseconds)]
public long UserDefaultFailedLoginDurationInMilliseconds { get; set; } = StaticUserDefaultFailedLoginDurationInMilliseconds;
/// <summary>
/// Gets or sets the minimum duration (in milliseconds) of failed login attempts.
/// </summary>
/// <value>
/// The minimum duration (in milliseconds) of failed login attempts.
/// </value>
[DefaultValue(StaticUserMinimumFailedLoginDurationInMilliseconds)]
public long UserMinimumFailedLoginDurationInMilliseconds { get; set; } = StaticUserMinimumFailedLoginDurationInMilliseconds;
}
@@ -22,4 +22,9 @@ public class TypeFinderSettings
/// scanning for plugins based on different root referenced assemblies you can add the assembly name to this list.
/// </summary>
public IEnumerable<string>? AdditionalEntryAssemblies { get; set; }
/// <summary>
/// Gets or sets a value for the assemblies that will be excluded from scanning.
/// </summary>
public string[] AdditionalAssemblyExclusionEntries { get; set; } = Array.Empty<string>();
}
@@ -19,7 +19,7 @@ public class UmbracoPluginSettings
".css", // styles
".js", // scripts
".jpg", ".jpeg", ".gif", ".png", ".svg", // images
".eot", ".ttf", ".woff", // fonts
".eot", ".ttf", ".woff", ".woff2", // fonts
".xml", ".json", ".config", // configurations
".lic", // license
".map", // js map files
@@ -38,6 +38,7 @@ public static partial class Constants
public const string ConfigHosting = ConfigPrefix + "Hosting";
public const string ConfigImaging = ConfigPrefix + "Imaging";
public const string ConfigExamine = ConfigPrefix + "Examine";
public const string ConfigIndexing = ConfigPrefix + "Indexing";
public const string ConfigKeepAlive = ConfigPrefix + "KeepAlive";
public const string ConfigLogging = ConfigPrefix + "Logging";
public const string ConfigMemberPassword = ConfigPrefix + "Security:MemberPassword";
@@ -10,6 +10,7 @@ public static partial class Constants
public const string GetVersion = "Umbraco.Core.VersionableRepository.GetVersion";
public const string GetVersions = "Umbraco.Core.VersionableRepository.GetVersions";
public const string EnsureUniqueNodeName = "Umbraco.Core.VersionableRepository.EnsureUniqueNodeName";
public const string SortOrderExists = "Umbraco.Core.VersionableRepository.SortOrderExists";
public const string GetSortOrder = "Umbraco.Core.VersionableRepository.GetSortOrder";
public const string GetParentNode = "Umbraco.Core.VersionableRepository.GetParentNode";
public const string GetReservedId = "Umbraco.Core.VersionableRepository.GetReservedId";
+1
View File
@@ -28,5 +28,6 @@ public static partial class Constants
public static string IsDebug = "IsDebug";
public static string DatabaseProvider = "DatabaseProvider";
public static string CurrentServerRole = "CurrentServerRole";
public static string BackofficeExternalLoginProviderCount = "BackofficeExternalLoginProviderCount";
}
}
@@ -50,6 +50,7 @@ public static partial class UmbracoBuilderExtensions
builder
.AddUmbracoOptions<ModelsBuilderSettings>()
.AddUmbracoOptions<ActiveDirectorySettings>()
.AddUmbracoOptions<IndexCreatorSettings>()
.AddUmbracoOptions<MarketplaceSettings>()
.AddUmbracoOptions<ContentSettings>()
.AddUmbracoOptions<CoreDebugSettings>()
@@ -64,7 +65,7 @@ public static partial class UmbracoBuilderExtensions
.AddUmbracoOptions<HealthChecksSettings>()
.AddUmbracoOptions<HostingSettings>()
.AddUmbracoOptions<ImagingSettings>()
.AddUmbracoOptions<IndexCreatorSettings>()
.AddUmbracoOptions<IndexingSettings>()
.AddUmbracoOptions<KeepAliveSettings>()
.AddUmbracoOptions<LoggingSettings>()
.AddUmbracoOptions<MemberPasswordConfigurationSettings>()
@@ -318,8 +318,9 @@ namespace Umbraco.Cms.Core.DependencyInjection
Services.AddSingleton<ConflictingPackageData>();
Services.AddSingleton<CompiledPackageXmlParser>();
// Register a noop IHtmlSanitizer to be replaced
// Register a noop IHtmlSanitizer & IMarkdownSanitizer to be replaced
Services.AddUnique<IHtmlSanitizer, NoopHtmlSanitizer>();
Services.AddUnique<IMarkdownSanitizer, NoopMarkdownSanitizer>();
Services.AddUnique<IPropertyTypeUsageService, PropertyTypeUsageService>();
Services.AddUnique<IDataTypeUsageService, DataTypeUsageService>();
@@ -327,6 +328,9 @@ namespace Umbraco.Cms.Core.DependencyInjection
Services.AddUnique<ICultureImpactFactory>(provider => new CultureImpactFactory(provider.GetRequiredService<IOptionsMonitor<ContentSettings>>()));
Services.AddUnique<IDictionaryService, DictionaryService>();
Services.AddUnique<ITemporaryMediaService, TemporaryMediaService>();
// Register filestream security analyzers
Services.AddUnique<IFileStreamSecurityValidator,FileStreamSecurityValidator>();
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1754,9 +1754,8 @@
<key alias="usergroup">Uživatelská skupina</key>
<key alias="userInvited">byl pozván</key>
<key alias="userInvitedSuccessHelp">Novému uživateli byla zaslána pozvánka s informacemi, jak se přihlásit do Umbraco.</key>
<key alias="userinviteWelcomeMessage">Dobrý den, vítejte v Umbraco! Za pouhou 1 minutu budete moci používat Umbraco. Jenom od vás potřebujeme, abyste si nastavili heslo a přidali obrázek pro svůj avatar.</key>
<key alias="userinviteWelcomeMessage">Dobrý den, vítejte v Umbraco! Za pouhou 1 minutu budete moci používat Umbraco. Jenom od vás potřebujeme, abyste si nastavili heslo.</key>
<key alias="userinviteExpiredMessage">Vítejte v Umbraco! Vaše pozvánka bohužel vypršela. Obraťte se na svého správce a požádejte jej, aby jí znovu odeslal.</key>
<key alias="userinviteAvatarMessage">Nahrání vaší fotografie usnadní ostatním uživatelům, aby vás poznali. Kliknutím na kruh výše nahrajte svou fotku.</key>
<key alias="writer">Spisovatel</key>
<key alias="change">Změnit</key>
<key alias="yourProfile" version="7.0">Váš profil</key>
@@ -1869,8 +1868,8 @@
<key alias="stateInactive">Neaktivní</key>
<key alias="sortNameAscending">Jméno (A-Z)</key>
<key alias="sortNameDescending">Jméno (Z-A)</key>
<key alias="sortCreateDateAscending">Nejnovější</key>
<key alias="sortCreateDateDescending">Nejstarší</key>
<key alias="sortCreateDateAscending">Nejstarší</key>
<key alias="sortCreateDateDescending">Nejnovější</key>
<key alias="sortLastLoginDateDescending">Poslední přihlášení</key>
<key alias="noUserGroupsAdded">Nebyly přidány žádné skupiny uživatelů</key>
</area>
@@ -576,7 +576,7 @@
<area alias="dictionary">
<key alias="noItems">Nid oes unrhyw eitemau geiriadur.</key>
<key alias="importDictionaryItemHelp">
I fewnforio eitem geiriadur, dewch o hyd i'r ffeil ".udt" ar eich cyfrifiadur trwy glicio
I fewnforio eitem geiriadur, dewch o hyd i'r ffeil ".udt" ar eich cyfrifiadur trwy glicio
ar y botwm "Mewnforio" (bydd gofyn i chi am gadarnhad ar y sgrin nesaf)
</key>
<key alias="itemDoesNotExists">Nid yw eitem geiriadur yn bodoli.</key>
@@ -2308,9 +2308,8 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang
<key alias="userGroups">Grwpiau defnyddiwr</key>
<key alias="userInvited">wedi'i wahodd</key>
<key alias="userInvitedSuccessHelp">Mae gwahoddiad wedi cael ei anfon at y defnyddiwr newydd gyda manylion ar sut i fewngofnodi i Umbraco.</key>
<key alias="userinviteWelcomeMessage">Helo a chroeso i Umbraco! Mewn 1 munud yn unig, byddech chi'n barod i fynd, rydym dim ond angen gosod cyfrinair a llun ar gyfer eich avatar.</key>
<key alias="userinviteWelcomeMessage">Helo a chroeso i Umbraco! Mewn 1 munud yn unig, byddech chi'n barod i fynd, rydym dim ond angen gosod cyfrinair.</key>
<key alias="userinviteExpiredMessage">Croeso i Umbraco! Yn anffodus, mae eich gwahoddiad wedi terfynu. Cysylltwch â'ch gweinyddwr a gofynnwch iddynt ail-anfon.</key>
<key alias="userinviteAvatarMessage">Lanlwythwch lun i wneud o'n haws i boble eich adnabod chi.</key>
<key alias="writer">Ysgrifennydd</key>
<key alias="translator">Cyfieithydd</key>
<key alias="change">Newid</key>
+15 -15
View File
@@ -54,8 +54,8 @@
<key alias="setPermissions">Sæt rettigheder</key>
<key alias="unlock">Lås op</key>
<key alias="createblueprint">Opret indholdsskabelon</key>
<key alias="resendInvite">Gensend Invitation</key>
<key alias="defaultValue">Standard værdi</key>
<key alias="resendInvite">Gensend invitation</key>
<key alias="defaultValue">Standardværdi</key>
</area>
<area alias="actionCategories">
<key alias="content">Indhold</key>
@@ -342,6 +342,7 @@
<key alias="createNewMember">Opret et nyt medlem</key>
<key alias="allMembers">Alle medlemmer</key>
<key alias="memberGroupNoProperties">Medlemgrupper har ingen yderligere egenskaber til redigering.</key>
<key alias="2fa">Totrinsbekræftelse</key>
</area>
<area alias="contentType">
<key alias="copyFailed">Kopiering af indholdstypen fejlede</key>
@@ -716,6 +717,7 @@
<key alias="by">af</key>
<key alias="cancel">Fortryd</key>
<key alias="cellMargin">Celle margen</key>
<key alias="change">Skift</key>
<key alias="choose">Vælg</key>
<key alias="clear">Ryd</key>
<key alias="close">Luk</key>
@@ -1893,15 +1895,13 @@ Mange hilsner fra Umbraco robotten
logger ind i Umbraco.
</key>
<key alias="userinviteWelcomeMessage">Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i
gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar.
gang, vi skal bare have dig til at oprette en adgangskode.
</key>
<key alias="userinviteExpiredMessage">Velkommen til Umbraco! Desværre er din invitation udløbet. Kontakt din
administrator og bed om at gensende invitationen.
</key>
<key alias="userinviteAvatarMessage">Hvis du uploader et billede af dig selv, gør du det nemt for andre brugere at
genkende dig. Klik på cirklen ovenfor for at uploade et billede.
</key>
<key alias="writer">Forfatter</key>
<key alias="configureTwoFactor">Konfigurer totrinsbekræftelse</key>
<key alias="change">Skift</key>
<key alias="yourProfile">Din profil</key>
<key alias="yourHistory">Din historik</key>
@@ -1925,15 +1925,15 @@ Mange hilsner fra Umbraco robotten
<key alias="stateInactive">Inaktiv</key>
<key alias="sortNameAscending">Navn (A-Å)</key>
<key alias="sortNameDescending">Navn (Å-A)</key>
<key alias="sortCreateDateAscending">Nyeste</key>
<key alias="sortCreateDateDescending">Ældste</key>
<key alias="sortCreateDateAscending">Ældste</key>
<key alias="sortCreateDateDescending">Nyeste</key>
<key alias="sortLastLoginDateDescending">Sidst logget ind</key>
<key alias="noUserGroupsAdded">Ingen brugere er blevet tilføjet</key>
<key alias="2faDisableText">Hvis du ønsker at slå denne autentificeringsmetode fra, så skal du nu indtaste koden fra dit device:</key>
<key alias="2faProviderIsEnabled">Denne autentificeringsmetode er slået til</key>
<key alias="2faProviderIsDisabledMsg">Den valgte autentificeringsmetode er nu slået fra</key>
<key alias="2faProviderIsNotDisabledMsg">Der skete en ukendt fejl da denne autentificeringsmetode skulles slåes fra</key>
<key alias="2faDisableForUser">Er du sikker på, at du vil fjerne denne autentificeringsmetode for denne bruger?</key>
<key alias="2faDisableText">Hvis du ønsker at slå denne totrinsbekræftelse fra, så skal du nu indtaste koden fra din enhed:</key>
<key alias="2faProviderIsEnabled">Denne totrinsbekræftelse er slået til</key>
<key alias="2faProviderIsDisabledMsg">Den valgte totrinsbekræftelse er nu slået fra</key>
<key alias="2faProviderIsNotDisabledMsg">Der skete en ukendt fejl da denne totrinsbekræftelse skulles slåes fra</key>
<key alias="2faDisableForUser">Er du sikker på, at du vil fjerne denne totrinsbekræftelse for denne bruger?</key>
</area>
<area alias="validation">
<key alias="validation">Validering</key>
@@ -2230,7 +2230,7 @@ Mange hilsner fra Umbraco robotten
<key alias="allowedBlockColumnsHelp">Vælg de forskellige antal kolonner denne blok må optage i layoutet. Dette forhindre ikke blokken i at optræde i et mindre område.</key>
<key alias="allowedBlockRows">TIlgængelige række-størrelser</key>
<key alias="allowedBlockRowsHelp">Vælg hvor mange rækker denne blok på optage i layoutet.</key>
<key alias="allowBlockInRoot">Tillad på rodniveay</key>
<key alias="allowBlockInRoot">Tillad på rodniveau</key>
<key alias="allowBlockInRootHelp">Gør denne blok tilgængelig i layoutets rodniveau. Hvis dette ikke er valgt, kan denne blok kun bruges inden for andre blokkes definerede områder.</key>
<key alias="areas">Blok-områder</key>
<key alias="areasLayoutColumns">Layout-kolonner</key>
@@ -2238,7 +2238,7 @@ Mange hilsner fra Umbraco robotten
<key alias="areasConfigurations">Opsætning af områder</key>
<key alias="areasConfigurationsHelp">Hvis det skal være muligt at indsætte nye blokke indeni denne blok, skal der oprettes ét eller flere områder til at indsætte de nye blokke i.</key>
<key alias="invalidDropPosition">Ikke tilladt placering.</key>
<key alias="defaultLayoutStylesheet">Standart layout stylesheet</key>
<key alias="defaultLayoutStylesheet">Standardlayout stylesheet</key>
<key alias="confirmPasteDisallowedNestedBlockHeadline">Ikke tilladt indhold blev afvist</key>
<key alias="confirmPasteDisallowedNestedBlockMessage">
<![CDATA[Det indsatte indhold bestod af ikke tilladt del-indhold, disse dele er blevet afvist. Vil du beholde det resterene alligevel?]]></key>
+332 -65
View File
@@ -93,6 +93,7 @@
<area alias="assignDomain">
<key alias="permissionDenied">Erlaubnis verweigert.</key>
<key alias="addNew">Neue Domain hinzufügen</key>
<key alias="addCurrent">Aktuelle Domain hinzufügen</key>
<key alias="remove">entfernen</key>
<key alias="invalidNode">Ungültiges Element.</key>
<key alias="invalidDomain">Format der Domain ungültig.</key>
@@ -109,7 +110,8 @@
Außerdem werden Pfade mit erstem URL-Segment unterstützt z. B.: "example.com/en" or "/en".]]></key>
<key alias="inherit">Vererben</key>
<key alias="setLanguage">Kultur</key>
<key alias="setLanguageHelp">Definiert die Kultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element. Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist.</key>
<key alias="setLanguageHelp">Definiert die Kultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element.
Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist.</key>
<key alias="setDomains">Domainen</key>
</area>
<area alias="buttons">
@@ -154,6 +156,7 @@
<key alias="deleteTag">TAG entfernen</key>
<key alias="confirmActionCancel">Abbrechen</key>
<key alias="confirmActionConfirm">Bestätigen</key>
<key alias="morePublishingOptions">Mehr Veröffentlichungs Optionen</key>
<key alias="submitChanges">Senden</key>
</area>
<area alias="auditTrails">
@@ -171,6 +174,7 @@
<key alias="sendtopublish">Veröffentlichung für Inhalt angefordert</key>
<key alias="sendtopublishvariant">Veröffentlichung für Inhalt angefordert in Sprache: %0%</key>
<key alias="sort">Unterknoten wurden sortiert von Benutzer</key>
<key alias="custom">%0%</key>
<key alias="contentversionpreventcleanup">Versionsbereinigung deaktiviert für Version: %0%</key>
<key alias="contentversionenablecleanup">Versionsbereinigung aktiviert für Version: %0%</key>
<key alias="smallCopy">Kopieren</key>
@@ -186,6 +190,7 @@
<key alias="smallSendToPublish">Veröffentlichung anfordern</key>
<key alias="smallSendToPublishVariant">Veröffentlichung anfordern</key>
<key alias="smallSort">Sortieren</key>
<key alias="smallCustom">Benutzerdefiniert</key>
<key alias="smallContentVersionPreventCleanup">Speichern</key>
<key alias="smallContentVersionEnableCleanup">Speichern</key>
<key alias="historyIncludingVariants">Verlauf (alle Variationen)</key>
@@ -227,8 +232,12 @@
<key alias="noMediaLink">Dieses Media-Element hat keinen Link</key>
<key alias="noProperties">Diesem Element kann kein Inhalt zugewiesen werden</key>
<key alias="otherElements">Eigenschaften</key>
<key alias="parentNotPublished">Dieses Dokument ist veröffentlicht aber nicht sichtbar, da das übergeordnete Dokument '%0%' nicht publiziert ist</key>
<key alias="parentCultureNotPublished">Diese Kultur wurde veröffentlicht, aber wird nicht angezeigt, weil sie auf dem Oberknoten '%0%' unveröffentlicht ist</key>
<key alias="parentNotPublished">Dieses Dokument ist veröffentlicht aber nicht sichtbar,
da das übergeordnete Dokument '%0%' nicht publiziert ist
</key>
<key alias="parentCultureNotPublished">Diese Kultur wurde veröffentlicht, aber wird nicht angezeigt,
weil sie auf dem Oberknoten '%0%' unveröffentlicht ist
</key>
<key alias="parentNotPublishedAnomaly">Ups! Dieses Dokument ist veröffentlicht aber nicht im internen Cache aufzufinden: Systemfehler.</key>
<key alias="getUrlException">Der URL wurde nicht gefunden</key>
<key alias="routeError">Dieses Dokument wurde veröffentlicht, aber sein URL würde mit Inhalt %0% kollidieren</key>
@@ -238,24 +247,21 @@
<key alias="publishedPendingChanges">Veröffentlicht (Änderungen bereit)</key>
<key alias="publishStatus">Publikationsstatus</key>
<key alias="publishDescendantsHelp">
<![CDATA[
Wähle <em>Veröffentlichen mit Unterknoten</em> zum Veröffentlichen <strong>der gewählten Sprache</strong>
samt aller Unterknoten der selben Sprache, um ihren Inhalt öffentlich verfügbar zu machen.]]>
</key>
<![CDATA[Wähle <em>Veröffentlichen mit Unterknoten</em> zum Veröffentlichen <strong>der gewählten Sprache</strong> samt aller Unterknoten der selben Sprache, um ihren Inhalt öffentlich verfügbar zu machen.]]></key>
<key alias="publishDescendantsWithVariantsHelp">
<![CDATA[
Wähle <em>Veröffentlichen mit Unterknoten</em> zum Veröffentlichen <strong>der gewählten Sprache</strong>
samt aller Unterknoten der selben Sprache, um ihren Inhalt öffentlich verfügbar zu machen.]]>
</key>
<![CDATA[Wähle <em>Veröffentlichen mit Unterknoten</em> zum Veröffentlichen <strong>der gewählten Sprache</strong> samt aller Unterknoten der selben Sprache, um ihren Inhalt öffentlich verfügbar zu machen.]]></key>
<key alias="releaseDate">Veröffentlichen am</key>
<key alias="unpublishDate">Veröffentlichung widerrufen am</key>
<key alias="removeDate">Datum entfernen</key>
<key alias="setDate">Datum wählen</key>
<key alias="sortDone">Sortierung abgeschlossen</key>
<key alias="sortHelp">Um die Dokumente zu sortieren, ziehen Sie sie einfach an die gewünschte Position. Sie können mehrere Zeilen markieren indem Sie die Umschalttaste ("Shift") oder die Steuerungstaste ("Strg") gedrückt halten</key>
<key alias="sortHelp">Um die Dokumente zu sortieren, ziehen Sie sie einfach an die gewünschte Position.
Sie können mehrere Zeilen markieren indem Sie die Umschalttaste ("Shift") oder die Steuerungstaste ("Strg") gedrückt halten
</key>
<key alias="statistics">Statistiken</key>
<key alias="titleOptional">Titel (optional)</key>
<key alias="altTextOptional">Alternativtext (optional)</key>
<key alias="captionTextOptional">Beschriftung (optional)</key>
<key alias="type">Typ</key>
<key alias="unpublish">Veröffentlichung widerrufen</key>
<key alias="unpublished">Entwurf</key>
@@ -263,6 +269,8 @@
<key alias="updateDate">Zuletzt bearbeitet am</key>
<key alias="updateDateDesc" version="7.0">Letzter Änderungszeitpunkt des Dokuments</key>
<key alias="uploadClear">Datei entfernen</key>
<key alias="uploadClearImageContext">Klicke hier um das das Bild vom Medienelement zu entfernen.</key>
<key alias="uploadClearFileContext">Klicke hier um das das Bild vom Medienelement zu entfernen.</key>
<key alias="urls">Link zum Dokument</key>
<key alias="memberof">Mitglied der Gruppe(n)</key>
<key alias="notmemberof">Kein Mitglied der Gruppe(n)</key>
@@ -270,29 +278,55 @@
<key alias="target" version="7.0">Ziel</key>
<key alias="scheduledPublishServerTime">Dies führt zur folgenden Zeit auf dem Server:</key>
<key alias="scheduledPublishDocumentation">
<![CDATA[
<a href="https://docs.umbraco.com/umbraco-cms/fundamentals/data/scheduled-publishing#timezones" target="_blank" rel="noopener">Was bedeutet dies?</a>
]]>
</key>
<![CDATA[<a href="https://docs.umbraco.com/umbraco-cms/fundamentals/data/scheduled-publishing#timezones" target="_blank" rel="noopener">Was bedeutet dies?</a>]]></key>
<key alias="nestedContentDeleteItem">Wollen Sie dieses Element wirklich entfernen?</key>
<key alias="nestedContentEditorNotSupported">Eigenschaft %0% verwendet Editor %1%, welcher nicht von Nested Content unterstützt wird.</key>
<key alias="nestedContentNoContentTypes">Es wurden keine Dokument-(Inhalts-)Typen für diese Eigenschaft definiert.</key>
<key alias="nestedContentDeleteAllItems">Sicher das Sie alle Elemente entfernen wollen?</key>
<key alias="nestedContentEditorNotSupported">Eigenschaft %0% verwendet Editor %1%,
welcher nicht von Nested Content unterstützt wird.
</key>
<key alias="nestedContentNoContentTypes">Keine Dokument-Typen für diese Eigenschaft konfiguriert.</key>
<key alias="nestedContentAddElementType">Elementtyp hinzufügen</key>
<key alias="nestedContentSelectElementTypeModalTitle">Elementtype auswählen</key>
<key alias="nestedContentGroupHelpText">Wählen Sie die Gruppe aus von der die Eigenschaften angezeigt werden soll. Sollte der Wert leer sein
wird die erste Gruppe des Elementtypen verwendet.
</key>
<key alias="nestedContentTemplateHelpTextPart1">Geben Sie eine Angular Anweisung an um den Namen für das jweilige Element
zu bestimmen. Verwende
</key>
<key alias="nestedContentTemplateHelpTextPart2">um den Index des Elements anzuzeigen.</key>
<key alias="nestedContentNoGroups">Das ausgewählte Element verfügt nicht über unterstützte Gruppen. (Tabs werden von diesem Editor nicht unterstützt, entweder Sie ändern diese zu Gruppen oder Sie verwenden den Block List Editor.</key>
<key alias="addTextBox">Füge ein weiteres Textfeld hinzu</key>
<key alias="removeTextBox">Entferne dieses Textfeld</key>
<key alias="contentRoot">Inhalt-Basis</key>
<key alias="includeUnpublished">Inklusive Entwürfen: veröffentliche auch unveröffentlichte Elemente.</key>
<key alias="isSensitiveValue">Dieser Wert ist verborgen. Wenn Sie diesen Wert einsehen müssen, wenden Sie sich bitte an einen Administrator.</key>
<key alias="isSensitiveValue">Dieser Wert ist verborgen.
Wenn Sie diesen Wert einsehen müssen, wenden Sie sich bitte an einen Administrator.
</key>
<key alias="isSensitiveValue_short">Dieser Wert ist verborgen.</key>
<key alias="languagesToPublish">Welche Sprache möchten Sie veröffentlichen?</key>
<key alias="languagesToSendForApproval">Welche Sprachen möchten Sie zur Freigabe schicken?</key>
<key alias="languagesToSchedule">Welche Sprachen möchten Sie zu einer bestimmten Zeit veröffentlichen?</key>
<key alias="languagesToUnpublish">Wählen Sie die Sprachen, deren Veröffentlichung zurück genommen werden soll. Das Zurücknehmen der Veröffentlichung einer Pflichtsprache betrifft alle Sprachen.</key>
<key alias="languagesToUnpublish">Wählen Sie die Sprachen, deren Veröffentlichung zurück genommen werden soll.
Das Zurücknehmen der Veröffentlichung einer Pflichtsprache betrifft alle Sprachen.
</key>
<key alias="variantsWillBeSaved">Alle neuen Variationen werden gespeichert.</key>
<key alias="variantsToPublish">Welche Variationen wollen Sie veröffentlichen?</key>
<key alias="variantsToSave">Wählen Sie welche Variation gespeichert werden soll.</key>
<key alias="publishRequiresVariants">Folgende Variationen werden benötigt um das Element veröffentlichen zu können: </key>
<key alias="notReadyToPublish">Wir sind für Veröffentlichungen bereit</key>
<key alias="readyToPublish">Bereit zu Veröffentlichen?</key>
<key alias="readyToSave">Bereit zu Sichern?</key>
<key alias="resetFocalPoint">Fokus zurücksetzten.</key>
<key alias="sendForApproval">Freigabe anfordern</key>
<key alias="schedulePublishHelp">Wählen Sie Datum und Uhrzeit für die Veröffentlichung bzw. deren Rücknahme.</key>
<key alias="createEmpty">Neues Element anlegen</key>
<key alias="createFromClipboard">Aus der Zwischenablage einfügen</key>
<key alias="nodeIsInTrash">Dieses Element befindet sich im Papierkorb.</key>
<key alias="variantSaveNotAllowed">Speichern ist nicht erlaubt.</key>
<key alias="variantPublishNotAllowed">Veröffentlichen ist nicht erlaubt.</key>
<key alias="variantSendForApprovalNotAllowed">Zur Genehmigung senden ist nicht erlaubt.</key>
<key alias="variantScheduleNotAllowed">Plannung ist nicht erlaubt</key>
<key alias="variantUnpublishNotAllowed">Veröffentlichung zurücknehmen ist nicht erlaubt.</key>
</area>
<area alias="blueprints">
<key alias="createBlueprintFrom"><![CDATA[Erzeuge eine neue Inhaltsvorlage von <em>%0%</em>]]></key>
@@ -301,22 +335,46 @@
<key alias="createdBlueprintHeading">Inhaltsvorlage erzeugt</key>
<key alias="createdBlueprintMessage">Inhaltsvorlage von '%0%' wurde erzeugt</key>
<key alias="duplicateBlueprintMessage">Eine gleichnamige Inhaltsvorlage ist bereits vorhanden</key>
<key alias="blueprintDescription">Eine Inhaltsvorlage ist vordefinierter Inhalt, den ein Redakteur als Basis für neuen Inhalt verwenden kann</key>
<key alias="blueprintDescription">Eine Inhaltsvorlage ist vordefinierter Inhalt,
den ein Redakteur als Basis für neuen Inhalt verwenden kann
</key>
</area>
<area alias="media">
<key alias="clickToUpload">Für Upload klicken</key>
<key alias="orClickHereToUpload">oder klicken Sie hier um eine Datei zu wählen</key>
<key alias="disallowedFileType">Dieser Dateityp darf nicht hochgeladen werden</key>
<key alias="invalidFileName">Diese Datei kann nicht hochgeladen werden wil der Dateiname ungültig ist.</key><key alias="disallowedMediaType">Diese Datei kann nicht hochgeladen werden, der Medienttype mit dem Alias '%0%' ist hier nicht erlaubt.</key>
<key alias="maxFileSize">Max. Dateigröße ist</key>
<key alias="mediaRoot">Media-Basis</key>
<key alias="moveToSameFolderFailed">Eltern- und Ziel-Verzeichnis dürfen nicht übereinstimmen</key>
<key alias="createFolderFailed">Unter Element Id %0% konnte kein Verzeichnis angelegt werden</key>
<key alias="renameFolderFailed">Das Verzeichnis mit Id %0% konnte nicht umbenannt werden</key>
<key alias="dragAndDropYourFilesIntoTheArea">Wählen Sie Dateien aus und ziehen Sie diese in diesen Bereich</key>
<key alias="uploadNotAllowed">Hochladen ist in diesem Bereich nicht erlaubt.</key>
</area>
<area alias="member">
<key alias="createNewMember">Neues Mitglied anlegen</key>
<key alias="allMembers">Alle Mitglieder</key>
<key alias="duplicateMemberLogin">Ein Mitglied mit diesem Login existiert bereits.</key>
<key alias="memberGroupNoProperties">Mitgliedsgruppen haben keine weiteren editierbaren Eigenschaften.</key>
<key alias="memberHasGroup">Das Mitglied ist bereits in der Gruppe '%0%'</key>
<key alias="memberHasPassword">Das Mitglied hat bereits ein Passwort</key>
<key alias="memberLockoutNotEnabled">Sperren ist nicht aktiviert für dieses Mitglied.</key>
<key alias="memberNotInGroup">Das Mitglied ist nicht in der Gruppe '%0%'</key>
<key alias="2fa">Zwei-Faktor-Authentifizierung</key>
</area>
<area alias="contentType">
<key alias="copyFailed">Kopieren des Dokumenttyps fehlgeschlagen</key>
<key alias="moveFailed">Bewegen des Dokumenttyps fehlgeschlagen</key>
</area>
<area alias="mediaType">
<key alias="copyFailed">Kopieren des Medienttyps fehlgeschlagen</key>
<key alias="moveFailed">Bewegen des Medienttyps fehlgeschlagen</key>
<key alias="autoPickMediaType">Automatische auswahl.</key>
</area>
<area alias="memberType">
<key alias="copyFailed">Kopieren des Mitgliedtyps fehlgeschlagen</key>
</area>
<area alias="create">
<key alias="chooseNode">An welcher Stellen wollen Sie das Element erstellen</key>
@@ -324,13 +382,44 @@
<key alias="createContentBlueprint">Wählen Sie einen Dokumenttyp für eine Inhaltsvorlage</key>
<key alias="enterFolderName">Geben Sie einen Verzeichnisnamen ein</key>
<key alias="updateData">Wählen Sie einen Namen und einen Typ</key>
<key alias="noDocumentTypes" version="7.0"><![CDATA[Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren.]]></key>
<key alias="noDocumentTypesWithNoSettingsAccess">Die im Inhaltsbaum ausgewählte Seite erlaubt keine Unterseiten.</key>
<key alias="noDocumentTypes" version="7.0">
<![CDATA[Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren.]]></key>
<key alias="noDocumentTypesAtRoot">
<![CDATA[Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren.]]></key>
<key alias="noDocumentTypesWithNoSettingsAccess">Die im Inhaltsbaum ausgewählte Seite
erlaubt keine Unterseiten.
</key>
<key alias="noDocumentTypesEditPermissions">Bearbeitungsrechte für diesen Dokumenttyp</key>
<key alias="noMediaTypes" version="7.0"><![CDATA[Es stehen keine erlaubten Medientypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Medientypen") aktivieren.]]></key>
<key alias="noMediaTypesWithNoSettingsAccess">Das im Strukturbaum ausgewählte Medienelement erlaubt keine untergeordneten Elemente.</key>
<key alias="noDocumentTypesCreateNew">Neuen Dokumenttypen erstellen</key>
<key alias="noDocumentTypesAllowedAtRoot">
<![CDATA[Keine Dokumenttypen vorhanden welche hier eingefügt werden dürfen. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren.]]></key>
<key alias="noMediaTypes" version="7.0"><![CDATA[Es stehen keine erlaubten Medientypen zur Verfügung.
Sie müssen diese in den Einstellungen (unter "Medientypen") aktivieren.]]></key>
<key alias="noMediaTypesWithNoSettingsAccess">Das im Strukturbaum ausgewählte Medienelement
erlaubt keine untergeordneten Elemente.
</key>
<key alias="noMediaTypesEditPermissions">Bearbeitungsrechte für diesen Medientyp</key>
<key alias="documentTypeWithoutTemplate">Dokumenttyp ohne Vorlage</key>
<key alias="documentTypeWithTemplate">Dokumenttyp mit Template</key>
<key alias="documentTypeWithTemplateDescription">Die Definition für eine Inhaltsseite welche von einem
Redakteur im Inhaltsbaum angelgt werden können und direkt über die URL aufgerufen werden kann.
</key>
<key alias="documentType">Dokumenttype</key>
<key alias="documentTypeDescription">Die Definition für eine Inhaltsseite welche von einem
Redakteur im Inhaltsbaum angelgt werden können und direkt über die URL aufgerufen werden kann.
</key>
<key alias="elementType">Elementtyp</key>
<key alias="elementTypeDescription">Definiert die Vorlage für sich wiederholende Eigenschaften, zum Beispiel, in einer 'Block
List' oder im 'Nested Content' Editor.
</key>
<key alias="composition">Komposition</key>
<key alias="compositionDescription">Definiert eine wiederverwendbare Komposition von Eigenschaften welche in anderen
Dokumenttypen wiederverwendet werden können.
</key>
<key alias="folder">Ordner</key>
<key alias="folderDescription">Werden benützt um Dokumenttypen, Komposition und Elementtypen in diesem
Dokumenttypbaums zu organisieren.
</key>
<key alias="newFolder">Neues Verzeichnis</key>
<key alias="newDataType">Neuer Datentyp</key>
<key alias="newJavascriptFile">Neue JavaScript-Datei</key>
@@ -355,11 +444,17 @@
<key alias="stay">Bleiben</key>
<key alias="discardChanges">Änderungen verwerfen</key>
<key alias="unsavedChanges">Es gibt ungesicherte Änderungen</key>
<key alias="unsavedChangesWarning">Wollen Sie diese Seite wirklich verlassen? - es gibt ungesicherte Änderungen</key>
<key alias="unsavedChangesWarning">Wollen Sie diese Seite wirklich verlassen?
- es gibt ungesicherte Änderungen
</key>
<key alias="confirmListViewPublish">Veröffentlichen macht die ausgewählten Elemente auf der Website sichtbar.</key>
<key alias="confirmListViewUnpublish">Aufheben der Veröffentlichung entfernt die ausgewählten Elemente und ihre Unterknoten von der Website.</key>
<key alias="confirmListViewUnpublish">Aufheben der Veröffentlichung entfernt die ausgewählten Elemente
und ihre Unterknoten von der Website.
</key>
<key alias="confirmUnpublish">Aufheben der Veröffentlichung entfernt diese Seite und ihre Unterseiten von der Website.</key>
<key alias="doctypeChangeWarning">Es gibt ungesicherte Änderungen. Ändern des Dokumenttyps macht diese rückgängig.</key>
<key alias="doctypeChangeWarning">Es gibt ungesicherte Änderungen.
Ändern des Dokumenttyps macht diese rückgängig.
</key>
</area>
<area alias="bulk">
<key alias="done">Fertig</key>
@@ -391,12 +486,16 @@
<key alias="anchorInsert">Name</key>
<key alias="closeThisWindow">Fenster schließen</key>
<key alias="confirmdelete">Wollen Sie dies wirklich entfernen</key>
<key alias="confirmdeleteNumberOfItems"><![CDATA[Sicher das Sie <strong>%0%</strong> von <strong>%1%</strong> Elementen löschen wollen?]]></key>
<key alias="confirmdisable">Wollen Sie folgendes wirklich deaktivieren</key>
<key alias="confirmremove">Sicher das Sie es entfernen wollen?</key>
<key alias="confirmremoveusageof"><![CDATA[Sicher das Sie die Verwendung von <strong>%0%</strong> entfernen wollen?]]></key>
<key alias="confirmlogout">Sind Sie sich wirklich abmelden?</key>
<key alias="confirmSure">Sind Sie sicher?</key>
<key alias="cut">Ausschneiden</key>
<key alias="editdictionary">Wörterbucheintrag bearbeiten</key>
<key alias="editlanguage">Sprache bearbeiten</key>
<key alias="editSelectedMedia">Ausgewähltes Medien</key>
<key alias="insertAnchor">Anker einfügen</key>
<key alias="insertCharacter">Zeichen einfügen</key>
<key alias="insertgraphicheadline">Grafische Überschrift einfügen</key>
@@ -406,7 +505,8 @@
<key alias="inserttable">Tabelle einfügen</key>
<key alias="languagedeletewarning">Dies entfernt die Sprache</key>
<key alias="languageChangeWarning">
Die Kultur-Variante einer Sprache zu ändern ist möglicherweise eine aufwendige Operation und führt zum Erneuern von Inhalts-Zwischenspeicher und Such-Index.</key>
Die Kultur-Variante einer Sprache zu ändern ist möglicherweise eine aufwendige Operation und führt zum Erneuern von Inhalts-Zwischenspeicher und Such-Index.
</key>
<key alias="lastEdited">Zuletzt bearbeitet</key>
<key alias="link">Verknüpfung</key>
<key alias="linkinternal">Anker:</key>
@@ -418,16 +518,25 @@
<key alias="permissionsSet">Berechtigungen vergeben für</key>
<key alias="permissionsSetForGroup">Berechtigungen vergeben für %0% für Benutzer-Gruppe %1%</key>
<key alias="permissionsHelp">Wählen Sie die Benutzer-Gruppe, deren Berechtigungen Sie setzen möchten</key>
<key alias="recycleBinDeleting">Der Papierkorb wird geleert. Bitte warten Sie und schließen Sie das Fenster erst, wenn der Vorgang abgeschlossen ist.</key>
<key alias="recycleBinDeleting">Der Papierkorb wird geleert.
Bitte warten Sie und schließen Sie das Fenster erst, wenn der Vorgang abgeschlossen ist.
</key>
<key alias="recycleBinIsEmpty">Der Papierkorb ist leer</key>
<key alias="recycleBinWarning">Wenn Sie den Papierkorb leeren, werden die enthaltenen Elemente endgültig gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.</key>
<key alias="regexSearchError">Der Webservice von &lt;a target='_blank' rel='noopener' href='http://regexlib.com'&gt;regexlib.com&lt;/a&gt; ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut.</key>
<key alias="regexSearchHelp">Finden Sie einen vorbereiteten regulären Ausdruck zur Validierung der Werte, die in dieses Feld eingegeben werden - zum Beispiel 'email, 'plz', 'URL' oder ähnlich.</key>
<key alias="regexSearchError">
Der Webservice von &lt;a target='_blank' rel='noopener' href='http://regexlib.com'&gt;regexlib.com&lt;/a&gt; ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut.</key>
<key alias="regexSearchHelp">
Finden Sie einen vorbereiteten regulären Ausdruck zur Validierung der Werte, die in dieses Feld eingegeben werden - zum Beispiel 'email, 'plz', 'URL' oder ähnlich.
</key>
<key alias="removeMacro">Macro entfernen</key>
<key alias="requiredField">Pflichtfeld</key>
<key alias="sitereindexed">Die Website-Index wurd neu erstellt</key>
<key alias="siterepublished">Der Zwischenspeicher der Website wurde aktualisiert und alle veröffentlichten Inhalte sind jetzt auf dem neuesten Stand. Bisher unveröffentliche Inhalte wurden dabei nicht veröffentlicht.</key>
<key alias="siterepublishHelp">Der Zwischenspeicher der Website wird aktualisiert und der veröffentlichte Inhalt auf den neuesten Stand gebracht. Unveröffentlichte Inhalte bleiben dabei weiterhin unveröffentlicht.</key>
<key alias="siterepublished">Der Zwischenspeicher der Website wurde aktualisiert und alle veröffentlichten Inhalte sind jetzt auf dem neuesten Stand.
Bisher unveröffentliche Inhalte wurden dabei nicht veröffentlicht.
</key>
<key alias="siterepublishHelp">Der Zwischenspeicher der Website wird aktualisiert und der veröffentlichte Inhalt auf den neuesten Stand gebracht.
Unveröffentlichte Inhalte bleiben dabei weiterhin unveröffentlicht.
</key>
<key alias="tableColumns">Anzahl der Spalten</key>
<key alias="tableRows">Anzahl der Zeilen</key>
<key alias="thumbnailimageclickfororiginal">Für Originalgröße auf die Abbildung klicken</key>
@@ -441,6 +550,7 @@
<key alias="linkToMedia">Medien-Link</key>
<key alias="selectContentStartNode">Inhalts-Startknoten wählen</key>
<key alias="selectMedia">Medienelement wählen</key>
<key alias="selectMediaType">Medientype wählen</key>
<key alias="selectIcon">Bildzeichen wählen</key>
<key alias="selectItem">Element wählen</key>
<key alias="selectLink">Link wählen</key>
@@ -450,8 +560,11 @@
<key alias="selectMediaStartNode">Medien-Startknoten wählen</key>
<key alias="selectMember">Mitglied wählen</key>
<key alias="selectMemberGroup">Mitgliedergruppe wählen</key>
<key alias="selectMemberType">Membertype wählen</key>
<key alias="selectNode">Knoten wählen</key>
<key alias="selectSections">Bereich wählen</key>
<key alias="selectLanguages">Sprachen wählen</key>
<key alias="selectUser">Benutzer wählen</key>
<key alias="selectUsers">Benutzer wählen</key>
<key alias="noIconsFound">Keine Bildzeichen gefunden</key>
<key alias="noMacroParams">Für dieses Makro gibt es keine Parameter</key>
@@ -464,42 +577,50 @@
<key alias="unLinkYour">Trennen Sie Ihr</key>
<key alias="account">Konto</key>
<key alias="selectEditor">Editor wählen</key>
<key alias="selectEditorConfiguration">Konfiguration wählen</key>
<key alias="selectSnippet">Kode-Vorlage wählen</key>
<key alias="variantdeletewarning">
Dies wird den Knoten und all seine Sprachen entfernen.
<key alias="variantdeletewarning">Dies wird den Knoten und all seine Sprachen entfernen.
Wenn Sie nur eine Sprache entfernen wollen, wählen Sie diese und setzen sie auf unveröffentlicht.
</key>
<key alias="propertyuserpickerremovewarning"><![CDATA[Dies entfernt den User <strong>%0%</strong>.]]></key>
<key alias="userremovewarning"><![CDATA[Dies entfernt den User <strong>%0%</strong> von der <strong>%1%</strong> Gruppe]]></key>
<key alias="yesRemove">Ja, entfernen</key>
<key alias="deleteLayout">Sie löschen das Layout</key>
<key alias="deletingALayout">Bearbeiten des layout resultiert im Verlust der aller Daten für bestehenden Inhalt basierend auf dieser Konfiruation.</key>
</area>
<area alias="dictionary">
<key alias="importDictionaryItemHelp">
Um einen Eintrag zu importieren, suchen sie die ".udt" Datei auf ihren Computer durch Klicken des
"Import" Knopfes. (Sie werden für Ihre Zustimmung im nächsten Schritt gefragt)
</key>
<key alias="itemDoesNotExists">Wörterbuch Eintrag existiert nicht.</key>
<key alias="parentDoesNotExists">Eltern Element existiert nicht.</key>
<key alias="noItems">Es gibt keine Einträge im Wörterbuch.</key>
<key alias="noItemsInFile">Keine Wörterbuch Einträge in dieser Datei gefunden.</key>
<key alias="noItemsFound">Keine Wörterbuch Einträge gefunden.</key>
<key alias="createNew">Eintrag erstellen</key>
</area>
<area alias="dictionaryItem">
<key alias="description">
<![CDATA[
<key alias="description"><![CDATA[
Bearbeiten Sie nachfolgend die verschiedenen Sprachversionen für den Wörterbucheintrag '<em>%0%</em>'.
<br/>Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen.
]]>
</key>
<br/>Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen.]]></key>
<key alias="displayName">Name der Kultur</key>
<key alias="changeKeyError">
<![CDATA[
<key alias="changeKeyError"><![CDATA[
Der Wert '%0%' ist bereits vorhanden.
]]>
</key>
]]></key>
<key alias="overviewTitle">Wörterbuch Übersicht</key>
</area>
<area alias="examineManagement">
<key alias="configuredSearchers"><![CDATA[<em>Sucher</em> einrichten ]]></key>
<key alias="configuredSearchersDescription">
<![CDATA[
Zeigt die Eigenschaften und Werkzeuge für eingerichtete <em>Sucher</em> (z.B.: multi-index searcher)
]]>
</key>
Zeigt die Eigenschaften und Werkzeuge für eingerichtete <em>Sucher</em> (z.B.: multi-index searcher)]]></key>
<key alias="fieldValues">Feldwerte</key>
<key alias="healthStatus">Gesundheitsstatus</key>
<key alias="healthStatusDescription">Der Gesundheitsstatus und Lesbarkeit des Indizes.</key>
<key alias="indexers">Indizierer</key>
<key alias="indexInfo">Indexinformationen</key>
<key alias="contentInIndex">Inhalt des Indexes</key>
<key alias="indexInfoDescription">Zeigt die Eigenschaften des Indizes</key>
<key alias="manageIndexes">Examine Index-Verwaltung</key>
<key alias="manageIndexesDescription">
@@ -511,12 +632,18 @@
Dies erzeugt den Index neu.<br />
Abhängig von der Inhaltsmenge Ihrer <em>Website</em> kann das eingie Zeit dauern.<br />
Es wird davon abgeraten, einen Index einer <em>Website</em> während hoher Auslastung- oder Inhaltbearbeitungszeiten zu erneuern.
]]>
</key>
]]></key>
<key alias="searchers">Sucher</key>
<key alias="searchDescription">Durchsuche den Index und betrachte die Ergebnisse</key>
<key alias="tools">Werkzeuge</key>
<key alias="toolsDescription">Werkzeuge zur Indexverwaltung</key>
<key alias="fields">Felder</key>
<key alias="indexCannotRead">Der Index kann nicht gelesen werden und wird deshalb neu erstellt.</key>
<key alias="processIsTakingLonger">Der Prozess dauert länger als erwartet, checken Sie die Umbraco Logs um zu sehen ob
Fehler passiert sind.
</key>
<key alias="indexCannotRebuild">Der Index kann nicht rebuilded werden weil er nicht zugewissen wurde.</key>
<key alias="iIndexPopulator">IIndexPopulator</key>
</area>
<area alias="placeholders">
<key alias="username">Benutzername eingeben</key>
@@ -537,6 +664,9 @@
<key alias="anchor">#value oder ?key=value</key>
<key alias="enterAlias">Bitte einen Alias eingeben...</key>
<key alias="generatingAlias">Alias erzeugen...</key>
<key alias="a11yCreateItem">Element erstellen</key>
<key alias="a11yEdit">Bearbeiten</key>
<key alias="a11yName">Benennen</key>
</area>
<area alias="editcontenttype">
<key alias="createListView" version="7.2">Angepasste Listenansicht erstellen</key>
@@ -549,6 +679,7 @@
<key alias="folderWasRenamed">%0% wurde umbenannt in %1%</key>
</area>
<area alias="editdatatype">
<key alias="canChangePropertyEditorHelp">Ändern des Editors in einem Datatyps mit gespeicherten Werten ist nicht erlaubt. Um es zu erlauben müssen Sie die Umbraco:CMS:DataTypes:CanBeChanged Einstellung in der appsettings.json ändern.</key>
<key alias="addPrevalue">Neuer Vorgabewert</key>
<key alias="dataBaseDatatype">Feldtyp in der Datenbank</key>
<key alias="guid">Datentyp-GUID</key>
@@ -563,14 +694,25 @@
<key alias="selectFolder">Wählen Sie das Verzeichnis aus der untenstehenden Baumstruktur, in das</key>
<key alias="inTheTree">verschoben werden soll.</key>
<key alias="wasMoved">wurde verschoben in</key>
<key alias="hasReferencesDeleteConsequence">
<![CDATA[Löschen von <strong>%0%</strong> wird die Eigenschaften und Daten von folgenden Element löschen]]></key>
<key alias="acceptDeleteConsequence">Ich verstehe das diese Aktion Eigenschaften und Daten basierend auf diesem
DataTyps löschen wird.
</key>
</area>
<area alias="errorHandling">
<key alias="errorButDataWasSaved">Ihre Daten wurden gespeichert. Bevor Sie diese Seite jedoch veröffentlichen können, müssen Sie die folgenden Korrekturen vornehmen:</key>
<key alias="errorChangingProviderPassword">Der aktuelle Mitgliedschaftsanbieter erlaubt keine Kennwortänderung (EnablePasswordRetrieval muss auf "true" gesetzt sein)</key>
<key alias="errorButDataWasSaved">Ihre Daten wurden gespeichert.
Bevor Sie diese Seite jedoch veröffentlichen können, müssen Sie die folgenden Korrekturen vornehmen:
</key>
<key alias="errorChangingProviderPassword">Der aktuelle Mitgliedschaftsanbieter erlaubt keine Kennwortänderung
(EnablePasswordRetrieval muss auf "true" gesetzt sein)
</key>
<key alias="errorExistsWithoutTab">'%0%' ist bereits vorhanden</key>
<key alias="errorHeader">Bitte prüfen und korrigieren:</key>
<key alias="errorHeaderWithoutTab">Bitte prüfen und korrigieren:</key>
<key alias="errorInPasswordFormat">Für das Kennwort ist eine Mindestlänge von %0% Zeichen vorgesehen, wovon mindestens %1% Sonderzeichen (nicht alphanumerisch) sein müssen</key>
<key alias="errorInPasswordFormat">Für das Kennwort ist eine Mindestlänge von %0% Zeichen vorgesehen,
wovon mindestens %1% Sonderzeichen (nicht alphanumerisch) sein müssen
</key>
<key alias="errorIntegerWithoutTab">'%0%' muss eine Zahl sein</key>
<key alias="errorMandatory">'%0%' (in Registerkarte '%1%') ist ein Pflichtfeld</key>
<key alias="errorMandatoryWithoutTab">'%0%' ist ein Pflichtfeld</key>
@@ -578,20 +720,27 @@
<key alias="errorRegExpWithoutTab">'%0%' hat ein falsches Format</key>
</area>
<area alias="errors">
<key alias="defaultError">Ein unbekannter Fehler ist passiert.</key>
<key alias="concurrencyError">Optimistic concurrency Fehler, Objekte wurde geändert.</key>
<key alias="receivedErrorFromServer">Der Server hat einen Fehler gemeldet</key>
<key alias="dissallowedMediaType">Dieser Dateityp wird durch die Systemeinstellungen blockiert</key>
<key alias="codemirroriewarning">ACHTUNG! Obwohl CodeMirror in den Einstellungen aktiviert ist, bleibt das Modul wegen mangelnder Stabilität in Internet Explorer deaktiviert.</key>
<key alias="codemirroriewarning">ACHTUNG! Obwohl CodeMirror in den Einstellungen aktiviert ist,
bleibt das Modul wegen mangelnder Stabilität in Internet Explorer deaktiviert.
</key>
<key alias="contentTypeAliasAndNameNotNull">Bitte geben Sie die Bezeichnung und den Alias des neuen Dokumenttyps ein.</key>
<key alias="filePermissionsError">Es besteht ein Problem mit den Lese-/Schreibrechten auf eine Datei oder einen Ordner</key>
<key alias="macroErrorLoadingPartialView">Fehler beim Laden einer "Partial View Kodedatei" (Datei: %0%)</key>
<key alias="missingTitle">Bitte geben Sie einen Titel ein</key>
<key alias="missingType">Bitte wählen Sie einen Typ</key>
<key alias="pictureResizeBiggerThanOrg">Soll die Abbildung wirklich über die Originalgröße hinaus vergrößert werden?</key>
<key alias="pictureResizeBiggerThanOrg">Soll die Abbildung wirklich über die
Originalgröße hinaus vergrößert werden?
</key>
<key alias="startNodeDoesNotExists">Startelement gelöscht, bitte kontaktieren Sie den System-Administrator.</key>
<key alias="stylesMustMarkBeforeSelect">Bitte markieren Sie den gewünschten Text, bevor Sie einen Stil auswählen</key>
<key alias="stylesNoStylesOnPage">Keine aktiven Stile vorhanden</key>
<key alias="tableColMergeLeft">Bitte platzieren Sie den Mauszeiger in die erste der zusammenzuführenden Zellen</key>
<key alias="tableSplitNotSplittable">Sie können keine Zelle trennen, die nicht zuvor aus mehreren zusammengeführt wurde.</key>
<key alias="propertyHasErrors">Die Eigenschaft ist nicht valide</key>
</area>
<area alias="general">
<key alias="options">Optionen</key>
@@ -610,16 +759,18 @@
<key alias="cellMargin">Zellabstand</key>
<key alias="choose">Auswählen</key>
<key alias="close">Schließen</key>
<key alias="clear">Leeren</key>
<key alias="closewindow">Fenster schließen</key>
<key alias="closepane">Fenster Pane</key>
<key alias="comment">Kommentar</key>
<key alias="confirm">bestätigen</key>
<key alias="constrain">Beschneiden</key>
<!--???-->
<key alias="constrainProportions">Seitenverhältnis beibehalten</key>
<key alias="content">Inhalt</key>
<key alias="continue">Weiter</key>
<key alias="copy">Kopieren</key>
<key alias="create">Neu</key>
<key alias="cropSection">Ausschnitte Bereich</key>
<key alias="database">Datenbank</key>
<key alias="date">Datum</key>
<key alias="default">Standard</key>
@@ -629,6 +780,7 @@
<key alias="design">Design</key>
<key alias="dictionary">Wörterbuch</key>
<key alias="dimensions">Abmessungen</key>
<key alias="discard">Verwerfen</key>
<key alias="down">nach unten</key>
<key alias="download">Herunterladen</key>
<key alias="edit">Bearbeiten</key>
@@ -641,6 +793,8 @@
<key alias="first">Erste(s)</key>
<key alias="general">Allgemein</key>
<key alias="groups">Gruppen</key>
<key alias="groups">Gruppe</key>
<key alias="generic">Generisch</key>
<key alias="group">Gruppe</key>
<key alias="height">Höhe</key>
<key alias="help">Hilfe</key>
@@ -649,6 +803,7 @@
<key alias="icon">Bildzeichen</key>
<key alias="id">Id</key>
<key alias="import">Import</key>
<key alias="excludeFromSubFolders">Nur in diesem Ordner suchen</key>
<key alias="info">Info</key>
<key alias="innerMargin">Innerer Abstand</key>
<key alias="insert">Einfügen</key>
@@ -667,18 +822,19 @@
<key alias="logout">Abmelden</key>
<key alias="macro">Makro</key>
<key alias="mandatory">Pflichtfeld</key>
<key alias="media">Medien</key>
<key alias="message">Nachricht</key>
<key alias="move">Verschieben</key>
<key alias="name">Name</key>
<key alias="new">Neu</key>
<key alias="next">Weiter</key>
<key alias="no">Nein</key>
<key alias="nodeName">Knoten Name</key>
<key alias="of">von</key>
<key alias="off">Aus</key>
<key alias="ok">Ok</key>
<key alias="open">Öffnen</key>
<key alias="on">An</key>
<!--???-->
<key alias="or">oder</key>
<key alias="orderBy">Sortieren nach</key>
<key alias="password">Kennwort</key>
@@ -686,6 +842,7 @@
<key alias="pleasewait">Einen Moment bitte...</key>
<key alias="previous">Zurück</key>
<key alias="properties">Eigenschaften</key>
<key alias="readMore">Mehr erfahren</key>
<key alias="rebuild">Erneuern</key>
<key alias="reciept">E-Mail-Empfänger für die Formulardaten</key>
<key alias="recycleBin">Papierkorb</key>
@@ -693,6 +850,7 @@
<key alias="reload">Neu laden</key>
<key alias="remaining">Verbleibend</key>
<key alias="remove">Entfernen</key>
<key alias="revert">Rückgängig</key>
<key alias="rename">Umbenennen</key>
<key alias="renew">Erneuern</key>
<key alias="required" version="7.0">Pflichtangabe</key>
@@ -700,18 +858,22 @@
<key alias="retry">Wiederholen</key>
<key alias="rights">Berechtigungen</key>
<key alias="scheduledPublishing">Geplantes Veröffentlichen</key>
<key alias="umbracoInfo">Umbraco Information</key>
<key alias="search">Suchen</key>
<key alias="searchNoResult">Leider können wir nicht finden, wonach Sie suchen.</key>
<key alias="noItemsInList">Es wurden keine Elemente hinzugefügt</key>
<key alias="server">Server</key>
<key alias="settings">Einstellungen</key>
<key alias="shared">Geteilt</key>
<key alias="show">Anzeigen</key>
<key alias="showPageOnSend">Seite beim Senden anzeigen</key>
<key alias="size">Größe</key>
<key alias="sort">Sortieren</key>
<key alias="status">Status</key>
<key alias="submit">Senden</key>
<key alias="success">Erfolt</key>
<key alias="type">Typ</key>
<key alias="typeName">Typ Name</key>
<key alias="typeToSearch">Durchsuchen ...</key>
<key alias="under">unter</key>
<key alias="up">nach oben</key>
@@ -721,6 +883,7 @@
<key alias="url">URL</key>
<key alias="user">Benutzer</key>
<key alias="username">Benutzername</key>
<key alias="validate">Validieren</key>
<key alias="value">Wert</key>
<key alias="view">Ansicht</key>
<key alias="welcome">Willkommen ...</key>
@@ -733,17 +896,24 @@
<key alias="preview">Vorschau</key>
<key alias="changePassword">Kennwort ändern</key>
<key alias="to">nach</key>
<!--???-->
<key alias="listView">Listenansicht</key>
<key alias="saving">Sichern läuft...</key>
<key alias="current">Aktuelle(s)</key>
<key alias="embed">Eingebettet</key>
<key alias="selected">ausgewählt</key>
<key alias="other">Anderes</key>
<key alias="articles">Artikel</key>
<key alias="videos">Videos</key>
<key alias="avatar">Avatar für</key>
<key alias="header">Kopf</key>
<key alias="systemField">System Feld</key>
<key alias="lastUpdated">Zuletzt geändert</key>
</area>
<area alias="colors">
<key alias="blue">Blau</key>
</area>
<area alias="shortcuts">
<key alias="addTab">Tab hinzufügen</key>
<key alias="addGroup">Neue Gruppe</key>
<key alias="addProperty">Neue Eigenschaft</key>
<key alias="addEditor">Editor hinzufügen</key>
@@ -778,14 +948,17 @@
</area>
<area alias="installer">
<key alias="databaseErrorCannotConnect">Mit dieser Datenbank kann leider keine Verbindung hergestellt werden.</key>
<key alias="databaseErrorWebConfig">Appsettings.json Datei konnte nicht gespeichert werden. Bitte ändern Sie die Datei
manuell.
</key>
<key alias="databaseFound">Die Datenbank ist erreichbar und wurde identifiziert als</key>
<key alias="databaseHeader">Datenbank</key>
<key alias="databaseInstall">
<![CDATA[
Klicken Sie auf <strong>Installieren</strong>, um die Datenbank für Umbraco %0% einzurichten.
]]>
</key>
<key alias="databaseInstallDone">Die Datenbank wurde für Umbraco %0% konfiguriert. Klicken Sie auf &lt;strong&gt;weiter&lt;/strong&gt;, um fortzufahren.</key>
]]></key>
<key alias="databaseInstallDone">Die Datenbank wurde für Umbraco %0% konfiguriert.
Klicken Sie auf &lt;strong&gt;weiter&lt;/strong&gt;, um fortzufahren.</key>
<key alias="databaseText">Um diesen Schritt abzuschließen, müssen Sie die notwendigen Informationen zur Datenbankverbindung angeben.&lt;br /&gt;Bitte kontaktieren Sie Ihren Provider bzw. Server-Administrator für weitere Informationen.</key>
<key alias="databaseUpgrade">
<![CDATA[
@@ -1172,6 +1345,7 @@
Bitte deinstallieren Sie also mit Vorsicht. Falls Sie unsicher sind, kontaktieren Sie den Autor des Pakets.]]>
</key>
<key alias="packageVersion">Paketversion</key>
<key alias="verifiedToWorkOnUmbracoCloud">Bestätigt auf Umbraco Cloud zu funktioneren</key>
</area>
<area alias="paste">
<key alias="doNothing">Einfügen mit Formatierung (Nicht empfohlen)</key>
@@ -1256,6 +1430,22 @@
<key alias="pickedTrashedItem">Sie haben ein entferntes oder im Papierkorb befindliches Medienelement ausgewählt</key>
<key alias="pickedTrashedItems">Sie haben entfernte oder im Papierkorb befindliche medienelemente ausgewählt</key>
<key alias="trashed">Verworfen</key>
<key alias="openMedia">Medien öffnen</key>
<key alias="changeMedia">Medientyp ändern</key>
<key alias="editMediaEntryLabel">Ändere %0% auf %1%</key>
<key alias="confirmCancelMediaEntryCreationHeadline">Erstellen abbrechen?</key>
<key alias="confirmCancelMediaEntryCreationMessage"><![CDATA[Sind Sie sich sicher das Sie das Erstellen abbrechen wollen?]]></key>
<key alias="confirmCancelMediaEntryHasChanges">Sie haben Änderungen an diesem Inhalt vorgenommen. Sind Sie sich sicher das Sie
diese verwerfen wollen?
</key>
<key alias="confirmRemoveAllMediaEntryMessage">Alle Medien löschen?</key>
<key alias="tabClipboard">Clipboard</key>
<key alias="notAllowed">Nicht erlaubt</key>
<key alias="openMediaPicker">Medienpicker öffnen</key>
</area>
<area alias="propertyEditorPicker">
<key alias="title">Wählen Sie einen Editor</key>
<key alias="openPropertyEditorPicker">Editor auswählen</key>
</area>
<area alias="relatedlinks">
<key alias="enterExternal">Externen Link eingeben</key>
@@ -1270,15 +1460,24 @@
<key alias="reset">Zurücksetzen</key>
<key alias="updateEditCrop">Fertig</key>
<key alias="undoEditCrop">Rückgängig machen</key>
<key alias="customCrop">Benutzer definiert</key>
</area>
<area alias="rollback">
<key alias="changes">Änderungen</key>
<key alias="created">Erstellt</key>
<key alias="headline">Wählen Sie eine Version, um diese mit der aktuellen zu vergleichen</key>
<key alias="currentVersion">Aktuelle Version</key>
<key alias="diffHelp">Zeigt die Unterschiede zwischen der aktuellen und der ausgewählten Version an.&lt;br /&gt;Text in &lt;del&gt;rot&lt;/del&gt; fehlen in der ausgewählten Version, &lt;ins&gt;grün&lt;/ins&gt; markierter Text wurde hinzugefügt.</key>
<key alias="noDiff">Keine Unterschiede zwischen den beiden Versionen gefunden.</key>
<key alias="documentRolledBack">Dokument wurde zurückgesetzt</key>
<key alias="htmlHelp">Zeigt die ausgewählte Version als HTML an. Wenn Sie sich die Unterschiede zwischen zwei Versionen anzeigen lassen wollen, benutzen Sie bitte die Vergleichsansicht.</key>
<key alias="rollbackTo">Zurücksetzen auf</key>
<key alias="selectVersion">Version auswählen</key>
<key alias="view">Ansicht</key>
<key alias="pagination"><![CDATA[Zeige Versionen von %0% zu %1% von %2% Versionen]]></key>
<key alias="versions">Versionen</key>
<key alias="currentDraftVersion">Aktulle Bearbeitungs Version</key>
<key alias="currentPublishedVersion">Aktulle veröffentlichte Version</key>
</area>
<area alias="scripts">
<key alias="editscript">Skript bearbeiten</key>
@@ -1294,7 +1493,12 @@
<key alias="users">Benutzer</key>
</area>
<area alias="help">
<key alias="tours">Touren</key>
<key alias="theBestUmbracoVideoTutorials">Die besten Umbraco-Video-Tutorials</key>
<key alias="umbracoForum">Besuche our.umbraco.com</key>
<key alias="umbracoTv">Besuche umbraco.tv</key>
<key alias="umbracoLearningBase">Schaue gratis Tutorials</key>
<key alias="umbracoLearningBaseDescription">von Umbraco Learning Base</key>
</area>
<area alias="settings">
<key alias="defaulttemplate">Standardvorlage</key>
@@ -1639,6 +1843,12 @@
falls die angefragte Sprache nicht verfügbar ist, wählen Sie diese Option hier aus.
</key>
<key alias="fallbackLanguage">Ersatzsprache</key>
<key alias="none">Keine</key>
<key alias="invariantPropertyUnlockHelp"><![CDATA[<strong>%0%</strong> wird zwischen Sprachen und Segmenten geteilt.]]></key>
<key alias="invariantCulturePropertyUnlockHelp"><![CDATA[<strong>%0%</strong> wird zwischen allen Sprachen geteilt.]]></key>
<key alias="invariantSegmentPropertyUnlockHelp"><![CDATA[<strong>%0%</strong> wird zwischen allen Segmenten geteilt.]]></key>
<key alias="invariantLanguageProperty">Geteilt: Sprachen</key>
<key alias="invariantSegmentProperty">Geteilt: Segmente</key>
</area>
<area alias="macro">
<key alias="addParameter">Parameter hinzufügen</key>
@@ -1771,7 +1981,10 @@
<key alias="createDate">Benutzer angelegt</key>
<key alias="changePassword">Kennwort ändern</key>
<key alias="changePhoto">Foto ändern</key>
<key alias="emailRequired">Benötigt - geben Sie eine Email Adresse für diesen User an</key>
<key alias="newPassword">Neues Kennwort</key>
<key alias="newPasswordFormatLengthTip">Noch %0% Zeichen benötigt!</key>
<key alias="newPasswordFormatNonAlphaTip">Es sollten mindestens %0% Sonderzeichen verwendet werden.</key>
<key alias="noLockouts">wurde nicht ausgeschlossen</key>
<key alias="noPasswordChange">Das Kennwort wurde nicht geändert</key>
<key alias="confirmNewPassword">Neues Kennwort (Bestätigung)</key>
@@ -1846,9 +2059,8 @@
<key alias="usergroup">Benutzergruppe</key>
<key alias="userInvited">wurde eingeladen</key>
<key alias="userInvitedSuccessHelp">Eine Einladung mit Anweisungen zur Anmeldung im Umbraco-Back-Office wurde dem neuen Benutzer zugeschickt.</key>
<key alias="userinviteWelcomeMessage">Hallo und Willkommen bei Umbraco! In nur einer Minute sind Sie bereit loszulegen, Sie müssen nur ein Kennwort festlegen und optinal Ihrem Avatar ein Bild hinzufügen.</key>
<key alias="userinviteWelcomeMessage">Hallo und Willkommen bei Umbraco! In nur einer Minute sind Sie bereit loszulegen, Sie müssen nur ein Kennwort festlegen.</key>
<key alias="userinviteExpiredMessage">Willkommen bei Umbraco! Bedauerlicherweise ist Ihre Einladung verfallen. Bitte kontaktieren Sie Ihren Administrator und bitten Sie ihn, diese erneut zu schicken.</key>
<key alias="userinviteAvatarMessage">Laden Sie ein Foto von sich hoch, um es anderen Benutzern zu erleichtern, sie zu erkennen. Klicken Sie auf den Kreis oben, um Ihr Foto hochzuladen.</key>
<key alias="writer">Autor</key>
<key alias="change">Änderung</key>
<!--???-->
@@ -1966,8 +2178,8 @@
<key alias="stateInactive">Nicht aktiv</key>
<key alias="sortNameAscending">Name (A-Z)</key>
<key alias="sortNameDescending">Name (Z-A)</key>
<key alias="sortCreateDateAscending">Newest</key>
<key alias="sortCreateDateDescending">Oldest</key>
<key alias="sortCreateDateAscending">Oldest</key>
<key alias="sortCreateDateDescending">Newest</key>
<key alias="sortLastLoginDateDescending">Last login</key>
</area>
<area alias="validation">
@@ -2118,4 +2330,59 @@
<key alias="selectAllLogLevelFilters">Wählen Sie Alle</key>
<key alias="deselectAllLogLevelFilters">Alle abwählen</key>
</area>
<area alias="formsDashboard">
<key alias="formsHeadline">Umbraco Forms</key>
<key alias="formsDescription">Erstellen Sie Formulare mithilfe einer intuitiven Benutzeroberfläche. Von einfachen Kontaktformularen
die Email verschicken bis hin zu komplexen Fragebögen die mit einem CRM System verbunden sind. Ihre Kunden werden es lieben!
</key>
</area>
<area alias="contentTemplatesDashboard">
<key alias="whatHeadline">Was sind Inhaltsvorlagen?</key>
<key alias="whatDescription">Inhaltsvorlagen sind vordefinierte Inhalte die ausgewählt werden können
wenn Sie einen neuen Inhaltsknoten anlegen wollen.
</key>
<key alias="createHeadline">Wie erstelle ich eine Inhaltsvorlage?</key>
<key alias="createDescription">
<![CDATA[
<p>Es gibt zwei Möglichkeiten eine Inhaltsvorlage zu erstellen:</p>
<ul>
<li>Rechtsklicken Sie einen Inhaltsknoten und wählen Sie "Inhaltsvorlage erstellen" aus.</li>
<li>Rechtsklicken Sie den Inhaltsvorlagen-Baum und wählen Sie den Dokumententypen aus für den Sie eine Vorlage erstellen wollen.</li>
</ul>
<p>Wenn Sie einen Namen vergen haben können Reakteure diese als Vorlage für neue Seiten benutzen.</p>
]]>
</key>
<key alias="manageHeadline">Wie verwalte ich eine Inhaltsvorlage?</key>
<key alias="manageDescription">Sie können Inhaltsvorlagen bearbeiten und löschen in dem Sie im Inhaltsvorlage-Baum die gewünschte
Vorlage auswählen. Außerdem können Sie auch direkt den Dokumenttypen bearbeiten oder löschen auf dem die Vorlage basiert
</key>
</area>
<area alias="preview">
<key alias="endLabel">Beenden</key>
<key alias="endTitle">Vorschau beenden</key>
<key alias="openWebsiteLabel">Website Vorschau</key>
<key alias="openWebsiteTitle">Website in Vorschaumodus öffnen</key>
<key alias="returnToPreviewHeadline">Websitevorschau anzeigen?</key>
<key alias="returnToPreviewDescription">Sie haben den Vorschaumodus beendet, wollen Sie ihn erneut öffnen um
gespeicherte Version der Website anzusehen?
</key>
<key alias="returnToPreviewAcceptButton">Vorschau der letzten Version anzeigen</key>
<key alias="returnToPreviewDeclineButton">Veröffentlichte Version anzeigen</key>
<key alias="viewPublishedContentHeadline">Veröffentlichte Version anzeigen?</key>
<key alias="viewPublishedContentDescription">Sie befinden sich im Vorschaumodus, wollen Sie ihn verlassen um die letzte
veröffentlichte Version ihrer Website zu sehen?
</key>
<key alias="viewPublishedContentAcceptButton">Veröffentlichte Version anzeigen</key>
<key alias="viewPublishedContentDeclineButton">Im Vorschaumodus bleiben</key>
</area>
<area alias="permissions">
<key alias="FolderCreation">Ornder erstellen</key>
<key alias="FileWritingForPackages">Dateien durch Packages erstellen lassen</key>
<key alias="FileWriting">Dateien schreiben</key>
<key alias="MediaFolderCreation">Medien Ordner stellen</key>
</area>
<area alias="treeSearch">
<key alias="searchResult">Element zurückgegeben</key>
<key alias="searchResults">Elemente zurückgegeben</key>
</area>
</language>
+10 -10
View File
@@ -341,6 +341,7 @@
<key alias="createFolderFailed">Failed to create a folder under parent id %0%</key>
<key alias="renameFolderFailed">Failed to rename the folder with id %0%</key>
<key alias="dragAndDropYourFilesIntoTheArea">Drag and drop your file(s) into the area</key>
<key alias="fileSecurityValidationFailure">One or more file security validations have failed</key>
</area>
<area alias="member">
<key alias="createNewMember">Create a new member</key>
@@ -488,7 +489,7 @@
<key alias="insertlink">Insert link</key>
<key alias="insertMacro">Click to add a Macro</key>
<key alias="inserttable">Insert table</key>
<key alias="languagedeletewarning">This will delete the language</key>
<key alias="languagedeletewarning">This will delete the language and all content related to the language</key>
<key alias="languageChangeWarning">Changing the culture for a language may be an expensive operation and will result
in the content cache and indexes being rebuilt
</key>
@@ -878,6 +879,8 @@
<key alias="header">Header</key>
<key alias="systemField">system field</key>
<key alias="lastUpdated">Last Updated</key>
<key alias="skipToMenu">Skip to menu</key>
<key alias="skipToContent">Skip to content</key>
</area>
<area alias="colors">
<key alias="blue">Blue</key>
@@ -1329,7 +1332,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="packageLikes">Likes</key>
<key alias="packageCompatibility">Compatibility</key>
<key alias="packageCompatibilityDescription">This package is compatible with the following versions of Umbraco, as
reported by community members. Full compatability cannot be guaranteed for versions reported below 100%
reported by community members. Full compatibility cannot be guaranteed for versions reported below 100%
</key>
<key alias="packageExternalSources">External sources</key>
<key alias="packageAuthor">Author</key>
@@ -1538,7 +1541,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="contentTypeDublicatePropertyType">Property type already exists</key>
<key alias="contentTypePropertyTypeCreated">Property type created</key>
<key alias="contentTypePropertyTypeCreatedText"><![CDATA[Name: %0% <br /> DataType: %1%]]></key>
<key alias="contentTypePropertyTypeDeleted">Propertytype deleted</key>
<key alias="contentTypePropertyTypeDeleted">Property type deleted</key>
<key alias="contentTypeSavedHeader">Document Type saved</key>
<key alias="contentTypeTabCreated">Tab created</key>
<key alias="contentTypeTabDeleted">Tab deleted</key>
@@ -2122,14 +2125,11 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
Umbraco.
</key>
<key alias="userinviteWelcomeMessage">Hello there and welcome to Umbraco! In just 1 minute youll be good to go, we
just need you to setup a password and add a picture for your avatar.
just need you to setup a password.
</key>
<key alias="userinviteExpiredMessage">Welcome to Umbraco! Unfortunately your invite has expired. Please contact your
administrator and ask them to resend it.
</key>
<key alias="userinviteAvatarMessage">Uploading a photo of yourself will make it easy for other users to recognize
you. Click the circle above to upload your photo.
</key>
<key alias="writer">Writer</key>
<key alias="change">Change</key>
<key alias="yourProfile" version="7.0">Your profile</key>
@@ -2243,8 +2243,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="stateInactive">Inactive</key>
<key alias="sortNameAscending">Name (A-Z)</key>
<key alias="sortNameDescending">Name (Z-A)</key>
<key alias="sortCreateDateAscending">Newest</key>
<key alias="sortCreateDateDescending">Oldest</key>
<key alias="sortCreateDateAscending">Oldest</key>
<key alias="sortCreateDateDescending">Newest</key>
<key alias="sortLastLoginDateDescending">Last login</key>
<key alias="noUserGroupsAdded">No user groups have been added</key>
<key alias="2faDisableText">If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device:</key>
@@ -2773,7 +2773,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="focusParentBlock">Set focus on the container block</key>
<key alias="areaIdentification">Identification</key>
<key alias="areaValidation">Validation</key>
<key alias="areaValidationEntriesShort"><![CDATA[<strong>%0%</strong> must be present atleast <strong>%2%</strong> time(s).]]></key>
<key alias="areaValidationEntriesShort"><![CDATA[<strong>%0%</strong> must be present at least <strong>%2%</strong> time(s).]]></key>
<key alias="areaValidationEntriesExceed"><![CDATA[<strong>%0%</strong> must maximum be present <strong>%3%</strong> time(s).]]></key>
<key alias="areaNumberOfBlocks">Number of blocks</key>
<key alias="areaDisallowAllBlocks">Only allow specific block types</key>
@@ -352,6 +352,7 @@
<key alias="renameFolderFailed">Failed to rename the folder with id %0%</key>
<key alias="dragAndDropYourFilesIntoTheArea">Drag and drop your file(s) into the area</key>
<key alias="uploadNotAllowed">Upload is not allowed in this location.</key>
<key alias="fileSecurityValidationFailure">One or more file security validations have failed</key>
</area>
<area alias="member">
<key alias="createNewMember">Create a new member</key>
@@ -503,7 +504,7 @@
<key alias="insertlink">Insert link</key>
<key alias="insertMacro">Click to add a Macro</key>
<key alias="inserttable">Insert table</key>
<key alias="languagedeletewarning">This will delete the language</key>
<key alias="languagedeletewarning">This will delete the language and all content related to the language</key>
<key alias="languageChangeWarning">Changing the culture for a language may be an expensive operation and will result
in the content cache and indexes being rebuilt
</key>
@@ -757,6 +758,7 @@
<key alias="by">by</key>
<key alias="cancel">Cancel</key>
<key alias="cellMargin">Cell margin</key>
<key alias="change">Change</key>
<key alias="choose">Choose</key>
<key alias="clear">Clear</key>
<key alias="close">Close</key>
@@ -908,6 +910,8 @@
<key alias="header">Header</key>
<key alias="systemField">system field</key>
<key alias="lastUpdated">Last Updated</key>
<key alias="skipToMenu">Skip to menu</key>
<key alias="skipToContent">Skip to content</key>
</area>
<area alias="colors">
<key alias="blue">Blue</key>
@@ -2216,14 +2220,11 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
Umbraco.
</key>
<key alias="userinviteWelcomeMessage">Hello there and welcome to Umbraco! In just 1 minute youll be good to go, we
just need you to setup a password and add a picture for your avatar.
just need you to setup a password.
</key>
<key alias="userinviteExpiredMessage">Welcome to Umbraco! Unfortunately your invite has expired. Please contact your
administrator and ask them to resend it.
</key>
<key alias="userinviteAvatarMessage">Uploading a photo of yourself will make it easy for other users to recognize
you. Click the circle above to upload your photo.
</key>
<key alias="writer">Writer</key>
<key alias="configureTwoFactor">Configure Two-Factor</key>
<key alias="change">Change</key>
@@ -2338,8 +2339,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="stateInactive">Inactive</key>
<key alias="sortNameAscending">Name (A-Z)</key>
<key alias="sortNameDescending">Name (Z-A)</key>
<key alias="sortCreateDateAscending">Newest</key>
<key alias="sortCreateDateDescending">Oldest</key>
<key alias="sortCreateDateAscending">Oldest</key>
<key alias="sortCreateDateDescending">Newest</key>
<key alias="sortLastLoginDateDescending">Last login</key>
<key alias="noUserGroupsAdded">No user groups have been added</key>
<key alias="2faDisableText">If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device:</key>
@@ -3003,7 +3004,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
We will send:
<ul>
<li>Anonymized site ID, Umbraco version, and packages installed.</li>
<li>Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, and Property Editors in use.</li>
<li>Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.</li>
<li>System information: Webserver, server OS, server framework, server OS language, and database provider.</li>
<li>Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, and if you are in debug mode.</li>
</ul>
+13 -2
View File
@@ -347,6 +347,18 @@
<key alias="selectEditor">Selecciona editor</key>
<key alias="selectSnippet">Selecciona snippet</key>
</area>
<area alias="dictionary">
<key alias="importDictionaryItemHelp">
Para importar un elemento del diccionario, busque el archivo ".udt" en su computadora haciendo clic en el
Botón "Importar" (se le pedirá confirmación en la siguiente pantalla)
</key>
<key alias="itemDoesNotExists">El elemento del diccionario no existe.</key>
<key alias="parentDoesNotExists">El elemento principal no existe.</key>
<key alias="noItems">No hay elementos del diccionario.</key>
<key alias="noItemsInFile">No hay elementos de diccionario en este archivo.</key>
<key alias="noItemsFound">No se encontraron elementos del diccionario.</key>
<key alias="createNew">Crear elemento de diccionario</key>
</area>
<area alias="dictionaryItem">
<key alias="description">Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo</key>
<key alias="displayName"><![CDATA[nombre de la cultura
@@ -1382,8 +1394,7 @@
<key alias="usergroup">Grupo de usuario</key>
<key alias="userInvited">ha sido invitado</key>
<key alias="userInvitedSuccessHelp">Se ha enviado una invitación al nuevo usuario con detalles sobre cómo acceder a Umbraco.</key>
<key alias="userinviteWelcomeMessage">¡Hola y bienvenido a Umbraco!. En un minuto todo estará listo para empezar, sólo necesitamos que configures tu contraseña y una imagen para tu avatar.</key>
<key alias="userinviteAvatarMessage">Sube una foto para que otros usuarios te reconozcan más fácilmente.</key>
<key alias="userinviteWelcomeMessage">¡Hola y bienvenido a Umbraco!. En un minuto todo estará listo para empezar, sólo necesitamos que configures tu contraseña.</key>
<key alias="writer">Redactor</key>
<key alias="change">Cambiar</key>
<key alias="yourProfile" version="7.0">Tu perfil</key>
@@ -1795,9 +1795,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à
<key alias="usergroup">Groupe d'utilisateurs</key>
<key alias="userInvited">a été invité</key>
<key alias="userInvitedSuccessHelp">Une invitation a été envoyée au nouvel utilisateur avec les détails concernant la connexion à Umbraco.</key>
<key alias="userinviteWelcomeMessage">Bien le bonjour et bienvenue dans Umbraco! Vous serez prêt.e dans moins d'1 minute, vous devez encore simplement configurer votre mot de passe et ajouter une photo pour votre avatar.</key>
<key alias="userinviteWelcomeMessage">Bien le bonjour et bienvenue dans Umbraco! Vous serez prêt.e dans moins d'1 minute, vous devez encore simplement configurer votre mot de passe.</key>
<key alias="userinviteExpiredMessage">Bienvenue dans Umbraco! Malheureusement, votre invitation a expiré. Veuillez contacter votre administrateur et demandez-lui de vous l'envoyer à nouveau.</key>
<key alias="userinviteAvatarMessage">Chargez une photo afin que les autres utilisateurs puissent vous reconnaître facilement. Cliquez sur le cercle ci-dessus pour charger votre photo.</key>
<key alias="writer">Rédacteur</key>
<key alias="change">Modifier</key>
<key alias="yourProfile" version="7.0">Votre profil</key>
@@ -1910,8 +1909,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à
<key alias="stateInactive">Inactif</key>
<key alias="sortNameAscending">Nom (A-Z)</key>
<key alias="sortNameDescending">Nom (Z-A)</key>
<key alias="sortCreateDateAscending">Plus récent</key>
<key alias="sortCreateDateDescending">Plus ancien</key>
<key alias="sortCreateDateAscending">Plus ancien</key>
<key alias="sortCreateDateDescending">Plus récent</key>
<key alias="sortLastLoginDateDescending">Dernière connexion</key>
</area>
<area alias="validation">
File diff suppressed because it is too large Load Diff
@@ -2197,13 +2197,10 @@ Per gestire il tuo sito web, è sufficiente aprire il backoffice di Umbraco e in
<key alias="userInvitedSuccessHelp">
<![CDATA[Un invito è stato invitato al nuovo utente con le istruzioni su come effettuare il login in Umbraco.]]></key>
<key alias="userinviteWelcomeMessage">Ciao e benvenuto su Umbraco! In solo 1 minuto sarai pronto a partire, dovrai
solamente impostare una password e aggiungere una foto profilo.
solamente impostare una password.
</key>
<key alias="userinviteExpiredMessage">
<![CDATA[Benvenuto su Umbraco! Purtroppo il tuo invito è scaduto. Per favore contatta l'amministratore e chiedigli di rispedirlo.]]></key>
<key alias="userinviteAvatarMessage">Caricando una tua foto, gli altri utenti potranno riconoscerti facilmente. Fai
clic sul cerchio sopra per caricare la tua foto.
</key>
<key alias="writer">Autore</key>
<key alias="change">Modifica</key>
<key alias="yourProfile" version="7.0">Il tuo profilo</key>
@@ -2319,8 +2316,8 @@ Per gestire il tuo sito web, è sufficiente aprire il backoffice di Umbraco e in
<key alias="stateInactive">Inattivi</key>
<key alias="sortNameAscending">Nome (A-Z)</key>
<key alias="sortNameDescending">Nome (Z-A)</key>
<key alias="sortCreateDateAscending"><![CDATA[Più nuovi]]></key>
<key alias="sortCreateDateDescending"><![CDATA[Più vecchi]]></key>
<key alias="sortCreateDateAscending"><![CDATA[Più vecchi]]></key>
<key alias="sortCreateDateDescending"><![CDATA[Più nuovi]]></key>
<key alias="sortLastLoginDateDescending">Ultimo login</key>
<key alias="noUserGroupsAdded">Non sono stati aggiunti gruppi di utenti</key>
</area>
@@ -2660,6 +2657,7 @@ Per gestire il tuo sito web, è sufficiente aprire il backoffice di Umbraco e in
<key alias="labelUsedByMemberTypes">Usato nei tipi di membro</key>
<key alias="noMemberTypes">Non ci sono riferimenti a tipi di membro.</key>
<key alias="usedByProperties">Usato da</key>
<key alias="labelUsedByItems">Correlato ai seguenti elementi</key>
<key alias="labelUsedByDocuments">Usato nei documenti</key>
<key alias="labelUsedByMembers">Usato nei membri</key>
<key alias="labelUsedByMedia">Usato nei media</key>
@@ -340,6 +340,7 @@
<key alias="renameFolderFailed">Kan de map met id %0% niet hernoemen</key>
<key alias="dragAndDropYourFilesIntoTheArea">Sleep en zet je bestand(en) neer in dit gebied</key>
<key alias="uploadNotAllowed">Upload is niet toegelaten in deze locatie.</key>
<key alias="fileSecurityValidationFailure">Een of meerdere veiligheid validaties zijn gefaald voor het bestand</key>
</area>
<area alias="member">
<key alias="createNewMember">Maak nieuw lid aan</key>
@@ -1937,12 +1938,11 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
te loggen in Umbraco
</key>
<key alias="userinviteWelcomeMessage">Hallo en welkom in Umbraco! Binnen ongeveer één minuut kan je aan de slag. Je
moet enkel je wachtwoord instellen en een foto toevoegen.
moet enkel je wachtwoord instellen.
</key>
<key alias="userinviteExpiredMessage">Welkom bij Umbraco! Helaas is je uitnodiging vervallen. Vraag aan je
administrator om de uitnodiging opnieuw te versturen.
</key>
<key alias="userinviteAvatarMessage">Wijzig je foto zodat andere gebruikers je makkelijk kunnen herkennen.</key>
<key alias="writer">Auteur</key>
<key alias="configureTwoFactor">Configureer tweestapsverificatie</key>
<key alias="change">Wijzig</key>
@@ -2056,8 +2056,8 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
<key alias="stateInactive">Inactief</key>
<key alias="sortNameAscending">Naam (A-Z)</key>
<key alias="sortNameDescending">Naam (Z-A)</key>
<key alias="sortCreateDateAscending">Nieuwste</key>
<key alias="sortCreateDateDescending">Oudste</key>
<key alias="sortCreateDateAscending">Oudste</key>
<key alias="sortCreateDateDescending">Nieuwste</key>
<key alias="sortLastLoginDateDescending">Laatste login</key>
<key alias="noUserGroupsAdded">Er zijn geen gebruikersgroepen toegevoegd</key>
</area>
@@ -822,6 +822,8 @@ Você pode publicar esta página e todas suas sub-páginas ao selecionar <em>pub
<key alias="usertype">Tipo de usuário</key>
<key alias="userTypes">Tipos de usuários</key>
<key alias="writer">Escrevente</key>
<key alias="sortCreateDateAscending">Mais antigo</key>
<key alias="sortCreateDateDescending">Mais recente</key>
</area>
<area alias="logViewer">
<key alias="selectAllLogLevelFilters">Selecionar tudo</key>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="ro" intName="Romanian (Romania)" localName="romana (Romania)" lcid="" culture="ro-RO">
<creator>
<name>The Umbraco community</name>
<link>https://docs.umbraco.com/umbraco-cms/extending/language-files</link>
</creator>
<area alias="sections">
<key alias="content">Conţinut</key>
<key alias="forms">Formulare</key>
<key alias="media">Media</key>
<key alias="member">Membrii</key>
<key alias="packages">Pachete</key>
<key alias="marketplace">Marketplace</key>
<key alias="settings">Setări</key>
<key alias="translation">Traduceri</key>
<key alias="users">Utilizatori</key>
</area>
</language>
@@ -1703,8 +1703,7 @@
<key alias="usergroup">Группа пользователей</key>
<key alias="userInvited"> был приглашен</key>
<key alias="userInvitedSuccessHelp">Новому пользователю было отправлено приглашение, в котором содержатся инструкции для входа в панель Umbraco.</key>
<key alias="userinviteWelcomeMessage">Здравствуйте и добро пожаловать в Umbraco! Все будет готово в течении пары минут, нам лишь нужно задать Ваш пароль для входа и добавить аватар.</key>
<key alias="userinviteAvatarMessage">Загрузите изображение, это поможет другим пользователям идентифицировать Вас.</key>
<key alias="userinviteWelcomeMessage">Здравствуйте и добро пожаловать в Umbraco! Все будет готово в течении пары минут, нам лишь нужно задать Ваш пароль для входа.</key>
<key alias="userManagement">Управление пользователями</key>
<key alias="userPermissions">Разрешения для пользователя</key>
<key alias="writer">Автор</key>
@@ -134,7 +134,7 @@
<key alias="saveToPublish">Spara och skicka för godkännande</key>
<key alias="schedulePublish">Schemaläggning</key>
<key alias="select">Välj</key>
<key alias="saveAndPreview">Förhandsgranska</key>
<key alias="saveAndPreview">Spara och förhandsgranska</key>
<key alias="showPageDisabled">Förhandsgranskning är avstängt på grund av att det inte finns någon mall tilldelad</key>
<key alias="somethingElse">Gör något annat</key>
<key alias="styleChoose">Välj stil</key>
@@ -1001,8 +1001,8 @@
<key alias="writer">Skribent</key>
<key alias="yourHistory">Din nuvarande historik</key>
<key alias="yourProfile">Din profil</key>
<key alias="sortCreateDateAscending">Nyast</key>
<key alias="sortCreateDateDescending">Äldst</key>
<key alias="sortCreateDateAscending">Äldst</key>
<key alias="sortCreateDateDescending">Nyast</key>
<key alias="sortLastLoginDateDescending">Senaste login</key>
</area>
<area alias="logViewer">
@@ -1879,9 +1879,8 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey
<key alias="usergroup">Kullanıcı grubu</key>
<key alias="userInvited">davet edildi</key>
<key alias="userInvitedSuccessHelp">Yeni kullanıcıya, Umbraco'da nasıl oturum açılacağına ilişkin ayrıntıları içeren bir davetiye gönderildi.</key>
<key alias="userinviteWelcomeMessage">Merhabalar, Umbraco'ya hoş geldiniz! Sadece 1 dakika içinde hazır olacaksınız, sadece bir şifre belirlemeniz ve avatarınız için bir resim eklemeniz gerekiyor.</key>
<key alias="userinviteWelcomeMessage">Merhabalar, Umbraco'ya hoş geldiniz! Sadece 1 dakika içinde hazır olacaksınız, sadece bir şifre belirlemeniz.</key>
<key alias="userinviteExpiredMessage">Umbraco'ya hoş geldiniz! Maalesef davetinizin süresi doldu. Lütfen yöneticinizle iletişime geçin ve yeniden göndermesini isteyin.</key>
<key alias="userinviteAvatarMessage">Kendi fotoğrafınızı yüklemek, diğer kullanıcıların sizi tanımasını kolaylaştıracaktır. Fotoğrafınızı yüklemek için yukarıdaki daireyi tıklayın.</key>
<key alias="writer">Yazar</key>
<key alias="change">Değiştir</key>
<key alias="yourProfile" version="7.0">Profiliniz</key>
@@ -1996,8 +1995,8 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey
<key alias="stateInactive">Etkin Değil</key>
<key alias="sortNameAscending">Ad (AZ)</key>
<key alias="sortNameDescending">Ad (ZA)</key>
<key alias="sortCreateDateAscending">En yeni</key>
<key alias="sortCreateDateDescending">En eski</key>
<key alias="sortCreateDateAscending">En eski</key>
<key alias="sortCreateDateDescending">En yeni</key>
<key alias="sortLastLoginDateDescending">Son giriş</key>
<key alias="noUserGroupsAdded">Hiçbir kullanıcı grubu eklenmedi</key>
</area>
File diff suppressed because it is too large Load Diff
@@ -137,7 +137,7 @@ internal class NotificationAsyncHandlerWrapperImpl<TNotification> : Notification
/// confusion.
/// </para>
/// </remarks>
public override Task HandleAsync(
public override async Task HandleAsync(
INotification notification,
CancellationToken cancellationToken,
ServiceFactory serviceFactory,
@@ -155,7 +155,7 @@ internal class NotificationAsyncHandlerWrapperImpl<TNotification> : Notification
(theNotification, theToken) =>
x.HandleAsync((TNotification)theNotification, theToken)));
return publish(handlers, notification, cancellationToken);
await publish(handlers, notification, cancellationToken);
}
}
+2 -2
View File
@@ -50,7 +50,7 @@ public partial class EventAggregator : IEventAggregator
=> _serviceFactory = serviceFactory;
/// <inheritdoc />
public Task PublishAsync<TNotification>(TNotification notification, CancellationToken cancellationToken = default)
public async Task PublishAsync<TNotification>(TNotification notification, CancellationToken cancellationToken = default)
where TNotification : INotification
{
// TODO: Introduce codegen efficient Guard classes to reduce noise.
@@ -60,7 +60,7 @@ public partial class EventAggregator : IEventAggregator
}
PublishNotification(notification);
return PublishNotificationAsync(notification, cancellationToken);
await PublishNotificationAsync(notification, cancellationToken);
}
/// <inheritdoc />
@@ -0,0 +1,19 @@
using System.Diagnostics.CodeAnalysis;
using Umbraco.Cms.Core.Strings;
namespace Umbraco.Extensions;
public static class HtmlEncodedStringExtensions
{
/// <summary>
/// Checks if the specified <see cref="IHtmlEncodedString" /> is <c>null</c> or only contains whitespace, optionally after all HTML tags have been stripped/removed.
/// </summary>
/// <param name="htmlEncodedString">The encoded HTML string.</param>
/// <param name="stripHtml">If set to <c>true</c> strips/removes all HTML tags.</param>
/// <returns>
/// Returns <c>true</c> if the HTML string is <c>null</c> or only contains whitespace, optionally after all HTML tags have been stripped/removed.
/// </returns>
public static bool IsNullOrWhiteSpace([NotNullWhen(false)] this IHtmlEncodedString? htmlEncodedString, bool stripHtml = false)
=> (htmlEncodedString?.ToHtmlString() is var htmlString && string.IsNullOrWhiteSpace(htmlString)) ||
(stripHtml && string.IsNullOrWhiteSpace(htmlString.StripHtml()));
}
@@ -30,5 +30,5 @@ public static class PasswordConfigurationExtensions
};
public static int GetMinNonAlphaNumericChars(this IPasswordConfiguration passwordConfiguration) =>
passwordConfiguration.RequireNonLetterOrDigit ? 2 : 0;
passwordConfiguration.RequireNonLetterOrDigit ? 1 : 0;
}
@@ -1040,14 +1040,15 @@ public static class StringExtensions
throw new ArgumentNullException(nameof(text));
}
var pos = text.IndexOf(search, StringComparison.InvariantCulture);
ReadOnlySpan<char> spanText = text.AsSpan();
var pos = spanText.IndexOf(search, StringComparison.InvariantCulture);
if (pos < 0)
{
return text;
}
return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
return string.Concat(spanText[..pos], replace.AsSpan(), spanText[(pos + search.Length)..]);
}
/// <summary>
+79 -80
View File
@@ -219,96 +219,52 @@ public static class TypeExtensions
/// <returns></returns>
public static PropertyInfo[] GetAllProperties(this Type type)
{
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();
var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
Type subType = queue.Dequeue();
foreach (Type subInterface in subType.GetInterfaces())
{
if (considered.Contains(subInterface))
{
continue;
}
considered.Add(subInterface);
queue.Enqueue(subInterface);
}
PropertyInfo[] typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance);
IEnumerable<PropertyInfo> newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));
propertyInfos.InsertRange(0, newPropertyInfos);
}
return propertyInfos.ToArray();
}
return type.GetProperties(BindingFlags.FlattenHierarchy
| BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
const BindingFlags bindingFlags = BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance;
return type.GetAllMemberInfos(t => t.GetProperties(bindingFlags));
}
/// <summary>
/// Returns all public properties including inherited properties even for interfaces
/// Returns public properties including inherited properties even for interfaces
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
/// <remarks>
/// taken from
/// http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-inheritance-hierarchy
/// </remarks>
public static PropertyInfo[] GetPublicProperties(this Type type)
{
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();
const BindingFlags bindingFlags = BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance;
return type.GetAllMemberInfos(t => t.GetProperties(bindingFlags));
}
var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
Type subType = queue.Dequeue();
foreach (Type subInterface in subType.GetInterfaces())
{
if (considered.Contains(subInterface))
{
continue;
}
/// <summary>
/// Returns public methods including inherited methods even for interfaces
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static MethodInfo[] GetPublicMethods(this Type type)
{
const BindingFlags bindingFlags = BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance;
return type.GetAllMemberInfos(t => t.GetMethods(bindingFlags));
}
considered.Add(subInterface);
queue.Enqueue(subInterface);
}
PropertyInfo[] typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance);
IEnumerable<PropertyInfo> newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));
propertyInfos.InsertRange(0, newPropertyInfos);
}
return propertyInfos.ToArray();
}
return type.GetProperties(BindingFlags.FlattenHierarchy
| BindingFlags.Public | BindingFlags.Instance);
/// <summary>
/// Returns all methods including inherited methods even for interfaces
/// </summary>
/// <remarks>Includes both Public and Non-Public methods</remarks>
/// <param name="type"></param>
/// <returns></returns>
public static MethodInfo[] GetAllMethods(this Type type)
{
const BindingFlags bindingFlags = BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance;
return type.GetAllMemberInfos(t => t.GetMethods(bindingFlags));
}
/// <summary>
@@ -512,4 +468,47 @@ public static class TypeExtensions
return attempt;
}
/// <remarks>
/// taken from
/// http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-inheritance-hierarchy
/// </remarks>
private static T[] GetAllMemberInfos<T>(this Type type, Func<Type, T[]> getMemberInfos)
where T : MemberInfo
{
if (type.IsInterface is false)
{
return getMemberInfos(type);
}
var memberInfos = new List<T>();
var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
Type subType = queue.Dequeue();
foreach (Type subInterface in subType.GetInterfaces())
{
if (considered.Contains(subInterface))
{
continue;
}
considered.Add(subInterface);
queue.Enqueue(subInterface);
}
T[] typeMethodInfos = getMemberInfos(subType);
IEnumerable<T> newMethodInfos = typeMethodInfos
.Where(x => !memberInfos.Contains(x));
memberInfos.InsertRange(0, newMethodInfos);
}
return memberInfos.ToArray();
}
}
+1 -1
View File
@@ -358,7 +358,7 @@ namespace Umbraco.Cms.Core.IO
// nothing prevents us to reach the file, security-wise, yet it is outside
// this filesystem's root - throw
throw new UnauthorizedAccessException($"File original: [{originalPath}] full: [{path}] is outside this filesystem's root.");
throw new UnauthorizedAccessException($"Requested path {originalPath} is outside this filesystem's root.");
}
/// <summary>
+19 -19
View File
@@ -7,19 +7,21 @@ namespace Umbraco.Cms.Core.IO;
internal class ShadowWrapper : IFileSystem, IFileProviderFactory
{
private static readonly string ShadowFsPath = Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "ShadowFs";
private readonly IHostingEnvironment _hostingEnvironment;
private readonly IIOHelper _ioHelper;
private const string ShadowFsPath = "ShadowFs";
private readonly Func<bool?>? _isScoped;
private readonly IIOHelper _ioHelper;
private readonly IHostingEnvironment _hostingEnvironment;
private readonly ILoggerFactory _loggerFactory;
private readonly string _shadowPath;
private readonly Func<bool?>? _isScoped;
private string? _shadowDir;
private ShadowFileSystem? _shadowFileSystem;
public ShadowWrapper(IFileSystem innerFileSystem, IIOHelper ioHelper, IHostingEnvironment hostingEnvironment, ILoggerFactory loggerFactory, string shadowPath, Func<bool?>? isScoped = null)
{
InnerFileSystem = innerFileSystem;
_ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper));
_hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
_loggerFactory = loggerFactory;
@@ -35,18 +37,19 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
{
get
{
if (_isScoped is not null && _shadowFileSystem is not null)
Func<bool?>? isScoped = _isScoped;
if (isScoped is not null && _shadowFileSystem is not null)
{
var isScoped = _isScoped!();
bool? scoped = isScoped();
// if the filesystem is created *after* shadowing starts, it won't be shadowing
// better not ignore that situation and raised a meaningful (?) exception
if (isScoped.HasValue && isScoped.Value && _shadowFileSystem == null)
// better not ignore that situation and raise a meaningful (?) exception
if (scoped.HasValue && scoped.Value && _shadowFileSystem == null)
{
throw new Exception("The filesystems are shadowing, but this filesystem is not.");
}
return isScoped.HasValue && isScoped.Value
return scoped.HasValue && scoped.Value
? _shadowFileSystem
: InnerFileSystem;
}
@@ -56,8 +59,7 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
}
/// <inheritdoc />
public IFileProvider? Create() =>
InnerFileSystem.TryCreateFileProvider(out IFileProvider? fileProvider) ? fileProvider : null;
public IFileProvider? Create() => InnerFileSystem.TryCreateFileProvider(out IFileProvider? fileProvider) ? fileProvider : null;
public IEnumerable<string> GetDirectories(string path) => FileSystem.GetDirectories(path);
@@ -69,8 +71,7 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
public void AddFile(string path, Stream stream) => FileSystem.AddFile(path, stream);
public void AddFile(string path, Stream stream, bool overrideExisting) =>
FileSystem.AddFile(path, stream, overrideExisting);
public void AddFile(string path, Stream stream, bool overrideExisting) => FileSystem.AddFile(path, stream, overrideExisting);
public IEnumerable<string> GetFiles(string path) => FileSystem.GetFiles(path);
@@ -107,8 +108,7 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
{
var id = GuidUtils.ToBase32String(Guid.NewGuid(), idLength);
var virt = ShadowFsPath + "/" + id;
var shadowDir = hostingEnvironment.MapPathContentRoot(virt);
var shadowDir = Path.Combine(hostingEnvironment.LocalTempPath, ShadowFsPath, id);
if (Directory.Exists(shadowDir))
{
continue;
@@ -129,10 +129,10 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
// note: no thread-safety here, because ShadowFs is thread-safe due to the check
// on ShadowFileSystemsScope.None - and if None is false then we should be running
// in a single thread anyways
var virt = Path.Combine(ShadowFsPath, id, _shadowPath);
_shadowDir = _hostingEnvironment.MapPathContentRoot(virt);
var rootUrl = Path.Combine(ShadowFsPath, id, _shadowPath);
_shadowDir = Path.Combine(_hostingEnvironment.LocalTempPath, rootUrl);
Directory.CreateDirectory(_shadowDir);
var tempfs = new PhysicalFileSystem(_ioHelper, _hostingEnvironment, _loggerFactory.CreateLogger<PhysicalFileSystem>(), _shadowDir, _hostingEnvironment.ToAbsolute(virt));
var tempfs = new PhysicalFileSystem(_ioHelper, _hostingEnvironment, _loggerFactory.CreateLogger<PhysicalFileSystem>(), _shadowDir, rootUrl);
_shadowFileSystem = new ShadowFileSystem(InnerFileSystem, tempfs);
}
@@ -160,7 +160,7 @@ internal class ShadowWrapper : IFileSystem, IFileProviderFactory
// shadowPath make be path/to/dir, remove each
dir = dir!.Replace('/', Path.DirectorySeparatorChar);
var min = _hostingEnvironment.MapPathContentRoot(ShadowFsPath).Length;
var min = Path.Combine(_hostingEnvironment.LocalTempPath, ShadowFsPath).Length;
var pos = dir.LastIndexOf(Path.DirectorySeparatorChar);
while (pos > min)
{
@@ -19,6 +19,9 @@ public class Issuu : EmbedProviderBase
public override Dictionary<string, string> RequestParams => new()
{
// ApiUrl/?iframe=true
{ "iframe", "true" },
// ApiUrl/?format=xml
{ "format", "xml" },
};
@@ -55,11 +55,12 @@ public abstract class OEmbedProviderBase : IEmbedProvider
if (_httpClient == null)
{
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Umbraco-CMS");
}
using (var request = new HttpRequestMessage(HttpMethod.Get, url))
{
HttpResponseMessage response = _httpClient.SendAsync(request).Result;
HttpResponseMessage response = _httpClient.SendAsync(request).GetAwaiter().GetResult();
return response.Content.ReadAsStringAsync().Result;
}
}
@@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace Umbraco.Cms.Core.Models.ContentEditing;
/// <summary>
/// Used to publish content and variants
/// </summary>
[DataContract(Name = "publish", Namespace = "")]
public class PublishContent
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "cultures")]
public string[]? Cultures { get; set; }
}
@@ -1,49 +1,88 @@
namespace Umbraco.Cms.Core.Models.Editors;
/// <summary>
/// Used to track reference to other entities in a property value
/// Used to track a reference to another entity in a property value.
/// </summary>
public struct UmbracoEntityReference : IEquatable<UmbracoEntityReference>
{
private static readonly UmbracoEntityReference _empty = new(UnknownTypeUdi.Instance, string.Empty);
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoEntityReference" /> struct.
/// </summary>
/// <param name="udi">The UDI.</param>
/// <param name="relationTypeAlias">The relation type alias.</param>
public UmbracoEntityReference(Udi udi, string relationTypeAlias)
{
Udi = udi ?? throw new ArgumentNullException(nameof(udi));
RelationTypeAlias = relationTypeAlias ?? throw new ArgumentNullException(nameof(relationTypeAlias));
}
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoEntityReference" /> struct for a document or media item.
/// </summary>
/// <param name="udi">The UDI.</param>
public UmbracoEntityReference(Udi udi)
{
Udi = udi ?? throw new ArgumentNullException(nameof(udi));
switch (udi.EntityType)
{
case Constants.UdiEntityType.Document:
RelationTypeAlias = Constants.Conventions.RelationTypes.RelatedDocumentAlias;
break;
case Constants.UdiEntityType.Media:
RelationTypeAlias = Constants.Conventions.RelationTypes.RelatedMediaAlias;
break;
default:
RelationTypeAlias = Constants.Conventions.RelationTypes.RelatedDocumentAlias;
// No relation type alias convention for this entity type, so leave it empty
RelationTypeAlias = string.Empty;
break;
}
}
/// <summary>
/// Gets the UDI.
/// </summary>
/// <value>
/// The UDI.
/// </value>
public Udi Udi { get; }
public static UmbracoEntityReference Empty() => _empty;
public static bool IsEmpty(UmbracoEntityReference reference) => reference == Empty();
/// <summary>
/// Gets the relation type alias.
/// </summary>
/// <value>
/// The relation type alias.
/// </value>
public string RelationTypeAlias { get; }
public static bool operator ==(UmbracoEntityReference left, UmbracoEntityReference right) => left.Equals(right);
/// <summary>
/// Gets an empty reference.
/// </summary>
/// <returns>
/// An empty reference.
/// </returns>
public static UmbracoEntityReference Empty() => _empty;
/// <summary>
/// Determines whether the specified reference is empty.
/// </summary>
/// <param name="reference">The reference.</param>
/// <returns>
/// <c>true</c> if the specified reference is empty; otherwise, <c>false</c>.
/// </returns>
public static bool IsEmpty(UmbracoEntityReference reference) => reference == Empty();
/// <inheritdoc />
public override bool Equals(object? obj) => obj is UmbracoEntityReference reference && Equals(reference);
/// <inheritdoc />
public bool Equals(UmbracoEntityReference other) =>
EqualityComparer<Udi>.Default.Equals(Udi, other.Udi) &&
RelationTypeAlias == other.RelationTypeAlias;
/// <inheritdoc />
public override int GetHashCode()
{
var hashCode = -487348478;
@@ -52,5 +91,9 @@ public struct UmbracoEntityReference : IEquatable<UmbracoEntityReference>
return hashCode;
}
/// <inheritdoc />
public static bool operator ==(UmbracoEntityReference left, UmbracoEntityReference right) => left.Equals(right);
/// <inheritdoc />
public static bool operator !=(UmbracoEntityReference left, UmbracoEntityReference right) => !(left == right);
}
+2 -1
View File
@@ -2,6 +2,7 @@ using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
using Umbraco.Cms.Core.Models.Entities;
namespace Umbraco.Cms.Core.Models;
@@ -132,7 +133,7 @@ public class PropertyGroup : EntityBase, IEquatable<PropertyGroup>
}
public bool Equals(PropertyGroup? other) =>
base.Equals(other) || (other != null && Type == other.Type && Alias == other.Alias);
base.Equals(other) || (other != null && Type == other.Type && Alias == other.Alias && Id == other.Id);
public override int GetHashCode() => (base.GetHashCode(), Type, Alias).GetHashCode();
@@ -30,7 +30,7 @@ public class PropertyTypeCollection : KeyedCollection<string, IPropertyType>, IN
// This baseclass calling is needed, else compiler will complain about nullability
/// <inheritdoc />
public bool IsReadOnly => ((ICollection<IPropertyType>)this).IsReadOnly;
public bool IsReadOnly => false;
// 'new' keyword is required! we can explicitly implement ICollection<IPropertyType>.Add BUT since normally a concrete PropertyType type
// is passed in, the explicit implementation doesn't get called, this ensures it does get called.
@@ -5,6 +5,12 @@ namespace Umbraco.Cms.Core.Models.PublishedContent;
/// </summary>
public interface IPublishedValueFallback
{
[Obsolete("Scheduled for removal in v14")]
/// <summary>
/// VariationContextAccessor that is not required to be implemented, therefore throws NotImplementedException as default.
/// </summary>
IVariationContextAccessor VariationContextAccessor { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } }
/// <summary>
/// Tries to get a fallback value for a property.
/// </summary>
@@ -7,7 +7,15 @@ namespace Umbraco.Cms.Core.Models.PublishedContent;
/// <para>This is for tests etc - does not implement fallback at all.</para>
/// </remarks>
public class NoopPublishedValueFallback : IPublishedValueFallback
{
/// <inheritdoc />
public IVariationContextAccessor VariationContextAccessor
{
get => new ThreadCultureVariationContextAccessor();
set { }
}
/// <inheritdoc />
public bool TryGetValue(IPublishedProperty property, string? culture, string? segment, Fallback fallback, object? defaultValue, out object? value)
{
@@ -1,4 +1,4 @@
using System.Diagnostics;
using System.Diagnostics;
using System.Xml.Linq;
using System.Xml.XPath;
using Umbraco.Cms.Core.PropertyEditors;
@@ -190,7 +190,7 @@ namespace Umbraco.Cms.Core.Models.PublishedContent
}
_cacheLevel = _converter?.GetPropertyCacheLevel(this) ?? PropertyCacheLevel.Snapshot;
_modelClrType = _converter == null ? typeof (object) : _converter.GetPropertyValueType(this);
_modelClrType = _converter?.GetPropertyValueType(this) ?? typeof(object);
}
/// <inheritdoc />
@@ -20,6 +20,9 @@ public class PublishedValueFallback : IPublishedValueFallback
_variationContextAccessor = variationContextAccessor;
}
[Obsolete("Scheduled for removal in v14")]
public IVariationContextAccessor VariationContextAccessor { get { return _variationContextAccessor; } }
/// <inheritdoc />
public bool TryGetValue(IPublishedProperty property, string? culture, string? segment, Fallback fallback, object? defaultValue, out object? value) =>
TryGetValue<object>(property, culture, segment, fallback, defaultValue, out value);
@@ -0,0 +1,18 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Models;
namespace Umbraco.Cms.Core.Notifications;
/// <summary>
/// Notification that is send out when a Content item has been scaffolded from an original item and basic cleaning has been performed
/// </summary>
public sealed class ContentScaffoldedNotification : ScaffoldedNotification<IContent>
{
public ContentScaffoldedNotification(IContent original, IContent scaffold, int parentId, EventMessages messages)
: base(original, scaffold, parentId, messages)
{
}
}
@@ -0,0 +1,23 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
using Umbraco.Cms.Core.Events;
namespace Umbraco.Cms.Core.Notifications;
public abstract class ScaffoldedNotification<T> : CancelableObjectNotification<T>
where T : class
{
protected ScaffoldedNotification(T original, T scaffold, int parentId, EventMessages messages)
: base(original, messages)
{
Scaffold = scaffold;
ParentId = parentId;
}
public T Original => Target;
public T Scaffold { get; }
public int ParentId { get; }
}
@@ -4,64 +4,156 @@ using Umbraco.Cms.Core.Models.Editors;
namespace Umbraco.Cms.Core.PropertyEditors;
/// <summary>
/// Provides a builder collection for <see cref="IDataValueReferenceFactory" /> items.
/// </summary>
public class DataValueReferenceFactoryCollection : BuilderCollectionBase<IDataValueReferenceFactory>
{
public DataValueReferenceFactoryCollection(Func<IEnumerable<IDataValueReferenceFactory>> items)
: base(items)
{
}
// TODO: We could further reduce circular dependencies with PropertyEditorCollection by not having IDataValueReference implemented
// by property editors and instead just use the already built in IDataValueReferenceFactory and/or refactor that into a more normal collection
public IEnumerable<UmbracoEntityReference> GetAllReferences(
IPropertyCollection properties,
PropertyEditorCollection propertyEditors)
{
var trackedRelations = new HashSet<UmbracoEntityReference>();
foreach (IProperty p in properties)
/// <summary>
/// Initializes a new instance of the <see cref="DataValueReferenceFactoryCollection" /> class.
/// </summary>
/// <param name="items">The items.</param>
public DataValueReferenceFactoryCollection(Func<IEnumerable<IDataValueReferenceFactory>> items)
: base(items)
{ }
/// <summary>
/// Gets all unique references from the specified properties.
/// </summary>
/// <param name="properties">The properties.</param>
/// <param name="propertyEditors">The property editors.</param>
/// <returns>
/// The unique references from the specified properties.
/// </returns>
public ISet<UmbracoEntityReference> GetAllReferences(IPropertyCollection properties, PropertyEditorCollection propertyEditors)
{
var references = new HashSet<UmbracoEntityReference>();
// Group by property editor alias to avoid duplicate lookups and optimize value parsing
foreach (var propertyValuesByPropertyEditorAlias in properties.GroupBy(x => x.PropertyType.PropertyEditorAlias, x => x.Values))
{
if (!propertyEditors.TryGet(p.PropertyType.PropertyEditorAlias, out IDataEditor? editor))
if (!propertyEditors.TryGet(propertyValuesByPropertyEditorAlias.Key, out IDataEditor? dataEditor))
{
continue;
}
// TODO: We will need to change this once we support tracking via variants/segments
// for now, we are tracking values from ALL variants
foreach (IPropertyValue propertyVal in p.Values)
// Use distinct values to avoid duplicate parsing of the same value
var values = new HashSet<object?>(properties.Count);
foreach (IPropertyValue propertyValue in propertyValuesByPropertyEditorAlias.SelectMany(x => x))
{
var val = propertyVal.EditedValue;
values.Add(propertyValue.EditedValue);
values.Add(propertyValue.PublishedValue);
}
IDataValueEditor? valueEditor = editor?.GetValueEditor();
if (valueEditor is IDataValueReference reference)
{
IEnumerable<UmbracoEntityReference> refs = reference.GetReferences(val);
foreach (UmbracoEntityReference r in refs)
{
trackedRelations.Add(r);
}
}
references.UnionWith(GetReferences(dataEditor, values));
}
// Loop over collection that may be add to existing property editors
// implementation of GetReferences in IDataValueReference.
// Allows developers to add support for references by a
// package /property editor that did not implement IDataValueReference themselves
foreach (IDataValueReferenceFactory item in this)
{
// Check if this value reference is for this datatype/editor
// Then call it's GetReferences method - to see if the value stored
// in the dataeditor/property has referecnes to media/content items
if (item.IsForEditor(editor))
{
foreach (UmbracoEntityReference r in item.GetDataValueReference().GetReferences(val))
{
trackedRelations.Add(r);
}
}
}
return references;
}
/// <summary>
/// Gets the references.
/// </summary>
/// <param name="dataEditor">The data editor.</param>
/// <param name="values">The values.</param>
/// <returns>
/// The references.
/// </returns>
public IEnumerable<UmbracoEntityReference> GetReferences(IDataEditor dataEditor, params object?[] values)
=> GetReferences(dataEditor, (IEnumerable<object?>)values);
/// <summary>
/// Gets the references.
/// </summary>
/// <param name="dataEditor">The data editor.</param>
/// <param name="values">The values.</param>
/// <returns>
/// The references.
/// </returns>
public IEnumerable<UmbracoEntityReference> GetReferences(IDataEditor dataEditor, IEnumerable<object?> values)
{
// TODO: We will need to change this once we support tracking via variants/segments
// for now, we are tracking values from ALL variants
if (dataEditor.GetValueEditor() is IDataValueReference dataValueReference)
{
foreach (UmbracoEntityReference reference in values.SelectMany(dataValueReference.GetReferences))
{
yield return reference;
}
}
return trackedRelations;
// Loop over collection that may be add to existing property editors
// implementation of GetReferences in IDataValueReference.
// Allows developers to add support for references by a
// package /property editor that did not implement IDataValueReference themselves
foreach (IDataValueReferenceFactory dataValueReferenceFactory in this)
{
// Check if this value reference is for this datatype/editor
// Then call it's GetReferences method - to see if the value stored
// in the dataeditor/property has references to media/content items
if (dataValueReferenceFactory.IsForEditor(dataEditor))
{
IDataValueReference factoryDataValueReference = dataValueReferenceFactory.GetDataValueReference();
foreach (UmbracoEntityReference reference in values.SelectMany(factoryDataValueReference.GetReferences))
{
yield return reference;
}
}
}
}
/// <summary>
/// Gets all relation type aliases that are automatically tracked.
/// </summary>
/// <param name="propertyEditors">The property editors.</param>
/// <returns>
/// All relation type aliases that are automatically tracked.
/// </returns>
public ISet<string> GetAllAutomaticRelationTypesAliases(PropertyEditorCollection propertyEditors)
{
// Always add default automatic relation types
var automaticRelationTypeAliases = new HashSet<string>(Constants.Conventions.RelationTypes.AutomaticRelationTypes);
// Add relation types for all property editors
foreach (IDataEditor dataEditor in propertyEditors)
{
automaticRelationTypeAliases.UnionWith(GetAutomaticRelationTypesAliases(dataEditor));
}
return automaticRelationTypeAliases;
}
/// <summary>
/// Gets the automatic relation types aliases.
/// </summary>
/// <param name="dataEditor">The data editor.</param>
/// <returns>
/// The automatic relation types aliases.
/// </returns>
public IEnumerable<string> GetAutomaticRelationTypesAliases(IDataEditor dataEditor)
{
if (dataEditor.GetValueEditor() is IDataValueReference dataValueReference)
{
// Return custom relation types from value editor implementation
foreach (var alias in dataValueReference.GetAutomaticRelationTypesAliases())
{
yield return alias;
}
}
foreach (IDataValueReferenceFactory dataValueReferenceFactory in this)
{
if (dataValueReferenceFactory.IsForEditor(dataEditor))
{
// Return custom relation types from factory
foreach (var alias in dataValueReferenceFactory.GetDataValueReference().GetAutomaticRelationTypesAliases())
{
yield return alias;
}
}
}
}
}
@@ -9,11 +9,22 @@ namespace Umbraco.Cms.Core.PropertyEditors;
/// </summary>
public class DefaultPropertyIndexValueFactory : IPropertyIndexValueFactory
{
/// <inheritdoc />
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published)
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published,
IEnumerable<string> availableCultures, IDictionary<Guid, IContentType> contentTypeDictionary)
{
yield return new KeyValuePair<string, IEnumerable<object?>>(
property.Alias,
property.GetValue(culture, segment, published).Yield());
}
/// <inheritdoc />
[Obsolete("Use the non-obsolete overload, scheduled for removal in v14")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture,
string? segment, bool published, IEnumerable<string> availableCultures)
=> GetIndexValues(property, culture, segment, published, availableCultures,
new Dictionary<Guid, IContentType>());
[Obsolete("Use the non-obsolete overload, scheduled for removal in v14")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published)
=> GetIndexValues(property, culture, segment, published, Enumerable.Empty<string>(), new Dictionary<Guid, IContentType>());
}
@@ -16,11 +16,10 @@ public class DefaultPropertyValueConverterAttribute : Attribute
/// a DefaultPropertyValueConverter can be more specific than another one.
/// </summary>
/// <remarks>
/// An example where this is useful is that both the RelatedLiksEditorValueConverter and the JsonValueConverter
/// An example where this is useful is that both the MultiUrlPickerValueConverter and the JsonValueConverter
/// will be returned as value converters for the Related Links Property editor, however the JsonValueConverter
/// is a very generic converter and the RelatedLiksEditorValueConverter is more specific than it, so the
/// RelatedLiksEditorValueConverter
/// can specify that it 'shadows' the JsonValueConverter.
/// is a very generic converter and the MultiUrlPickerValueConverter is more specific than it, so the
/// MultiUrlPickerValueConverter can specify that it 'shadows' the JsonValueConverter.
/// </remarks>
public Type[] DefaultConvertersToShadow { get; }
}
@@ -0,0 +1,5 @@
namespace Umbraco.Cms.Core.PropertyEditors;
public interface IBlockValuePropertyIndexValueFactory : IPropertyIndexValueFactory
{
}
@@ -0,0 +1,5 @@
namespace Umbraco.Cms.Core.PropertyEditors;
public interface INestedContentPropertyIndexValueFactory : IPropertyIndexValueFactory
{
}
@@ -22,5 +22,14 @@ public interface IPropertyIndexValueFactory
/// more than one value for a given field.
/// </para>
/// </remarks>
IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture,
string? segment, bool published, IEnumerable<string> availableCultures,
IDictionary<Guid, IContentType> contentTypeDictionary) => GetIndexValues(property, culture, segment, published);
[Obsolete("Use non-obsolete overload, scheduled for removal in v14")]
IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published, IEnumerable<string> availableCultures)
=> GetIndexValues(property, culture, segment, published);
[Obsolete("Use non-obsolete overload, scheduled for removal in v14")]
IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published);
}
@@ -0,0 +1,5 @@
namespace Umbraco.Cms.Core.PropertyEditors;
public interface ITagPropertyIndexValueFactory : IPropertyIndexValueFactory
{
}
@@ -0,0 +1,159 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PropertyEditors;
/// <summary>
/// Abstract base for property index value factories where the value is json.
/// </summary>
/// <typeparam name="TSerialized">The type to deserialize the json to.</typeparam>
public abstract class JsonPropertyIndexValueFactoryBase<TSerialized> : IPropertyIndexValueFactory
{
private readonly IJsonSerializer _jsonSerializer;
private IndexingSettings _indexingSettings;
protected bool ForceExplicitlyIndexEachNestedProperty { get; set; }
/// <summary>
/// Constructor for the JsonPropertyIndexValueFactoryBase.
/// </summary>
protected JsonPropertyIndexValueFactoryBase(IJsonSerializer jsonSerializer, IOptionsMonitor<IndexingSettings> indexingSettings)
{
_jsonSerializer = jsonSerializer;
_indexingSettings = indexingSettings.CurrentValue;
indexingSettings.OnChange(newValue => _indexingSettings = newValue);
}
/// <summary>
/// Constructor for the JsonPropertyIndexValueFactoryBase.
/// </summary>
[Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 14.")]
protected JsonPropertyIndexValueFactoryBase(IJsonSerializer jsonSerializer): this(jsonSerializer, StaticServiceProvider.Instance.GetRequiredService<IOptionsMonitor<IndexingSettings>>())
{
}
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(
IProperty property,
string? culture,
string? segment,
bool published,
IEnumerable<string> availableCultures,
IDictionary<Guid, IContentType> contentTypeDictionary)
{
var result = new List<KeyValuePair<string, IEnumerable<object?>>>();
var propertyValue = property.GetValue(culture, segment, published);
// If there is a value, it's a string and it's detected as json.
if (propertyValue is string rawValue && rawValue.DetectIsJson())
{
try
{
TSerialized? deserializedPropertyValue = _jsonSerializer.Deserialize<TSerialized>(rawValue);
if (deserializedPropertyValue is null)
{
return result;
}
result.AddRange(Handle(deserializedPropertyValue, property, culture, segment, published, availableCultures, contentTypeDictionary));
}
catch (InvalidCastException)
{
// Swallow...on purpose, there's a chance that this isn't the json format we are looking for
// and we don't want that to affect the website.
}
catch (ArgumentException)
{
// Swallow on purpose to prevent this error:
// Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject.
}
}
IEnumerable<KeyValuePair<string, IEnumerable<object?>>> summary = HandleResume(result, property, culture, segment, published);
if (_indexingSettings.ExplicitlyIndexEachNestedProperty || ForceExplicitlyIndexEachNestedProperty)
{
result.AddRange(summary);
return result;
}
return summary;
}
/// <inheritdoc />
[Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 14.")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(
IProperty property,
string? culture,
string? segment,
bool published,
IEnumerable<string> availableCultures)
=> GetIndexValues(
property,
culture,
segment,
published,
Enumerable.Empty<string>(),
StaticServiceProvider.Instance.GetRequiredService<IContentTypeService>().GetAll().ToDictionary(x=>x.Key));
[Obsolete("Use method overload that has availableCultures, scheduled for removal in v14")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published)
=> GetIndexValues(
property,
culture,
segment,
published,
Enumerable.Empty<string>(),
StaticServiceProvider.Instance.GetRequiredService<IContentTypeService>().GetAll().ToDictionary(x=>x.Key));
/// <summary>
/// Method to return a list of summary of the content. By default this returns an empty list
/// </summary>
protected virtual IEnumerable<KeyValuePair<string, IEnumerable<object?>>> HandleResume(
List<KeyValuePair<string, IEnumerable<object?>>> result,
IProperty property,
string? culture,
string? segment,
bool published) => Array.Empty<KeyValuePair<string, IEnumerable<object?>>>();
/// <summary>
/// Method that handle the deserialized object.
/// </summary>
[Obsolete("Use the non-obsolete overload instead, scheduled for removal in v14")]
protected abstract IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
TSerialized deserializedPropertyValue,
IProperty property,
string? culture,
string? segment,
bool published);
[Obsolete("Use the non-obsolete overload instead, scheduled for removal in v14")]
protected virtual IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
TSerialized deserializedPropertyValue,
IProperty property,
string? culture,
string? segment,
bool published,
IEnumerable<string> availableCultures) => Handle(deserializedPropertyValue, property, culture, segment, published);
/// <summary>
/// Method that handle the deserialized object.
/// </summary>
protected virtual IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
TSerialized deserializedPropertyValue,
IProperty property,
string? culture,
string? segment,
bool published,
IEnumerable<string> availableCultures,
IDictionary<Guid, IContentType> contentTypeDictionary)
=> Handle(deserializedPropertyValue, property, culture, segment, published, availableCultures);
}
@@ -0,0 +1,39 @@
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models.Editors;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Strings;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PropertyEditors;
/// <summary>
/// A custom value editor to ensure that macro syntax is parsed when being persisted and formatted correctly for
/// display in the editor
/// </summary>
internal class MarkDownPropertyValueEditor : DataValueEditor
{
private readonly IMarkdownSanitizer _markdownSanitizer;
public MarkDownPropertyValueEditor(
ILocalizedTextService localizedTextService,
IShortStringHelper shortStringHelper,
IJsonSerializer jsonSerializer,
IIOHelper ioHelper,
DataEditorAttribute attribute,
IMarkdownSanitizer markdownSanitizer)
: base(localizedTextService, shortStringHelper, jsonSerializer, ioHelper, attribute) => _markdownSanitizer = markdownSanitizer;
public override object? FromEditor(ContentPropertyData editorValue, object? currentValue)
{
if (string.IsNullOrWhiteSpace(editorValue.Value?.ToString()))
{
return null;
}
var sanitized = _markdownSanitizer.Sanitize(editorValue.Value.ToString()!);
return sanitized.NullOrWhiteSpaceAsNull();
}
}
@@ -3,6 +3,7 @@
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Web.Common.DependencyInjection;
@@ -50,4 +51,11 @@ public class MarkdownPropertyEditor : DataEditor
/// <inheritdoc />
protected override IConfigurationEditor CreateConfigurationEditor() =>
new MarkdownConfigurationEditor(_ioHelper, _editorConfigurationParser);
/// <summary>
/// Create a custom value editor
/// </summary>
/// <returns></returns>
protected override IDataValueEditor CreateValueEditor() =>
DataValueEditorFactory.Create<MarkDownPropertyValueEditor>(Attribute!);
}
@@ -0,0 +1,22 @@
using Umbraco.Cms.Core.Models;
namespace Umbraco.Cms.Core.PropertyEditors;
/// <summary>
/// Property Index Valye Factory that do not index anything.
/// </summary>
public class NoopPropertyIndexValueFactory : IPropertyIndexValueFactory
{
/// <inheritdoc />
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published,
IEnumerable<string> availableCultures, IDictionary<Guid, IContentType> contentTypeDictionary)
=> Array.Empty<KeyValuePair<string, IEnumerable<object?>>>();
[Obsolete("Use the overload with the availableCultures parameter instead, scheduled for removal in v14")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published, IEnumerable<string> availableCultures) => Array.Empty<KeyValuePair<string, IEnumerable<object?>>>();
[Obsolete("Use the overload with the availableCultures parameter instead, scheduled for removal in v14")]
public IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(IProperty property, string? culture, string? segment, bool published)
=> GetIndexValues(property, culture, segment, published);
}
@@ -14,12 +14,12 @@ public class SliderConfiguration
[ConfigurationField("initVal2", "Initial value 2", "number", Description = "Used when range is enabled")]
public decimal InitialValue2 { get; set; }
[ConfigurationField("minVal", "Minimum value", "number")]
[ConfigurationField("minVal", "Minimum value", "number", Description = "Must be smaller than the Maximum value")]
public decimal MinimumValue { get; set; }
[ConfigurationField("maxVal", "Maximum value", "number")]
[ConfigurationField("maxVal", "Maximum value", "number", Description = "Must be larger than the Minimum value")]
public decimal MaximumValue { get; set; }
[ConfigurationField("step", "Step increments", "number")]
[ConfigurationField("step", "Step increments", "number", Description = "Must be a positive value")]
public decimal StepIncrements { get; set; }
}
@@ -25,4 +25,19 @@ public class SliderConfigurationEditor : ConfigurationEditor<SliderConfiguration
ioHelper, editorConfigurationParser)
{
}
public override Dictionary<string, object> ToConfigurationEditor(SliderConfiguration? configuration)
{
// negative step increments can be configured in the back-office. they will cause the slider to
// crash the entire back-office. as we can't configure min and max values for the number prevalue
// editor, we have to this instead to limit the damage.
// logically, the step increments should be inverted instead of hardcoding them to 1, but the
// latter might point people in the direction of their misconfiguration.
if (configuration?.StepIncrements <= 0)
{
configuration.StepIncrements = 1;
}
return base.ToConfigurationEditor(configuration);
}
}
@@ -0,0 +1,48 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Web.Common.DependencyInjection;
namespace Umbraco.Cms.Core.PropertyEditors;
public class TagPropertyIndexValueFactory : JsonPropertyIndexValueFactoryBase<string[]>, ITagPropertyIndexValueFactory
{
public TagPropertyIndexValueFactory(
IJsonSerializer jsonSerializer,
IOptionsMonitor<IndexingSettings> indexingSettings)
: base(jsonSerializer, indexingSettings)
{
ForceExplicitlyIndexEachNestedProperty = true;
}
[Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 14.")]
public TagPropertyIndexValueFactory(IJsonSerializer jsonSerializer)
: this(jsonSerializer, StaticServiceProvider.Instance.GetRequiredService<IOptionsMonitor<IndexingSettings>>())
{
}
protected override IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
string[] deserializedPropertyValue,
IProperty property,
string? culture,
string? segment,
bool published,
IEnumerable<string> availableCultures)
{
yield return new KeyValuePair<string, IEnumerable<object?>>(property.Alias, deserializedPropertyValue);
}
[Obsolete("Use the overload that specifies availableCultures, scheduled for removal in v14")]
protected override IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
string[] deserializedPropertyValue,
IProperty property,
string? culture,
string? segment,
bool published)
{
yield return new KeyValuePair<string, IEnumerable<object?>>(property.Alias, deserializedPropertyValue);
}
}
@@ -5,7 +5,7 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters;
internal class ContentPickerValueConverter : PropertyValueConverterBase
public class ContentPickerValueConverter : PropertyValueConverterBase
{
private static readonly List<string> PropertiesToExclude = new()
{
@@ -1,4 +1,4 @@
using System.Collections.Concurrent;
using System.Globalization;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Services;
@@ -6,74 +6,123 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters;
/// <summary>
/// The slider property value converter.
/// </summary>
/// <seealso cref="Umbraco.Cms.Core.PropertyEditors.PropertyValueConverterBase" />
[DefaultPropertyValueConverter]
public class SliderValueConverter : PropertyValueConverterBase
{
private static readonly ConcurrentDictionary<int, bool> Storages = new();
private readonly IDataTypeService _dataTypeService;
/// <summary>
/// Initializes a new instance of the <see cref="SliderValueConverter" /> class.
/// </summary>
public SliderValueConverter()
{ }
public SliderValueConverter(IDataTypeService dataTypeService) => _dataTypeService =
dataTypeService ?? throw new ArgumentNullException(nameof(dataTypeService));
/// <summary>
/// Initializes a new instance of the <see cref="SliderValueConverter" /> class.
/// </summary>
/// <param name="dataTypeService">The data type service.</param>
[Obsolete("The IDataTypeService is not used anymore. This constructor will be removed in a future version.")]
public SliderValueConverter(IDataTypeService dataTypeService)
{ }
public static void ClearCaches() => Storages.Clear();
/// <summary>
/// Clears the data type configuration caches.
/// </summary>
[Obsolete("Caching of data type configuration is not done anymore. This method will be removed in a future version.")]
public static void ClearCaches()
{ }
/// <inheritdoc />
public override bool IsConverter(IPublishedPropertyType propertyType)
=> propertyType.EditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases.Slider);
/// <inheritdoc />
public override Type GetPropertyValueType(IPublishedPropertyType propertyType)
=> IsRangeDataType(propertyType.DataType.Id) ? typeof(Range<decimal>) : typeof(decimal);
=> IsRange(propertyType) ? typeof(Range<decimal>) : typeof(decimal);
/// <inheritdoc />
public override PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType)
=> PropertyCacheLevel.Element;
/// <inheritdoc />
public override object? ConvertIntermediateToObject(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel cacheLevel, object? source, bool preview)
{
if (source == null)
bool isRange = IsRange(propertyType);
var sourceString = source?.ToString();
return isRange
? HandleRange(sourceString)
: HandleDecimal(sourceString);
}
private static Range<decimal> HandleRange(string? sourceString)
{
if (sourceString is null)
{
return null;
return new Range<decimal>();
}
if (IsRangeDataType(propertyType.DataType.Id))
{
var rangeRawValues = source.ToString()!.Split(Constants.CharArrays.Comma);
Attempt<decimal> minimumAttempt = rangeRawValues[0].TryConvertTo<decimal>();
Attempt<decimal> maximumAttempt = rangeRawValues[1].TryConvertTo<decimal>();
string[] rangeRawValues = sourceString.Split(Constants.CharArrays.Comma);
if (minimumAttempt.Success && maximumAttempt.Success)
if (TryParseDecimal(rangeRawValues[0], out var minimum))
{
if (rangeRawValues.Length == 1)
{
return new Range<decimal> { Maximum = maximumAttempt.Result, Minimum = minimumAttempt.Result };
// Configuration is probably changed from single to range, return range with same min/max
return new Range<decimal>
{
Minimum = minimum,
Maximum = minimum
};
}
if (rangeRawValues.Length == 2 && TryParseDecimal(rangeRawValues[1], out var maximum))
{
return new Range<decimal>
{
Minimum = minimum,
Maximum = maximum
};
}
}
Attempt<decimal> valueAttempt = source.ToString().TryConvertTo<decimal>();
if (valueAttempt.Success)
return new Range<decimal>();
}
private static decimal HandleDecimal(string? sourceString)
{
if (string.IsNullOrEmpty(sourceString))
{
return valueAttempt.Result;
return default;
}
// Something failed in the conversion of the strings to decimals
return null;
// This used to be a range slider, so we'll assign the minimum value as the new value
if (sourceString.Contains(','))
{
var minimumValueRepresentation = sourceString.Split(Constants.CharArrays.Comma)[0];
if (TryParseDecimal(minimumValueRepresentation, out var minimum))
{
return minimum;
}
}
else if (TryParseDecimal(sourceString, out var value))
{
return value;
}
return default;
}
/// <summary>
/// Discovers if the slider is set to range mode.
/// Helper method for parsing a double consistently
/// </summary>
/// <param name="dataTypeId">
/// The data type id.
/// </param>
/// <returns>
/// The <see cref="bool" />.
/// </returns>
private bool IsRangeDataType(int dataTypeId) =>
private static bool TryParseDecimal(string? representation, out decimal value)
=> decimal.TryParse(representation, NumberStyles.Number, CultureInfo.InvariantCulture, out value);
// GetPreValuesCollectionByDataTypeId is cached at repository level;
// still, the collection is deep-cloned so this is kinda expensive,
// better to cache here + trigger refresh in DataTypeCacheRefresher
// TODO: this is cheap now, remove the caching
Storages.GetOrAdd(dataTypeId, id =>
{
IDataType? dataType = _dataTypeService.GetDataType(id);
SliderConfiguration? configuration = dataType?.ConfigurationAs<SliderConfiguration>();
return configuration?.EnableRange ?? false;
});
private static bool IsRange(IPublishedPropertyType propertyType)
=> propertyType.DataType.ConfigurationAs<SliderConfiguration>()?.EnableRange == true;
}
@@ -1,4 +1,3 @@
using System.Collections.Concurrent;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Serialization;
@@ -7,69 +6,66 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters;
/// <summary>
/// The tags property value converter.
/// </summary>
/// <seealso cref="Umbraco.Cms.Core.PropertyEditors.PropertyValueConverterBase" />
[DefaultPropertyValueConverter]
public class TagsValueConverter : PropertyValueConverterBase
{
private static readonly ConcurrentDictionary<int, bool> Storages = new();
private readonly IDataTypeService _dataTypeService;
private readonly IJsonSerializer _jsonSerializer;
/// <summary>
/// Initializes a new instance of the <see cref="TagsValueConverter" /> class.
/// </summary>
/// <param name="jsonSerializer">The JSON serializer.</param>
/// <exception cref="System.ArgumentNullException">jsonSerializer</exception>
public TagsValueConverter(IJsonSerializer jsonSerializer)
=> _jsonSerializer = jsonSerializer ?? throw new ArgumentNullException(nameof(jsonSerializer));
/// <summary>
/// Initializes a new instance of the <see cref="TagsValueConverter" /> class.
/// </summary>
/// <param name="dataTypeService">The data type service.</param>
/// <param name="jsonSerializer">The JSON serializer.</param>
[Obsolete("The IDataTypeService is not used anymore. This constructor will be removed in a future version.")]
public TagsValueConverter(IDataTypeService dataTypeService, IJsonSerializer jsonSerializer)
{
_dataTypeService = dataTypeService ?? throw new ArgumentNullException(nameof(dataTypeService));
_jsonSerializer = jsonSerializer ?? throw new ArgumentNullException(nameof(jsonSerializer));
}
: this(jsonSerializer)
{ }
public static void ClearCaches() => Storages.Clear();
/// <summary>
/// Clears the data type configuration caches.
/// </summary>
[Obsolete("Caching of data type configuration is not done anymore. This method will be removed in a future version.")]
public static void ClearCaches()
{ }
/// <inheritdoc />
public override bool IsConverter(IPublishedPropertyType propertyType)
=> propertyType.EditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases.Tags);
/// <inheritdoc />
public override Type GetPropertyValueType(IPublishedPropertyType propertyType)
=> typeof(IEnumerable<string>);
/// <inheritdoc />
public override PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType)
=> PropertyCacheLevel.Element;
/// <inheritdoc />
public override object? ConvertSourceToIntermediate(IPublishedElement owner, IPublishedPropertyType propertyType, object? source, bool preview)
{
if (source == null)
string? sourceString = source?.ToString();
if (string.IsNullOrEmpty(sourceString))
{
return Array.Empty<string>();
}
// if Json storage type deserialize and return as string array
if (JsonStorageType(propertyType.DataType.Id))
{
var array = source.ToString() is not null
? _jsonSerializer.Deserialize<string[]>(source.ToString()!)
: null;
return array ?? Array.Empty<string>();
}
// Otherwise assume CSV storage type and return as string array
return source.ToString()?.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries);
return IsJson(propertyType)
? _jsonSerializer.Deserialize<string[]>(sourceString) ?? Array.Empty<string>()
: sourceString.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries);
}
public override object? ConvertIntermediateToObject(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel cacheLevel, object? source, bool preview) => (string[]?)source;
/// <summary>
/// Discovers if the tags data type is storing its data in a Json format
/// </summary>
/// <param name="dataTypeId">
/// The data type id.
/// </param>
/// <returns>
/// The <see cref="bool" />.
/// </returns>
private bool JsonStorageType(int dataTypeId) =>
// GetDataType(id) is cached at repository level; still, there is some
// deep-cloning involved (expensive) - better cache here + trigger
// refresh in DataTypeCacheRefresher
Storages.GetOrAdd(dataTypeId, id =>
{
TagConfiguration? configuration = _dataTypeService.GetDataType(id)?.ConfigurationAs<TagConfiguration>();
return configuration?.StorageType == TagsStorageType.Json;
});
private static bool IsJson(IPublishedPropertyType propertyType)
=> propertyType.DataType.ConfigurationAs<TagConfiguration>()?.StorageType == TagsStorageType.Json;
}
@@ -1,6 +1,8 @@
using System.Xml.XPath;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Xml;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.PublishedCache;
@@ -9,10 +11,24 @@ public abstract class PublishedCacheBase : IPublishedCache
{
private readonly IVariationContextAccessor? _variationContextAccessor;
public PublishedCacheBase(IVariationContextAccessor variationContextAccessor) => _variationContextAccessor =
variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor));
protected PublishedCacheBase(bool previewDefault) => PreviewDefault = previewDefault;
[Obsolete("Use ctor with all parameters. This will be removed in V15")]
public PublishedCacheBase(IVariationContextAccessor variationContextAccessor)
: this(variationContextAccessor, false)
{
}
[Obsolete("Use ctor with all parameters. This will be removed in V15")]
protected PublishedCacheBase(bool previewDefault)
: this(StaticServiceProvider.Instance.GetRequiredService<IVariationContextAccessor>(), previewDefault)
{
}
public PublishedCacheBase(IVariationContextAccessor variationContextAccessor, bool previewDefault)
{
_variationContextAccessor = variationContextAccessor;
PreviewDefault = previewDefault;
}
public bool PreviewDefault { get; }
+46 -30
View File
@@ -14,9 +14,9 @@ public class UmbracoRequestPaths
private readonly string _appPath;
private readonly string _backOfficeMvcPath;
private readonly string _backOfficePath;
private readonly List<string> _defaultUmbPaths;
private readonly string _defaultUmbPath;
private readonly string _defaultUmbPathWithSlash;
private readonly string _installPath;
private readonly string _mvcArea;
private readonly string _previewMvcPath;
private readonly string _surfaceMvcPath;
@@ -25,18 +25,19 @@ public class UmbracoRequestPaths
/// </summary>
public UmbracoRequestPaths(IOptions<GlobalSettings> globalSettings, IHostingEnvironment hostingEnvironment)
{
var applicationPath = hostingEnvironment.ApplicationVirtualPath;
_appPath = applicationPath.TrimStart(Constants.CharArrays.ForwardSlash);
_appPath = hostingEnvironment.ApplicationVirtualPath;
_backOfficePath = globalSettings.Value.GetBackOfficePath(hostingEnvironment)
.EnsureStartsWith('/').TrimStart(_appPath.EnsureStartsWith('/')).EnsureStartsWith('/');
.EnsureStartsWith('/').TrimStart(_appPath).EnsureStartsWith('/');
_mvcArea = globalSettings.Value.GetUmbracoMvcArea(hostingEnvironment);
_defaultUmbPaths = new List<string> { "/" + _mvcArea, "/" + _mvcArea + "/" };
_backOfficeMvcPath = "/" + _mvcArea + "/BackOffice/";
_previewMvcPath = "/" + _mvcArea + "/Preview/";
_surfaceMvcPath = "/" + _mvcArea + "/Surface/";
_apiMvcPath = "/" + _mvcArea + "/Api/";
string mvcArea = globalSettings.Value.GetUmbracoMvcArea(hostingEnvironment);
_defaultUmbPath = "/" + mvcArea;
_defaultUmbPathWithSlash = "/" + mvcArea + "/";
_backOfficeMvcPath = "/" + mvcArea + "/BackOffice/";
_previewMvcPath = "/" + mvcArea + "/Preview/";
_surfaceMvcPath = "/" + mvcArea + "/Surface/";
_apiMvcPath = "/" + mvcArea + "/Api/";
_installPath = hostingEnvironment.ToAbsolute(Constants.SystemDirectories.Install);
}
@@ -67,50 +68,65 @@ public class UmbracoRequestPaths
/// </remarks>
public bool IsBackOfficeRequest(string absPath)
{
var fullUrlPath = absPath.TrimStart(Constants.CharArrays.ForwardSlash);
var urlPath = fullUrlPath.TrimStart(_appPath).EnsureStartsWith('/');
string urlPath = absPath.TrimStart(_appPath).EnsureStartsWith('/');
// check if this is in the umbraco back office
var isUmbracoPath = urlPath.InvariantStartsWith(_backOfficePath);
// if not, then def not back office
if (isUmbracoPath == false)
if (!urlPath.InvariantStartsWith(_backOfficePath))
{
return false;
}
// if its the normal /umbraco path
if (_defaultUmbPaths.Any(x => urlPath.InvariantEquals(x)))
if (urlPath.InvariantEquals(_defaultUmbPath) || urlPath.InvariantEquals(_defaultUmbPathWithSlash))
{
return true;
}
// check for special back office paths
if (urlPath.InvariantStartsWith(_backOfficeMvcPath)
|| urlPath.InvariantStartsWith(_previewMvcPath))
if (urlPath.InvariantStartsWith(_backOfficeMvcPath) || urlPath.InvariantStartsWith(_previewMvcPath))
{
return true;
}
// check for special front-end paths
if (urlPath.InvariantStartsWith(_surfaceMvcPath)
|| urlPath.InvariantStartsWith(_apiMvcPath))
if (urlPath.InvariantStartsWith(_surfaceMvcPath) || urlPath.InvariantStartsWith(_apiMvcPath))
{
return false;
}
// if its none of the above, we will have to try to detect if it's a PluginController route, we can detect this by
// checking how many parts the route has, for example, all PluginController routes will be routed like
// if its none of the above, we will have to try to detect if it's a PluginController route
return !IsPluginControllerRoute(urlPath);
}
/// <summary>
/// Checks if the path is from a PluginController route.
/// </summary>
private static bool IsPluginControllerRoute(string path)
{
// Detect this by checking how many parts the route has, for example, all PluginController routes will be routed like
// Umbraco/MYPLUGINAREA/MYCONTROLLERNAME/{action}/{id}
// so if the path contains at a minimum 3 parts: Umbraco + MYPLUGINAREA + MYCONTROLLERNAME then we will have to assume it is a
// plugin controller for the front-end.
if (urlPath.Split(Constants.CharArrays.ForwardSlash, StringSplitOptions.RemoveEmptyEntries).Length >= 3)
// so if the path contains at a minimum 3 parts: Umbraco + MYPLUGINAREA + MYCONTROLLERNAME then we will have to assume it is a plugin controller for the front-end.
int count = 0;
for (int i = 0; i < path.Length; i++)
{
return false;
char chr = path[i];
if (chr == '/')
{
count++;
continue;
}
// Check last char so we can properly determine the number of parts, e.g. /url/path/ has two parts, /url/path/test has three.
if (count == 3)
{
return true;
}
}
// if its anything else we can assume it's back office
return true;
return false;
}
/// <summary>
+24
View File
@@ -50,4 +50,28 @@ public class WebPath
return sb.ToString();
}
/// <summary>
/// Determines whether the provided web path is well-formed according to the specified UriKind.
/// </summary>
/// <param name="webPath">The web path to check. This can be null.</param>
/// <param name="uriKind">The kind of Uri (Absolute, Relative, or RelativeOrAbsolute).</param>
/// <returns>
/// true if <paramref name="webPath"/> is well-formed; otherwise, false.
/// </returns>
public static bool IsWellFormedWebPath(string? webPath, UriKind uriKind)
{
if (string.IsNullOrWhiteSpace(webPath))
{
return false;
}
if (webPath.StartsWith("//"))
{
return uriKind is not UriKind.Relative;
}
return Uri.IsWellFormedUriString(webPath, uriKind);
}
}

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