* Initial plan
* Add loading indicator to data-type-picker-flow-modal
- Added _isLoading state variable
- Updated #getDataTypes() to set loading state with try-finally
- Added uui-loader component in #renderGrid() when loading
- Created test file with basic tests
- Fixed linter warnings
Co-authored-by: nielslyngsoe <6791648+nielslyngsoe@users.noreply.github.com>
* Refactor: Replace inline styles with CSS class for loader
- Added .loader-container CSS class
- Removed inline styles from loader div
- Improves maintainability and follows best practices
Co-authored-by: nielslyngsoe <6791648+nielslyngsoe@users.noreply.github.com>
* Improve tests and revert unrelated package-lock.json changes
- Test observable behavior (loader element) instead of private properties
- Added tests for loader visibility during loading states
- Added test for loader removal after loading completes
- Reverted unintended changes to Umbraco.Web.UI.Login/package-lock.json
Co-authored-by: nielslyngsoe <6791648+nielslyngsoe@users.noreply.github.com>
* Refactor: Extract helper function in tests for cleaner code
- Added setLoadingState helper function to reduce code duplication
- Updated comments to reflect testing reactive state property
- Improved test readability and maintainability
Co-authored-by: nielslyngsoe <6791648+nielslyngsoe@users.noreply.github.com>
* delete test file not testing anything
* show loading indicator in search field instead
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nielslyngsoe <6791648+nielslyngsoe@users.noreply.github.com>
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* Added tests for removing a not-found member picker
* Added tests for adding thumbnail to block
* Updated tests to match the test helper changes
* Refactor code to avoid duplication
* Added tests for removing a thumbnail from a block list/grid and refactor code
* Bumped version
* Bumped version and make tests run in the pipeline
* Update smokeTest command to use '@smoke' filter
---------
Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
- Add noAccess observable to document and media tree item contexts
- Add visual styling (grayed out, italic, cursor: not-allowed) for noAccess items in tree views
- Implement click prevention to block navigation when noAccess is true
- Update document and media picker input contexts with type-safe guards to prevent selection of noAccess items
- Create type guard utilities (isDocumentTreeItem, isMediaTreeItem) in separate utils files
- Items with noAccess are shown for navigation but cannot be selected or opened
This implements Task 63363 for Feature 63060 "Handle Start Nodes"
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Block Grid: Resolve translation keys for group names (closes#20696)
Add localization support for block group names in two locations:
- Block Grid area type permission combobox options
- Block catalogue modal group headers
Translation keys (e.g., #content_isPublished) used as group names
are now properly resolved instead of displaying the raw key.
* fix: moves group.name to mapper so search works
* fix: localizes block types in permissions element too
---------
Co-authored-by: Claude <noreply@anthropic.com>
Fix collection create action causing full page navigation instead of SPA routing
When a collection create action had an href, clicking it would trigger a full
browser navigation instead of using history.pushState for SPA routing. This was
caused by event.stopPropagation() being called before the early return when an
href was present, preventing the global ensureAnchorHistory() listener from
intercepting the click event.
The fix moves stopPropagation() to only execute when we're actually handling
the click via execute() (no href), allowing href-based navigation to bubble
to the window-level router listener for proper SPA navigation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
style: fix SA1500, SA1111, SA1134 StyleCop warnings
Fixed 194 StyleCop analyzer warnings across the codebase:
- SA1500: Move opening braces to their own line for multi-line statements (80 warnings)
- SA1111: Move closing parenthesis to same line as last parameter (50 warnings)
- SA1134: Place each attribute on its own line (64 warnings)
Also added XML documentation to any public APIs within the edited files.
* implement preventEditInvariantFromNonDefault for variant blocks
* remove unused
* refactor to enforce both document and block case from the document module
* remove implementation from doc workspace
* prevent editing invariant blocks from non default
* remove unused imports
* more explicit class names
* Refactor invariant edit guard rule creation
Extracted the creation of the invariant property edit guard rule into a reusable _createRule method in the controller base class. Updated block and document workspace controllers to use this method
* Refactor invariant edit rule logic into base controller
Moved the logic for observing properties and variant options and applying property guard rules into a new _observeAndApplyRule method in the base controller. Updated document block and workspace controllers to use this shared method, reducing code duplication and improving maintainability.
* Refactor invariant block edit check into helper methods
Extracted logic for checking invariant blocks and default language datasets into private async methods for better readability and maintainability. This refactor also corrects a context check typo and improves error handling.
* remove unused
---------
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
- Fixed inverted logic in #parseNumber method
- Changed Number.isFinite(num) ? undefined : num to Number.isFinite(num) ? num : undefined
- Previously, valid max values (e.g., 50) were being ignored and defaulting to 100
- Now correctly parses and uses the configured Maximum Value from data type settings
This ensures the Maximum Value setting in Slider datatype configuration
is properly enforced in the slider UI component.
* fix(backoffice): allow drag and drop into empty link picker (closes#21295)
* refactor: use classMap to avoid empty class attribute
* refactor: use margin/padding trick for drop zone
* refactor: use CSS :has() selector instead of class
* also enable it for the Document input
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* Route server events for public access updates to indicate an update to the protected document.
* Add unit tests for all ServerEventSender notification handlers.
* Adds additional test recommended in code review.
* Addressed parameter name issue raised in code review.
* Removed margin-top to address the loader icon shifting when entering text
* Space
---------
Co-authored-by: Engiber Lozada <89547469+engijlr@users.noreply.github.com>
* Fix test entrypoint
* Fix healthcheck.sh
* Ensure bind mounts gets created on host
* Fix bind mounts permission issues
* Generate self signed cert for dev
* Only generate cert for localhost
* Fixup docker compose file
* Update templates/UmbracoProject/entrypoint.sh
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update templates/UmbracoProject/Dockerfile
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix APP_UID runtime availability and optimize chown performance
- Export APP_UID as ENV so it's available at container runtime
(ARG values from .NET base image are only available at build time)
- Only run chown -R when directory ownership differs from APP_UID
to avoid slow recursive operations on large directories
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Fix bug where with recycle bin media protection on, the files on disk aren't deleted when the recycle bin is emptied.
* Fix display of media URL when in recycle bin and protection of trashed media is enabled.
* Clean-up of ContentCacheRefresher: resolved warnings and tidied up code and comments.
* Only flush the ID/Key map when content is deleted.
* Update src/Umbraco.Core/Cache/Refreshers/Implement/ContentCacheRefresher.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Adding description to user groups
* Add description to dto and test and umbraco plan
* update unit test for user group
* remove change from link picker
* edit icon ui for user group
* Fixed table exists check in migration.
* update description in table user groups
* update user group editor css
* update description default
* remove description column element
* add ignore large method
* remove codesence
* update user group descriptions default
* Added description to constructor of ReadOnlyUserGroup.
---------
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
When changing a property's variation setting (Shared/Invariant ↔ Variant) via Infinite Editing,
the document would fail to save with a 404 error.
This fix:
- Adds value migration fallback logic in UmbPropertyValuePresetVariantBuilderController
to find values when culture/segment doesn't match exactly
- Overrides reload() in UmbContentDetailWorkspaceContextBase to process incoming data
through _processIncomingData() for proper value transformation
- Detects property variation changes and triggers document reload to migrate values
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Avoid an unnecessary look-up for the super-user when resolving ID from key and vice versa.
Utilise an async database methods given the enclosing method is async.
* Applied suggestions from code review.
* Revered async amend (caused pipeline failures with integration tests).
* Apply suggestions from code review
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
---------
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Added transitive dependency references to specific libraries where direct dependencies depend on vulnerable versions.
* Enable CentralPackageTransitivePinningEnabled.
* Update MS dependencies to 10.0.1 patch versions.
* Removed System.Text.Encodings.Web.
* Add TODOs for pinned dependency removal.
* working on a auto closing ... modal when focus leaves
* remove appsetting for local development
* rewrites the focus function to check if the shadow dom exsits before trying to set focus
* Fix JSON formatting in appsettings.Development.template.json
* Simplify focus logic in entity action list
Refactored the focus method to directly focus the first menu item after it is rendered, removing unnecessary nested updateComplete checks and focusing logic for the label button.
* Remove unused 'nothing' import and minor formatting
* Call ext.component?.focus() instead of chaining updateComplete promises.
* Update entity-action-list.element.ts
---------
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
Co-authored-by: Engiber Lozada <89547469+engijlr@users.noreply.github.com>
Co-authored-by: engjlr <enl@umbraco.dk>
* Add IMarkdownToHtmlConverter abstraction with Markdig and HeyRed implementations
- Add IMarkdownToHtmlConverter interface in Umbraco.Core.Strings
- Add MarkdigMarkdownToHtmlConverter using the Markdig library (new default)
- Add HeyRedMarkdownToHtmlConverter using HeyRed.MarkdownSharp (deprecated, for backwards compatibility)
- Update HealthChecks.MarkdownToHtmlConverter to use the new abstraction
- Update MarkdownEditorValueConverter to use the new abstraction
- Add unit tests for both markdown converter implementations
- Add unit tests for HealthChecks.MarkdownToHtmlConverter syntax highlighting
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from code review.
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Adds a check to ensure notifications are only added to relevant CMS management API endpoints.
* Add null check for tagging actions to handle null management API GroupName.
* Provide abstraction for the DocInclusionPredicate when configuring SwaggerGenOptions.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Cache: Clear ContentTypeCommonRepository cache when data types change
When a data type's EditorAlias is changed (e.g., BlockList to SingleBlock), the ContentTypeCommonRepository 5-minute cache was not being cleared. This caused content types to return stale PropertyEditorAlias values until server restart, leading to validation using the wrong property editor validators.
The fix adds IContentTypeCommonRepository as a dependency to DataTypeCacheRefresher and calls ClearCache() in RefreshInternal(), matching the pattern already used in ContentTypeCacheRefresher and TemplateCacheRefresher.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Fixed the 22 warnings.
Also updated the XML documentation where required.
* Updating XML docs.
* Noted version in obsoletion message.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Use Append for response headers
- Replaces Add with Append when adding response headers to conform to IHeaderDictionary usage.
- Applies across unauthorized handling, redirects, and custom header signaling.
- Updates tests to use Append consistently.
- Removes ASP0019 from warnings in project configs to reflect new approach.
Silences deprecation warning in dev mode
Silences deprecated runtime-compile warning in dev mode
Keeps development-time runtime compilation enabled for in-memory dev setup
Relates to ASPDEPR003
* Bumped version
* Updated tests to match new changes
* Bumped version
* Bumped version
* Use isSuccessNotificationVisible instead of doesSuccessNotificationHaveText
* Updated tests to avoid flaky tests
* Bumped version of test helper
* Bumped version of test helper
* Bumped version
* Bumped version
* Bumped version
* Update waits to avoid hardcoded values
* fix(SYSLIB0051): Remove obsolete serialization constructors
Removes obsolete formatter-based serialization constructors from exception
classes to resolve SYSLIB0051 warnings. This is NOT a breaking change as:
- Binary serialization is deprecated in modern .NET
- No BinaryFormatter usage exists in the codebase
- Microsoft recommends removing these obsolete constructors
Affected files:
- AuthorizationException.cs
- BootFailedException.cs
- ConfigurationException.cs
- PanicException.cs
- UnattendedInstallException.cs
- RetryLimitExceededException.cs
- IncompleteMigrationExpressionException.cs
- HttpUmbracoFormRouteStringException.cs
- ModelBindingException.cs
Also removes SYSLIB0051 from WarningsNotAsErrors in project files.
* fix(SYSLIB0051): Mark obsolete serialization constructors for removal in v19
* fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword
fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword to hiding members
- Add 'new' modifier to Empty properties in BlockGridModel, BlockListModel, RichTextBlockModel
- Add 'new' modifier to DeepCloneWithResetIdentities in IContentType, IMediaType
- Add 'new' modifier to Save/GetById methods in IContentService, IMediaService, IMemberService
- Add 'new' modifier to EFCore interface members (IAmbientEFCoreScopeStack, IEFCoreScope)
- Add 'new' modifier to ExternalLoginSignInResult.NotAllowed and CreateMediaTypeRequestModel.Collection
- Improve XML documentation for edited public members
Note: CS0114 warnings (virtual/override) were intentionally not fixed as they may be breaking changes. Will add more details to the PR.
* fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword
fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword to hiding members
- Add 'new' modifier to Empty properties in BlockGridModel, BlockListModel, RichTextBlockModel
- Add 'new' modifier to DeepCloneWithResetIdentities in IContentType, IMediaType
- Add 'new' modifier to Save/GetById methods in IContentService, IMediaService, IMemberService
- Add 'new' modifier to EFCore interface members (IAmbientEFCoreScopeStack, IEFCoreScope)
- Add 'new' modifier to ExternalLoginSignInResult.NotAllowed and CreateMediaTypeRequestModel.Collection
- Improve XML documentation for edited public members
Note: CS0114 warnings (virtual/override) were intentionally not fixed as they may be breaking changes. Will add more details to the PR.
* Modifying the PR based on feedback from Andy.
Files Modified (Removed Duplicate Members)
src/Umbraco.Cms.Api.Management/ViewModels/MediaType/CreateMediaTypeRequestModel.cs
Removed duplicate Collection property (already defined in base class ContentTypeModelBase)
src/Umbraco.Core/Services/IContentService.cs
Removed duplicate GetById(Guid key) method (already in IContentServiceBase<IContent>)
Removed duplicate Save(IEnumerable<IContent> contents, ...) method (already in IContentServiceBase<IContent>)
src/Umbraco.Core/Services/IMediaService.cs
Removed duplicate GetById(Guid key) method (already in IContentServiceBase<IMedia>)
Removed duplicate Save(IEnumerable<IMedia> medias, ...) method (already in IContentServiceBase<IMedia>)
src/Umbraco.Core/Services/IMemberService.cs
Removed duplicate Save(IEnumerable<IMember> members, ...) method (already in IContentServiceBase<IMember>)
Files Left Unchanged (Keeping new keyword)
The following files were correctly fixed with the new keyword because they intentionally hide base members to return more specific types:
BlockGridModel.cs, BlockListModel.cs, RichTextBlockModel.cs - Empty returns specific type
IContentType.cs, IMediaType.cs - DeepCloneWithResetIdentities returns specific interface
ExternalLoginSignInResult.cs - NotAllowed returns ExternalLoginSignInResult instead of SignInResult
IEFCoreScope.cs, IAmbientEfCoreScopeStack.cs - re-declarations for documentation purposes
* fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword
fix: Resolve CS0108 compiler warnings by adding explicit 'new' keyword to hiding members
- Add 'new' modifier to Empty properties in BlockGridModel, BlockListModel, RichTextBlockModel
- Add 'new' modifier to DeepCloneWithResetIdentities in IContentType, IMediaType
- Add 'new' modifier to Save/GetById methods in IContentService, IMediaService, IMemberService
- Add 'new' modifier to EFCore interface members (IAmbientEFCoreScopeStack, IEFCoreScope)
- Add 'new' modifier to ExternalLoginSignInResult.NotAllowed and CreateMediaTypeRequestModel.Collection
- Improve XML documentation for edited public members
Note: CS0114 warnings (virtual/override) were intentionally not fixed as they may be breaking changes. Will add more details to the PR.
* Modifying the PR based on feedback from Andy.
Files Modified (Removed Duplicate Members)
src/Umbraco.Cms.Api.Management/ViewModels/MediaType/CreateMediaTypeRequestModel.cs
Removed duplicate Collection property (already defined in base class ContentTypeModelBase)
src/Umbraco.Core/Services/IContentService.cs
Removed duplicate GetById(Guid key) method (already in IContentServiceBase<IContent>)
Removed duplicate Save(IEnumerable<IContent> contents, ...) method (already in IContentServiceBase<IContent>)
src/Umbraco.Core/Services/IMediaService.cs
Removed duplicate GetById(Guid key) method (already in IContentServiceBase<IMedia>)
Removed duplicate Save(IEnumerable<IMedia> medias, ...) method (already in IContentServiceBase<IMedia>)
src/Umbraco.Core/Services/IMemberService.cs
Removed duplicate Save(IEnumerable<IMember> members, ...) method (already in IContentServiceBase<IMember>)
Files Left Unchanged (Keeping new keyword)
The following files were correctly fixed with the new keyword because they intentionally hide base members to return more specific types:
BlockGridModel.cs, BlockListModel.cs, RichTextBlockModel.cs - Empty returns specific type
IContentType.cs, IMediaType.cs - DeepCloneWithResetIdentities returns specific interface
ExternalLoginSignInResult.cs - NotAllowed returns ExternalLoginSignInResult instead of SignInResult
IEFCoreScope.cs, IAmbientEfCoreScopeStack.cs - re-declarations for documentation purposes
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Reverted the one of the changes and updated some XML doc tags.
* Should have committed these files.
Corrected a name space in the test files.
* Remove warning on missing access modifiers on interface members.
* Revert breaking namespace change.
* Fixed build errors following namespace reversion.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix(tests): Replace obsolete APIs in Umbraco.TestData controllers
Replaced deprecated synchronous service methods with their modern async
equivalents in the TestData controllers to eliminate CS0618 warnings.
Changes:
- LoadTestController: Replace IFileService with ITemplateService,
use IDataTypeService.GetAsync(Guid) instead of GetDataType(int),
use IContentTypeService.CreateAsync() instead of Save()
- SegmentTestController: Use IContentTypeService.UpdateAsync()
instead of Save()
- UmbracoTestDataController: Use IContentTypeService.CreateAsync()
and UpdateAsync() instead of Save()
Also adds comprehensive XML documentation to all three controllers
including class summaries, constructor parameters, and method
documentation.
The controllers now use:
- Constants.DataTypes.Guids.TextstringGuid instead of magic int -88
- Constants.Security.SuperUserKey for async service operations
- Task<IActionResult> return types where async operations are used
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Further amends from code review.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix(benchmarks): resolve obsolete BenchmarkDotNet API warnings
Update BenchmarkDotNet configuration to use current API methods:
- Replace deprecated `ManualConfig.Add()` with `AddDiagnoser()` for memory diagnostics
- Replace deprecated `ConfigExtensions.With()` with `AddJob()` for job configuration
- Initialize `_totalItemCount` field to suppress CS0649 warning
These changes resolve 4 compiler warnings (CS0618, CS0649) in the benchmark project
without any functional changes.
* Removing the benchmark artifacts and adding the folder to gitignore
* Added XML Docs to the files in Umbraco.Cms.Imaging.ImageSharp2
This commit fixes the missing XML documentation with the Umbraco.Cms.Imaging.ImageSharp2 project.
Now this project should have no build warnings.
* Update src/Umbraco.Cms.Imaging.ImageSharp2/UmbracoBuilderExtensions.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fixing the build warnings in the Umbraco.Tests.Common Project
The main warning was about the file name not matching the class, this was because an interface was being defined first within the class file.
This should either be moved into its own file, or to the bottom of the file to fix this warning. Rather than creating a new file, I've moved the interface to the bottom, but if you'd prefer a new file, just let me know :)
Also removed the TODO in the project file and the WarningsNotAsErrors as they have all been resolved.
* Moved the interface into it's own file.
* Removed the interfaces folder.
- Replace obsolete constructor call that used IUmbracoContextAccessor
- Use new constructor with IDocumentUrlService instead
- Add using for Umbraco.Cms.Core.Services namespace
- Remove unused Umbraco.Cms.Core.Web namespace
The obsolete constructor was scheduled for removal in Umbraco 18.
This is an internal change only - ControllersAsServicesComposer is not
shipped with Umbraco.Templates package.
This commit fixes around 1,000 build warnings related to SA1117, this warning is related to ensuring each parameter passed into a function is on a new line OR all on one line.
I have also added XML code comments to any public function within these files and fixed some that had invalid / old comments.
When changing a property's variation setting (Shared/Invariant ↔ Variant) via Infinite Editing,
the document would fail to save with a 404 error.
This fix:
- Adds value migration fallback logic in UmbPropertyValuePresetVariantBuilderController
to find values when culture/segment doesn't match exactly
- Overrides reload() in UmbContentDetailWorkspaceContextBase to process incoming data
through _processIncomingData() for proper value transformation
- Detects property variation changes and triggers document reload to migrate values
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
fix(user): fix avatar change and remove functionality
- Fix "Change photo" button not working on subsequent clicks by using
{ once: true } on the event listener and resetting the input value
- Fix avatar not disappearing after removal by clearing _imgSrc when
imgUrls is set to empty array
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The validation message was showing the total character count instead of how
many characters exceeded the limit. For example, with max=4 and input="12345",
it showed "5 too many" instead of "1 too many".
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Content Type Workspace: Sync current data after save to prevent navigation blocking
After saving a content type, only `_data.setPersisted()` was called without
`_data.setCurrent()`. An observer kept `current` in sync with the structure's
ownerContentType, but timing mismatches caused `persisted` and `current` to
differ, triggering false "unsaved changes" detection and blocking navigation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Fixed various obsolete .NET API calls.
These all show up as warnings when you try to build the Umbraco solution:
- SYSLIB0045 (6) - Use proper HashAlgorithm creation
- SYSLIB0023 (4) - Replace RNGCryptoServiceProvider with RandomNumberGenerator
- SYSLIB0021 (8) - Replace deprecated crypto types
- SYSLIB0013 (4) - Replace Uri.EscapeUriString
Fix unintended reference comparison in tests
Explicitly casts the mock property to string in a predicate to prevent reference equality checks. Adds constraints for storage type and editor to align with expected data characteristics and improve test reliability. Keeps mock service behavior unchanged; minor formatting tweak included.
* Fixes the warning CS8524 and tidying up the SetStatusRedirectUrlManagementController
I have added throwing an error in the switch statement if neither of the know enums is submitted to the API, in theory this should never happen.
The other option would be to simply return false, but I think throwing the exception is better as it will alert whoever is calling the API that their call is invalid.
* Update src/Umbraco.Cms.Api.Management/Controllers/RedirectUrlManagement/SetStatusRedirectUrlManagementController.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Improves log message clarity
- Refines a warning when a property type alias is missing, clarifying that a default value is returned.
- Improves backoffice token revocation log by including contextual client id for easier troubleshooting.
- Corrects model generation error logging by passing the exception as the first argument for consistency.
* Added tests for media delivery api
* Added tests for content delivery api
* Fixed import
* Added tests for Content Delivery API
* Updated skip tag and issue link for the failing tests
* Bumped version
* Refactor code for content delivery api tests
* Moved repeat steps to beforeEach and added more waits
* Bumped version
* Added more waits
* Updated variable names
* Grouped tests
* Renamed
* Fixed names
* Added tests for rendering content with block list
* Updated tests for rendering content with block lists
* Updated message when has no block lists
* Added tests for rendering content with block grid
* Updated code
* Bumped version
* Changed npm command to make tests run in the pipeline
* Fixed comment
* Reverted command
* fix(code-quality): resolve CS0628 warnings - change protected to private in sealed classes
Changed protected members to private in sealed classes across 26 files. Protected members in sealed classes serve no purpose since sealed classes cannot be inherited. This eliminates 57 CS0628 compiler warnings.
* fix: use public for NUnit SetUp methods per Copilot review
NUnit requires SetUp methods to be at least protected. Using public
avoids CS0628 while allowing NUnit to discover and execute the methods.
* Clean up
- Renames internal fields to clearer names and aligns with conventions
- Changes internal cache holder to use auto-properties for state ( fixes another build warning )
- Removes an unused exception type from the loader and cleans up unused usings
- Adds "Umbraco" to the list of known spellings in .vsCode settings file, amazed this wasn't already there :)
* Improvements to fix CodeScene Code Health Review issues.
- Introduces debug-only logging helpers and routes all log messages through them for consistency
- Centralizes retrieval of discoverable types and scanning logic to simplify paths
- Aligns logging of cached vs non-cached and slow paths with new helpers
- Documents data-holding structure used to store type lists for clarity
* Refactoring to make CodeScene happy, removing code duplication :)
Fix unawaited async calls in tests
- Converts setup to async and awaits data creation
- Awaits operation status update to fix potential unawaited calls
- Updates nested validation tests to use await for helper results
- Removes stray BOM character in a test file
- Improves overall async flow, addressing CS4014
Relates to CS4014
* TDD solution to Block level variance publishing changing to no variance retaining block level variance values and vica versa
* Add similar tests for the other block editors
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Amend the test scenarios
* Simplify the merge clean-up to remove all misaligned values.
* Fix failing test (remove false assumptions)
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
* TDD solution to Block level variance publishing changing to no variance retaining block level variance values and vica versa
* Add similar tests for the other block editors
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Amend the test scenarios
* Simplify the merge clean-up to remove all misaligned values.
* Fix failing test (remove false assumptions)
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
* Add null checks in case content no longer exists
* Add logging statement
* Add integration tests for null handling in cache refresh services
Tests verify that DocumentUrlService and PublishStatusService
do not throw exceptions when called with non-existent content keys,
which can happen when processing stale cache instructions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add integration tests for stale cache instruction handling
Tests simulate the scenario where a cache instruction is processed
for content that has been deleted (stale instruction). This can happen when:
1. Content is saved (cache instruction queued)
2. Content is deleted before instruction is processed
3. Server restarts and processes the stale instruction
Tests cover:
- ContentCacheRefresher with RefreshBranch for deleted content
- ContentCacheRefresher with RefreshNode for deleted content
- MediaCacheRefresher with RefreshBranch for deleted media
- Processing instructions for content that never existed
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Added tests for removing a not-found content picker
* Added comment
* Bumped version
* Change npm command to make tests run in the pipeline
* Reverted npm command
* Added base class
* Added implementation of base class
* Added missing parameter
* Added try-catch around delete operations in Purge() to ignore locked files during cleanup.
* Content: Fix name() and getName() to use active variant when no variantId provided
When calling `name()` or `getName()` without a variantId argument, the methods
now correctly return the name of the first active variant from the split view
instead of always returning the first variant in the data array.
The `name()` method now returns a reactive observable that updates when the
active variant changes, using `mergeObservables` to combine the split view's
active variant observable with the variants data.
The `getName()` method now uses `splitView.getActiveVariants()[0]` to get the
current active variant synchronously, with a fallback to the first variant if
no active variant is set.
This fixes an issue where block previews could not reactively observe the
document name because the callback parameter was always empty.
Closes#20759🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: use UmbVariantId.compare() for consistent variant matching
Address PR review feedback by using UmbVariantId.Create() and compare()
instead of direct property comparison. This ensures consistent behavior
with the existing variant comparison pattern used throughout the codebase.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: formatting
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Re-provide support for casting a published member to the models builder type.
* Used new constructor for MemberManager in unit tests.
* Fix failing unit tests.
* Relations: Fix descendants query to exclude parent item
The GetPagedDescendantsInReferences query was using a path LIKE without
the comma delimiter, causing it to match both the parent item and its
descendants. This resulted in the trash confirmation dialog showing
the item being deleted in the "descending items with dependencies"
list.
Changed the WhereLike call to use ",%" suffix instead of just "%",
so the query only matches actual descendants (items whose path
starts with the parent's path followed by a comma).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add integration test to verify behaviour.
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
Fix SQL Server deadlock during concurrent document updates
Add ReadLock on ContentTree in RefreshMemoryCacheAsync to prevent
deadlocks between cache refresh SELECT queries and concurrent document
UPDATE operations. The deadlock occurred because the operations accessed
umbracoNode and umbracoDocument tables in different orders.
The #debouncedLoadTree method was not awaiting repository initialization
before calling loadChildren() when hideTreeRoot was true. This caused a
"repository is missing" error in tree pickers like the Static File picker
used for block thumbnails.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Added tests for regression issue #20962
* Added tests for regression issue #20520
* Added tests for rendering content with RTE
* Added @release tags
* Bumped version
* Make new added tests run in the pipeline
* Updated dataTypeName
* Fixed comments
* Reverted npm command
* fix: add write lock at outer scope to prevent deadlocks in content publishing
Acquire a write lock on ContentTree at the start of PublishAsync to prevent
deadlocks. Previously, inner scopes would acquire read locks first (via
repository operations), then attempt to upgrade to write locks, causing
deadlocks when multiple transactions tried this simultaneously.
By acquiring the write lock at the outer scope, we ensure consistent lock
ordering and prevent the deadlock scenario.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Re-enable lazy locks
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Introduce new content type schema service and models
To be used in the future for content type schema generation.
* Do not fail when content type is not in cache, simply ignore
* Added unit and integration tests
* Fix failing unit tests
* Addressing comments from code review
* add content key and type to link info on RTE delivery API data. Fix tests to accomodate changes
* convert field type content-id -> destination-id. convert field type content-type -> link-type and use LinkType enum instead.
* revert unintended find and replace changes
* apply patch by kjac
* fix unit tests for RTE parsers
---------
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
* block context example
* fix clone method
* implement contextual variant id
* use contextual variant id
* ensure currentExposeOf uses elementType configuration
* make hasExposeOf use ElementType configuration for variatId
* Update src/Umbraco.Web.UI.Client/src/packages/rte/components/rte-base.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* rename to displayVariant
* use variantid in this case
* update readme
* return false
* remove unused imports
* return undefined
* append UmbWorkspaceViewElement interface
* remove test
* fallback to false
* fallback to false
* refactor what is not exposed.
* Fix#20944: Updating UI Slider number properties to accept decimal values (#20945)
* updating UI slider properties min, max, initial1, initial2 and step to accept decimal values
* Changes based on Copilot suggestions
* Used a smaller step value configuration.
---------
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
Co-authored-by: Engiber Lozada <89547469+engijlr@users.noreply.github.com>
Co-authored-by: engjlr <enl@umbraco.dk>
* Manifests: Fix misnaming and mis-registering of the document validation manifest (closes#21128) (#21139)
Fix misnaming and mis-registering of the document validation manifest.
* Performance: Optimize memory footprint of document URL cache (closes#21055) (#21066)
* Optimize memory footprint of document URL cache.
* Update tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/DocumentUrlServiceTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Used properties, added some further comments.
* Fixed failing integration tests.
* Ensure no edge case exists where the culture code to language Id map isn't up to date with the newly created languages.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Block List: Sort mode (#21060)
* Block List: added sort-mode
* Fix missing closing bracket
* register sort mode toolbar element on start up
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
# Conflicts:
# src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts
* Update nightly build to include 16 as 17 is now main (#21144)
* Global search items missing Umbraco url segment (#20266)
* Add /umbraco url Segament for searched mapped results to aviod 404 og navigation away from backoffice
* Applied changes from code review.
---------
Co-authored-by: Lucas Bach Bisgaard <lucas.bisgaard@kraftvaerk.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* import
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jason Andrae <jasona@emergentsoftware.net>
Co-authored-by: Engiber Lozada <89547469+engijlr@users.noreply.github.com>
Co-authored-by: engjlr <enl@umbraco.dk>
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Lee Kelleher <leekelleher@users.noreply.github.com>
Co-authored-by: Mads Rasmussen <madsr@hey.com>
Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Lucas Bach Bisgaard <rammi@rammi.dk>
Co-authored-by: Lucas Bach Bisgaard <lucas.bisgaard@kraftvaerk.com>
* get full path of file
* get configuration umbracosspath from BE and use it when get css file
* fix lint error
* update for test fail
* add obsolete constructor
* Update src/Umbraco.Cms.Api.Management/Controllers/Server/ConfigurationServerController.cs
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Update src/Umbraco.Cms.Api.Management/Controllers/Server/ConfigurationServerController.cs
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Added `umbracoCssPath` to mock Server handler
* Added `umbracoCssPath` to Server Connection controller
* Removed the Tiptap Config Repository/Store code
we can simplify this by reusing the Server Context.
* Used `UMB_SERVER_CONTEXT` to get the `umbracoCssPath`
---------
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Add /umbraco url Segament for searched mapped results to aviod 404 og navigation away from backoffice
* Applied changes from code review.
---------
Co-authored-by: Lucas Bach Bisgaard <lucas.bisgaard@kraftvaerk.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Optimize memory footprint of document URL cache.
* Update tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/DocumentUrlServiceTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Used properties, added some further comments.
* Fixed failing integration tests.
* Ensure no edge case exists where the culture code to language Id map isn't up to date with the newly created languages.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Populate repository cache by GUID when retrieving documents by integer ID, to avoid database hit on subsequent retrieval by key.
* Apply same for media repository.
* Use existing helper to centralise generation of repository cache keys.
* Minor clean-up.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Applied suggestions from code review.
* Apply suggestions from code review
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Applied suggestions from code review.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Block Workspace: Only update view title when opened in modal context
Prevents unintended document title updates when block workspace is used
outside of modal context. Also adds early return in view controller when
no local title is available to avoid setting an empty title prefix.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* View Controller: Reactivate parent view when child is removed
When a non-inheriting child view (like a modal) is removed, the parent
view may have been deactivated. This change ensures the parent view is
reactivated to restore the browser title when the modal closes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update src/Umbraco.Web.UI.Client/src/packages/core/view/context/view.controller.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Docs: Add PR naming convention to CLAUDE.md
Integrate the PR naming guidelines from PullRequestNaming.md into the
Pull Request Process section of CLAUDE.md for better discoverability.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Remove area
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Introducing lock and logic to find directory to be deleted
* Obsoleting old ctor
* Expanding obsolete comment
* Adding new parameter to tests
* Adding database to failing integration tests.
* Adding more tests
* Fixing flawed logic
* Cleanup on FileSystemsTests.cs
UFM Filter base, check that the component is connected to the DOM
otherwise the context no longer exists and the `render` still runs,
giving a bunch of "missing filter" warnings.
fix: add write lock at outer scope to prevent deadlocks in content publishing
Acquire a write lock on ContentTree at the start of PublishAsync to prevent
deadlocks. Previously, inner scopes would acquire read locks first (via
repository operations), then attempt to upgrade to write locks, causing
deadlocks when multiple transactions tried this simultaneously.
By acquiring the write lock at the outer scope, we ensure consistent lock
ordering and prevent the deadlock scenario.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Adding allow content type alias settings and validator
* Creating private helper method for tests
* Revisiting logic for disallow types
* Adding tests for validator
* Obsolete unnecessary methods and overloads.
* Fix warning and update naming in tests.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Adjust the document type creation flow so that a template can be created for a content type
Add id, name and alias to the request payload to allow creating multiple templates for the same document type
Small adjustments
Remove unused import and unnecessary async
Switched content type template creation to content type controller
Missing constant export
# Conflicts:
# src/Umbraco.Web.UI.Client/src/packages/core/backend-api/sdk.gen.ts
* Add default implementation for CreateForContentTypeAsync
* Small adjustments from code review
* Introduce InvalidTemplateAlias content type operation status
* Add tests for CreateTemplateAsync and fix alias validation
- Add integration tests for ContentTypeService.CreateTemplateAsync:
- Success case with template association
- NotFound status for non-existent content type
- InvalidTemplateAlias for empty and too-long aliases
- Default template assignment verification
- Fix bug in TemplateService.CreateAsync where alias validation
occurred after GetViewContent call, causing ArgumentNullException
for invalid aliases instead of returning InvalidAlias status
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Use EagerWriteLock for long running operations
Switch from WriteLock to EagerWriteLock when acquiring the lock for
long running operations to ensure proper lock acquisition timing.
* Sync: Fix SyncBootStateAccessor to use ILastSyncedManager
Update SyncBootStateAccessor to use the new ILastSyncedManager interface
instead of the deprecated LastSyncedFileManager, which was causing cold
boots to be triggered every time.
- Replace LastSyncedFileManager field with ILastSyncedManager
- Add new primary constructor accepting ILastSyncedManager
- Add obsolete constructors for backwards compatibility using StaticServiceProvider
- Update GetSyncBootState to use GetLastSyncedExternalAsync
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Sync: Add integration tests for SyncBootStateAccessor
Add integration tests to verify SyncBootStateAccessor correctly
determines cold boot vs warm boot state based on ILastSyncedManager.
- Test cold boot when no last synced ID exists
- Test warm boot when last synced external ID matches a cache instruction
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Sync: Fix SyncBootStateAccessor to use ILastSyncedManager
Update SyncBootStateAccessor to use the new ILastSyncedManager interface
instead of the deprecated LastSyncedFileManager, which was causing cold
boots to be triggered every time.
- Replace LastSyncedFileManager field with ILastSyncedManager
- Add new primary constructor accepting ILastSyncedManager
- Add obsolete constructors for backwards compatibility using StaticServiceProvider
- Update GetSyncBootState to use GetLastSyncedExternalAsync
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Sync: Add integration tests for SyncBootStateAccessor
Add integration tests to verify SyncBootStateAccessor correctly
determines cold boot vs warm boot state based on ILastSyncedManager.
- Test cold boot when no last synced ID exists
- Test warm boot when last synced external ID matches a cache instruction
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Improve deletion logic in UmbracoContentIndex
When re-indexing a node it will first delete it, however in many cases the query to delete doesn't return anything, however a delete command is still executed with an empty integer collection. We can avoid allocating and iterating lists and avoid the deletion call all together if the collection is empty.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Clean-up and warning resolution whilst we are modifying class.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add entity collection item card extension type + default elements
* implement user collection item card
* fix selection events
* map to prop
* add prop/attr for href
* add support for which detail properties to show
* update type import
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/item/entity-collection-item-card/entity-collection-item-card.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* import card in correct file
* Fix event listener binding for selection events
* implement disabled property for collection item cards
* init commit of collection item ref extension
* fix imports
* add element interface
* Implement UmbEntityCollectionItemElement interface in item cards
Added the UmbEntityCollectionItemElement interface to document and user collection item card elements for improved type safety and consistency. Updated type exports to include the new interface.
* Update collection item ref to use uui-ref-node
Replaces the placeholder div with a uui-ref-node component, passing relevant item properties and event handlers. Adds dynamic icon rendering using umb-icon.
* Refactor entity collection item elements to use shared base
Introduces a new abstract base class for entity collection item elements, consolidating shared logic for card and ref variants. Updates card and ref element implementations to extend the new base, and refactors extension manifest interfaces for consistency. This improves maintainability and reduces code duplication.
* use class instead of magic string
* introduce ref and card collection view kinds
* Utilise card kind for user collection view
* Add item-specific href support to collection views
Introduces a requestItemHref method to collection contexts for retrieving item-specific hrefs. Updates card, ref, and user table collection views to use these hrefs, enabling dynamic linking for collection items. Refactors user table name column layout to accept href via value prop instead of constructing it internally.
* Update ManifestCollectionView import path
Changed the import of ManifestCollectionView from '../extensions/types.js' to '../view/types.js' to reflect its new location.
* use box
* render entity actions
* use edit path builder for user links
* rename method
* Revert "rename method"
This reverts commit 4df577688e.
* Update collection-default.context.ts
* make type lint ignore unused args with an underscore
* temp remove unused
* only make collection vie selectable if there are any registered bulk actions
* don't render name link if there is no href
* fix imports
* use selectable state
* Update language-table-collection-view.element.ts
* Update card-collection-view.element.ts
* clean up
* Refactor collection views to use shared base class
* refactor(collection): parallelize href fetching and make method private
* docs(examples): update collection example to use card and ref kinds
* docs(examples): add icon property to collection example data model
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/view/types.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update collection-bulk-action.manager.test.ts
* Removed duplicate and redundant '@typescript-eslint/no-unused-vars' rule definitions, consolidating the configuration to use only 'argsIgnorePattern'.
* Handle missing user href in name column layout
Replaces the user name link with a span when the href property is not provided, preventing broken links in the user table name column layout.
* Update user-table-name-column-layout.element.ts
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
When multiple Umbraco extensions (e.g., BulletList and OrderedList) include
the same Tiptap extension (ListItem), duplicates were added to the extensions
array, causing Tiptap to log warnings. This change uses a Map to deduplicate
extensions by their name property before passing them to the Editor.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Added 'mandatory' tag as a visual indicator for webhook events being mandatory.
* Map the webhook validation for no events specified to a specific API response problem details message.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
The contributing documentation still referenced the old `contrib` branch,
which was causing AI tools to incorrectly use it as the base branch for
comparisons. Updated all references to use `main` instead.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
* Back-office auth: Calculate token cookie names at request time
The __Host- cookie prefix enforces secure cookies at browser level,
which caused cookies to be rejected when running over HTTP in local
development environments even when UseHttps was set to false.
Cookie names are now calculated per-request based on both the UseHttps
setting and whether the current request is over HTTPS, matching the
logic used for the Secure cookie option.
* Update src/Umbraco.Cms.Api.Common/DependencyInjection/HideBackOfficeTokensHandler.cs
Co-authored-by: Sven Geusens <sge@umbraco.dk>
---------
Co-authored-by: Sven Geusens <sge@umbraco.dk>
* Adding functionality to overwrite the cacheduration for NewsDashboard
* Making the extension its own class, as to avoid having to inherit the entire service.
* Changing options to duration and adding interface
* Only validate segment values for cultures they are defined for.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Integration test suppressions.
* Remove previous implementation using ISegmentService and rely on values provided in the model to determine segments with cultures.
* Omit null culture and remove passing but unrealistic tests.
* Fixed nullability error.
* Apply suggestions from code review
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
* Relocated function following code review.
* Reset unchanged files.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
* fix(backoffice): Tree menu item shows undefined for variant names without fallback
When a document variant has no name set and there's no fallback language
configured, the tree now falls back to the first variant with any name
instead of displaying "undefined".
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(backoffice): Show (Untitled) when no variant has a name
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix: uses localization string() to localize user-provided labels
* fix: localizes placeholder as well
* Refinements to the Toggle input
The localizations can happen in the `config` setter,
then they don't need to re-get the localization each re-render.
Added a `when` directive to show/hide the label `<span>` tag.
Removed `_currentLabel` as unused.
* Refinements to the Textbox input
The localizations can happen in the `config` setter,
then they don't need to re-get the localization each re-render.
Refactored the `uui-input` attributes/properties.
* Refinements to the Number input
The localizations can happen in the `config` setter,
then they don't need to re-get the localization each re-render.
Refactored the `uui-input` attributes/properties.
* Update src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/property-editors/text-box/property-editor-ui-text-box.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/property-editors/number/property-editor-ui-number.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Updates based on Copilot feedback
---------
Co-authored-by: leekelleher <leekelleher@gmail.com>
Co-authored-by: Lee Kelleher <leekelleher@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Added `icon-sort`
from Lucide's "arrow-down-up" icon.
* Added "Sort" package
with property action and context.
* Adds the "sort" property action and context to the Block Grid property
* [WIP] Observing sort mode toggle on Block Grid editor
* [WIP] Further work on Block Grid editor sort-mode
* Added "umb-sort-mode-toolbar" component
* Fixed typo of private method "renderNoting"
* Renamed "sort" property-action to "sort-mode"
* Corrected bad copypasta!
* Renamed "Sort" package to "Sorter"
to include the Sorter controller and maintain backwards-compatibility.
* Code updates based on @copilot feedback
* Fixed circular references
* Removed reference to "sorter/index.ts"
that I'd missed when relocating the package.
* Moved "sorter" back into "core" package
* Moved the "sort" property-action to a combined "property-actions" location
Fixed up other code, use of constants and manifest clarity.
* rename with claude code (#21036)
* rename with claude code
* include property action in name
* renaming
* Rename sortingMode to isSortMode in property sort context
Refactored property sort mode context and related components to use 'isSortMode'
* add jsdocs
* Update vite.config.ts
* no need to export as element
* add tests
* Ordered the tsconfig namespaces
* Reverted the relocation of the "sorter" controller files
* Import ordering
* Reverted some code style tweaks
* Renamed `sortingMode` to `isSortMode`
* Renamed `sortModeEnabled` to `isSortMode`
* Add tests for property sort mode action
* add js docs
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* fix: sets profiling cookie to httpOnly and strict in order to run non-secure
* fix: adds extra message to explain when you can set a cookie
* fix: simplify cookie explanation comment in WebProfilerRepository
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: checks that the profiler is actually enabled and/or disabled and warns the user if that is not the case
* Update src/Umbraco.Web.UI.Client/src/assets/lang/en.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: uses 'href' as property instead of attribute
* build: runs on PR to release branches
* Content references: Avoid requesting references for content that is not yet persisted server side (#21035)
* Avoid requesting references for content that is not yet persisted server side.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* refactor to use condition
* revert
* danish translations
* da translation
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* fix: CTRL+Click now opens links in new tab on Linux
The router's anchor click handler incorrectly assumed non-Windows
platforms use Meta (⌘) key for "open in new tab". This broke
CTRL+Click on Linux, which uses CTRL like Windows.
Changed detection from "is Windows" to "is Mac" so Linux correctly
uses CTRL+Click while Mac continues to use Meta+Click.
Also replaced deprecated navigator.platform with navigator.userAgent.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
refactor(backoffice): remove unused uui-dialog element in modal component
Remove dead code that created an unnecessary uui-dialog element inside uui-modal-dialog. The uui-modal-dialog component already manages its own internal dialog element, making the manual creation redundant.
This aligns the dialog implementation with the sidebar implementation pattern, where container elements manage their own internal structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
* Add entity collection item card extension type + default elements
* implement user collection item card
* fix selection events
* map to prop
* add prop/attr for href
* add support for which detail properties to show
* update type import
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/item/entity-collection-item-card/entity-collection-item-card.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* import card in correct file
* Fix event listener binding for selection events
* implement disabled property for collection item cards
* init commit of collection item ref extension
* fix imports
* add element interface
* Implement UmbEntityCollectionItemElement interface in item cards
Added the UmbEntityCollectionItemElement interface to document and user collection item card elements for improved type safety and consistency. Updated type exports to include the new interface.
* Update collection item ref to use uui-ref-node
Replaces the placeholder div with a uui-ref-node component, passing relevant item properties and event handlers. Adds dynamic icon rendering using umb-icon.
* Refactor entity collection item elements to use shared base
Introduces a new abstract base class for entity collection item elements, consolidating shared logic for card and ref variants. Updates card and ref element implementations to extend the new base, and refactors extension manifest interfaces for consistency. This improves maintainability and reduces code duplication.
* use class instead of magic string
* Use ifDefined for href in item card element
* Fix href attribute handling in collection item ref
* Make meta property optional in ManifestEntityCollectionItemBase
* Use ifDefined for href binding in document card
* Fix user card href binding with ifDefined
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: adds `termOrDefault` to be able to safely fall back to a value if the translation does not exist
* feat: accepts 'null' as fallback
* feat: uses 'termOrDefault' to do a safe null-check and uses 'willUpdate' to contain number of re-renders
* feat: uses null-check to determine if key is set
* chore: accidental rename of variable
* uses `when()` to evaluate
* revert commits
* fix: improves the fallback mechanism
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* move legacy icons into a folder
* regenerate icons
* icon compile script for custom
* Reverts "icon-company" to use "building-2" from latest Lucide version
---------
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Implement form control for user picker property editor.
* Added form control support to member picker property editor.
* Added form control support to member group picker property editor and removed super.value.
* Reverted max state to infinity.
* Removed console.log inside the render.
* Removed duplicated import.
* Import missing input components in member picker tests
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
* Return not found when request for content references when entity does not exist.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Move check for entity existence from controller to the service.
* Update OpenApi.json.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Addressed points raised in code review.
* Update OpenApi.json
* Resolved breaking changes.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit da94e0953b)
* Return not found when request for content references when entity does not exist.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Move check for entity existence from controller to the service.
* Update OpenApi.json.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Addressed points raised in code review.
* Update OpenApi.json
* Resolved breaking changes.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Applies checks for root folders to static file tree service.
* Add integration tests.
* Fix ancestor test.
* Amends from code review.
* Integration test compatibility suppressions.
* Reverted breaking change in test base class.
(cherry picked from commit 84c15ff4d7)
* Applies checks for root folders to static file tree service.
* Add integration tests.
* Fix ancestor test.
* Amends from code review.
* Integration test compatibility suppressions.
* Reverted breaking change in test base class.
* Fix infinite recursion and incorrect error notifications in tree children loading
This commit addresses two critical issues in the tree item children manager:
1. **Infinite recursion vulnerability**: The #resetChildren() method called
loadChildren(), which could recursively call #resetChildren() again if
the underlying issue persisted, creating an infinite loop.
2. **Inappropriate error messages**: The "Menu loading failed" notification
was shown even in legitimate scenarios, such as when deleting the last
child of a node, where an empty tree is the expected outcome.
Changes made:
- Add ResetReason type ('error' | 'empty' | 'fallback') to differentiate
between error states and expected empty states
- Extract #loadChildrenWithOffsetPagination() as a terminal fallback method
that uses only offset pagination and never calls #resetChildren(),
structurally preventing recursion
- Update #resetChildren() to:
- Accept a reason parameter to determine whether to show error notification
- Reset all retry counters (#loadChildrenRetries, #loadPrevItemsRetries,
#loadNextItemsRetries) to ensure clean state
- Call #loadChildrenWithOffsetPagination() instead of loadChildren()
- Only show error notification when reason is 'error'
- Update all call sites of #resetChildren() with appropriate reasons:
- 'error' when retries are exhausted (actual failures)
- 'empty' or 'fallback' when no new target is found (may be expected,
e.g., after deleting items)
The fix makes infinite recursion structurally impossible by creating a
one-way flow: target-based loading can fall back to #resetChildren(),
which calls offset-only loading that never recurses back.
* Fix undefined items array causing tree to break after deletion
This fixes the root cause of issue #20977 where deleting a document type
would cause the tree to "forever load" with a JavaScript error.
The error occurred in #getTargetResultHasValidParents() which called .every()
on data without checking if it was undefined. When the API returned undefined
items (e.g., after deleting the last child), this caused:
TypeError: can't access property "every", e is undefined
The fix adds a guard to check if data is undefined before calling .every(),
returning false in that case to trigger the proper error handling flow.
* Address code review feedback on terminal fallback method
- Change error throwing to silent return for graceful failure handling
- Remove target pagination state updates from offset-only loading method
- Update JSDoc to clarify that method does not throw errors
* Add migration to fix umbracoPropertyData column casing.
* Improve migration with column existence check and logging
- Add ILogger to log when column is renamed
- Check if column exists with incorrect casing before renaming
- Use fluent Rename API instead of raw SQL
- Add XML remarks documentation
?? Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Clarify what old and new column name really is
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: kjac <kja@umbraco.dk>
# Conflicts:
# src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs
* Add migration to fix umbracoPropertyData column casing.
* Improve migration with column existence check and logging
- Add ILogger to log when column is renamed
- Check if column exists with incorrect casing before renaming
- Use fluent Rename API instead of raw SQL
- Add XML remarks documentation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Clarify what old and new column name really is
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: kjac <kja@umbraco.dk>
Use AddComponent for OpenAPI security scheme registration
Fixes security requirements being serialized as empty objects in the
OpenAPI document by using the document's AddComponent method instead
of directly manipulating the SecuritySchemes dictionary.
Update table view icon to 'icon-table'
Replaces the 'icon-list' icon with 'icon-table' for all table view manifests across multiple packages to improve consistency and better represent the table view visually.
* Add validation property to PropertyEditorSettingsProperty
Introduces a 'validation' field to the PropertyEditorSettingsProperty interface, allowing configuration of mandatory status and custom mandatory messages for property editor settings.
* Pass validation property to umb-property component
* add menu context and breadcrumbs for document type folders
* add menu context and breadcrumbs for media type folders
* add menu context and breadcrumbs for media type folders
* add menu context and breadcrumbs for partial view folders
* add menu context and breadcrumbs for partial view folders
* add menu context and breadcrumbs for script folders
* Register menu structure workspace contexts and breadcrumbs for document blueprints
* fix menu alias
* remove from blueprints
* fix wrong path when navigating from an inner folder to an outer
* remove debugger
* fix structure link between variant to invariant
* fix up path generation
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* fix: deprecates the upgrade checker
* fix: removes any deprecated UI that no longer has a function for upgrade checks in the backoffice
* chore: generates new api types
* chore: deprecates types
* chore: returns direct task
* docs: explains deprecation
* chore: deprecated model
---------
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Fix preview showing published version when Save and Preview is clicked multiple times
Fixes#20981
When clicking "Save and Preview" multiple times, the preview tab would show the published version instead of the latest saved version. This occurred because:
1. Each "Save and Preview" creates a new preview session with a new token
2. The preview window is reused (via named window target)
3. Without a URL change, the browser doesn't reload and misses the new session token
4. The stale page gets redirected to the published URL
Solution: Add a cache-busting parameter (?rnd=timestamp) to the preview URL, forcing the browser to reload and pick up the new preview session token. This aligns with how SignalR refreshes work.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Improve Save and Preview to avoid full page reloads when preview is already open
When clicking "Save and Preview" multiple times with a preview tab already open, the entire preview tab would reload. This enhancement makes it behave like the "Save" button - only the iframe reloads, not the entire preview wrapper.
Changes:
- Store reference to preview window when opened
- Check if preview window is still open before creating new session
- If open, just focus it and let SignalR handle the iframe refresh
- If closed, create new preview session and open new window
This provides a smoother UX where subsequent saves don't cause the preview frame and controls to reload, only the content iframe refreshes via SignalR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Close preview window when ending preview session
Changes the "End Preview" behavior to close the preview tab instead of navigating to the published URL. This provides a cleaner UX and ensures subsequent "Save and Preview" actions will always create a fresh preview session.
Benefits:
- Eliminates edge case where preview window remains open but is no longer in preview mode
- Simpler behavior - preview session ends and window closes
- Users can use "Preview website" button if they want to view published page
Also removes unnecessary await on SignalR connection.stop() to prevent blocking if the connection cleanup hangs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix preview cookie expiration and add proper error handling
This commit addresses cookie management issues in the preview system:
1. **Cookie Expiration API Enhancement**
- Added `ExpireCookie` overload with security parameters (httpOnly, secure, sameSiteMode)
- Added `SetCookieValue` overload with optional expires parameter
- Marked old methods as obsolete for removal in Umbraco 19
- Ensures cookies are expired with matching security attributes
2. **PreviewService Cookie Handling**
- Changed to use new `ExpireCookie` method with explicit security attributes
- Maintains `Secure=true` and `SameSite=None` for cross-site scenarios
- Uses new `SetCookieValue` overload with explicit expires parameter
- Properly expires preview cookies when ending preview session
3. **Frontend Error Handling**
- Added try-catch around preview window reference checks
- Handles stale window references gracefully
- Prevents potential errors from accessing closed window properties
These changes ensure preview cookies are properly managed throughout their
lifecycle and support both same-site and cross-site scenarios (e.g., when
the backoffice is on a different domain/port during development).
Fixes#20981🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Track document ID for preview window to prevent reusing window across different documents
When navigating from one document to another in the backoffice, the preview window reference was being reused even though it was showing a different document. This meant clicking "Save and Preview" would just focus the existing window without updating it to show the new document.
Now we track which document the preview window is showing and only reuse the window if:
1. The window is still open
2. The window is showing the same document
This ensures each document gets its own preview session while still avoiding unnecessary full page reloads when repeatedly previewing the same document.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove updates to ICookieManager and use Cookies.Delete to remove cookie.
* Fix file not found on click to save and preview.
* Removed further currently unnecessary updates to the cookie manager interface and implementation.
* Fixed failing unit test.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Created condition for workspace content type unique.
* Changed import.
* Revert import.
* Updated name in the alias example and also import.
* Update src/Umbraco.Web.UI.Client/examples/entity-content-type-condition/index.ts
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* Update src/Umbraco.Web.UI.Client/examples/entity-content-type-condition/workspace-view-unique.element.ts
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* Moved the manifest definition to the manifest file.
* Changed default export.
* Updated example element to render the real GUID.
* Fixed import.
* Replaced CONTENT_WORKSPACE for PROPERTY_STRUCTURE_WORKSPACE context.
* Moved content type unique condition to the content type folder.
* Fixed import.
* final adjustments
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* Adding the sorter controller, and fixing some ui elements so you are able to drag the hostname elements around to sort them
* Fixed sorting
* Changed the html structure and tweaked around with the css to make it look better.
Added a description for the Culture section.
Alligned the rendered text to allign better with the name "Culture and Hostnames"
* Update src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/modal/culture-and-hostnames-modal.element.ts
Forgot to remove this after I was done testing
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/modal/culture-and-hostnames-modal.element.ts
Changing grid-gap to just gap
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Removed the disabled and readonly props I added since they are not needed.
Removed the conditional rendering that was attached to the readonly and disabled properties
* Removed the item id from the element and changed css and sorter logic to target the hostname-item class instead
* Updated test
* Bumped helpers
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
Co-authored-by: Andreas Zerbst <andr317c@live.dk>
* Adds choose directive to @umbraco-cms/backoffice/external/lit
This can then allow choose to be imported like so
import { html, customElement, LitElement, property, css, choose } from '@umbraco-cms/backoffice/external/lit';
* Exports all of Lits directives for @umbraco-cms/backoffice/external/lit
Also puts them in alphabetical order to help add any new ones Lit may add in the future
* Regenerate delivery api claud memory file for updated file lines and inclusion of Secure Cookie-Based Token Storage
* Add delivery api memory file
* claude memory file for in memory modelsbuilder project
* Claud memory file for Imagesharp project
* Claude memory file for legacy image sharp project
* Claude memory files for Persistence projects
* Remaining claude memory files
* Log Viewer: Refactor log types chart to use Lit repeat directive
- Import and use repeat directive for better performance
- Add _logLevelKeys state property to track log level keys
- Update setLogLevelCount() to populate _logLevelKeys
- Replace .map() with repeat() in render method for legend and donut slices
- Update willUpdate to observe both filter and response changes
- Resolves TODO comment about using repeat directive
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Donut Chart: Add inline numbers and fix tooltip positioning
- Add showInlineNumbers property to optionally display numbers inside slices
- Implement #getTextPosition() method to calculate text position at slice center
- Render SVG text elements when showInlineNumbers is enabled
- Fix tooltip positioning to appear near cursor (changed from x-10, y-70 to x+10, y+10)
- Recalculate container bounds on each mouse move to handle window resize
- Add pointer-events: none to tooltip to prevent mouse interference
- Add CSS styling for slice numbers (user-select: none)
- Enable inline numbers by default in log viewer log types chart
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Donut Chart: Add clickable slices and visible description
- Add href property to donut-slice element for clickable slices
- Wrap SVG paths in <a> tags when href is provided
- Update Circle interface to include href property
- Add showDescription property to optionally display description text
- Render description as visible text below the chart
- Add CSS styling for description text
- Update log-types-chart to build search URLs with log level and date range
- Observe dateRange from context to build accurate search URLs
- Enable clickable slices and visible description in log-types-chart
Now clicking on a donut slice navigates to the search view filtered by that log level and the current date range.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: uses whole link
* Log Viewer: Fix log types chart layout for larger screens
Add media query to switch from column to row layout on screens wider than 768px. This ensures the legend and donut chart are displayed side by side on desktop resolutions instead of stacked vertically.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: improves mock function
* chore: formatting
* fix: ensures the donut chart works responsively
* feat: adds support for SVGAElement in the router
* adds key for description
* chore: adds test data
* feat: displays numbers in the legend instead of the chart
* chore: restores functionality with lower-cased keys
* fix: adds translation to 'log messages'
* chore: removes unused method
* feat: ensures that the log levels follow the generated LogLevelModel enum from the server, which requires to map the keys as JSON camelCase's the keys
* fix: uses correct property
* fix: reverts back to the original behavior to calculate a relative URL (rather than the automatic .toString() that gets a qualified URL)
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: uses fullUrl for router
* fix: properly translates new aria-label
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Added tests for notification emails for content
* Bumped version
* Updated tests for notification permission in content
* Added appsettings.json for smtp tests
* Added smtp test project
* Updated nightly E2E test pipeline yaml file to run smtp project in the pipeline
* Fixed command to run smtp4dev in Docker
* Fixed pipeline
* Only run smtp tests on Linux
* Debugged
* Debugging
* Added step to stop smtp4dev container
* Debugging
* Updated port
* Reverted tests
* Added more tests for notification emails
* Formatted code
* Fix css for login screen dark mode
* Removes the outer-layout wrapper, moving the flexbox to the host
Sets the fallback for `--umb-auth-backdrop` to `--uui-color-surface`
---------
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
Co-authored-by: leekelleher <leekelleher@gmail.com>
* fix: adds localization to the log viewer
* fix: missing log viewer keys for English
* fix: translations for Danish
* fix: removes unused keys and replaces polling keys
* fix: lowercases values to match what was there before
* Fix validation for url and anchor of multi url picker
* fix codesence warning
* remove redundant validation
---------
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
* Allowed selection of all available fields in Examine search results, and fix layout issue when not all records have all fields.
* Updates from code review.
Add menu item registration examples
Introduces example implementations for registering action, link, and entity menu items in the backoffice. Includes manifests and API to demonstrate how to extend the menu system.
* Updated the content-name element to use the DocumentItemDataResolver.
* Import sorting
* Defaults the entity-type to "document"
---------
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Adds localization manifests for region-specific cultures
This is to support backwards-compatibility and v13 upgradability.
* Removed `uiCulture` from Vietnamese localizations
since it duplicated the English fallback texts.
* 'en' localization file formatting
* Update src/Umbraco.Web.UI.Client/src/assets/lang/en.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Swashbuckle to v10
* Regenerate backoffice api client
* Add missing space for consistency
* Simplify nullability check
* Small improvement
Didn't notice that these classes were internal, so tried keeping compatibility, but it wasn't needed.
* Fix failing integration test
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove unnecessary comma
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: adds correct fallback for dates to avoid console error
* fix: resolves a TODO by using UmbStringState over rxjs Subject
* Refactor log viewer search to use UmbStringState and improve architecture
- Replace RxJS Subject with UmbStringState to follow Umbraco patterns
- Move debounced search observation to messages list component
- Only triggers when component is mounted (logs are visible)
- Prevents unnecessary API calls on other views
- Simplify search input to just update context state
- Add semantic form structure with role="search" for accessibility
- Add visually-hidden submit button for keyboard navigation
- Allow re-running same query via form submission (bypasses debounce)
- Follow same architecture pattern as date range selector
This resolves the TODO to not use RxJS directly and significantly improves
separation of concerns where the data consumer (messages list) owns the
fetching logic.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add visible refresh button to log viewer search input
- Add refresh button with icon-refresh next to save and clear buttons
- Allows users to re-run search with same query (bypasses debounce)
- Remove form structure that couldn't work due to Shadow DOM boundaries
- Simplify parent component by removing form submission logic
- Keep role="search" for accessibility
The refresh button provides a more discoverable UI than the hidden submit
button approach and avoids Shadow DOM event bubbling issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix debouncing by adding local state in search input
- Add local UmbStringState to debounce user input (250ms)
- Only update context filterExpression after debounce
- Remove debouncing from messages list (now handled at input level)
- Saved searches and refresh button still bypass debounce for immediate feedback
This restores the expected debouncing behavior while maintaining the clean
architecture where the messages list triggers searches based on context changes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: cleans up in docs
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Updated block list tests as the “Add Block” button is hidden after reaching the maximum limit.
* Updated validation option due to UI changes
* Updated tests for current user profile as waitForNetworkToBeIdle() is removed
* Fixed flaky tests
* Bumped version
* Updated tests for current user profile
* Bumped version
* Preserve existing Examine FieldDefinitionCollection if it already exists (#20267)
* Fix missing bracket
* Minor tidy/addition of comments; addition of unit tests.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* add empty trash icon and use it for empty trash-bin and delete from trash-bin
* package lock
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Add MemberType/MemberTypeContainer to supported EntityContainer object types
* Implement MemberTypeContainerRepository
* Update and add member type container API endpoints
* Complete server and client-side implementation for member type container support.
* Fix FE linting errors.
* Export folder constants.
* Applied suggestions from code review.
* Updated management API authorization tests for member types.
* Resolved breaking change on copy member type controller.
* Allow content types to be moved to own folder without error.
* Use flag providers for member type siblings endpoint.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Ensure redirects with domains are stored with the domain node id prefix.
* Handle removal of self-referencing redirect when domains are used.
* Use entity path to save further queries for retrieving ancestor IDs.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Applied refactoring suggested in code review.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Use empty folder under temp as localized text source folder in non umbraco core integration tests.
* Added clarifying comment to the GetLocalizedTextService override for tests
Handles rich text blocks created with TinyMCE in convert local links migration.
Refreshes internal datatype cache following migration requiring cache rebuild.
Handles rich text blocks created with TinyMCE in convert local links migration.
Refreshes internal datatype cache following migration requiring cache rebuild.
* Removed skips for tests whose related issues have been fixed.
* Remove skip tags and update tests for content with list view
* Removed skip tags
* Added comment and change to fixme for tests that need to implement later
* Removed skip tag
* Bumped version
* configure max chars for textbox
* min 1
* Adds server-side check for text box min and max character validation.
* Applied suggestion from code review.
* Bumped version of test helper
* Fixed test that was creating a text string data type with too large a maximum characters setting.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Nhu Dinh <hnd@umbraco.dk>
* Replace dependency track bom script with devops task
* Introduce new url variable in order to fix new task uri
The initial variable contained the api path (/api) in the URL.
* Redact back-office PKCE codes from the server
* Update src/Umbraco.Cms.Api.Common/DependencyInjection/HideBackOfficeTokensHandler.cs
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Removes npm commands from the MSBuild of the CSPROJ of the umbraco-extension dotnet new template
Was agreed by the community package team to remove this, as this DX can cause more issues than actually help users in our opinion
* Removed the unused value - good catch by Copilot
* Adding fix for self-referncing redirects for 17
* Using umbraco context on failing tests
* Tests to see if self referencing redirects gets deleted
* Refactoring and adding correct tests.
* Expanding tests for RedirectTrackerTests.cs
* Optimize by only retrieving th list of existing URLs for a content item if we have a valid route to create a redirect for.
* Extract method refactoring, added explanatory comment, fixed warnings and formatting.
* Resolved warnings in RedirectService.
* Minor naming and formatting refactor in tests.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Move access/refresh tokens to secure cookies (#20779)
* feat: adds the `credentials: include` header to all manual requests
* feat: adds `credentials: include` as a configurable option to xhr requests (and sets it by default to true)
* feat: configures the auto-generated fetch client from hey-api to include credentials by default
* Add OpenIddict handler to hide tokens from the back-office client
* Make back-office token redaction optional (default false)
* Clear back-office token cookies on logout
* Add configuration for backoffice cookie settings
* Make cookies forcefully secure + move cookie handler enabling to the BackOfficeTokenCookieSettings
* Use the "__Host-" prefix for cookie names
* docs: adds documentation on cookie settings
* build: sets up launch profile for vscode with new cookie recommended settings
* docs: adds extra note around SameSite settings
* docs: adds extra note around SameSite settings
* Respect sites that do not use HTTPS
* Explicitly invalidate potentially valid, old refresh tokens that should no longer be used
* Removed obsolete const
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* Remove configuration option
* Invalidate all existing access tokens on upgrade
* docs: updates recommended settings for development
* build: removes non-existing variable
* Skip flaky test
* Bumped version of our test helpers to fix failing tests
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Co-authored-by: Andreas Zerbst <andr317c@live.dk>
* Added form control support to color picker.
* Avoid submit when readonly is true.
* Added mandatory support.
* Added form control support to date picker.
* Removed an unused import.
* Added form control and mandatory support to document picker.
* Added form control support to Eye dropper.
* Added. mandatory support for multi url picker also bind inner input in the eye dropper.
* Removed unused import.
* fix update of value
* fixing not needed override of get and set methods
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* Added mandatory support for block grid property editor.
* Added form control and mandatory support to code editor.
* Added form control and mandatory support to markdown editor.
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* Implemented input-with-alias in the content-type-design-editor.
* Added auto-generate-alias property to the input and revert deletion of checkAliasAutoGenerate method.
* Added form-validation-message.
* Added validation to the input-with-alias element to avoid special characters.
* Chenged right and left position of the infobox.
* Added focus support to open the modal.
* Moved tabindex out the constructor and added support for enter and space keys.
* Removed isLoding condition from the rich media input and let the thumbnail handle the loader.
* Removed unused import.
* change loader and adjust lit property configuration
* update reflect configuration
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* chore(mock): adds missing try/catch around document lookup
* fix: lets the 'save and preview' button extend the 'save' button to follow the same logic in terms of when it enables/disabled - it did not have much logic before
* fix: runs validation from the server when save and previewing to ensure the UI shows what is missing
Update icon usage in collection menu and example data
Replaces <uui-icon> with <umb-icon> in the default collection menu item element to support colors. Also updates example picker data source items to showcase color support.
* Exclude the relate parent on delete relation type from checks for related documents and media on delete, when disable delete with references is enabled.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Applied suggestions from code review.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* sql column type map include dateonly and timeonly
* Split Mapper and add check null value
* Minor code tidy resolving a few warnings.
* add spaces
* clean code
---------
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Fix for partial view caches not being cleared when content is published/unpublished
* Update src/Umbraco.Core/Cache/Refreshers/Implement/ContentCacheRefresher.cs
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Change logic for clearing partial view cache
* Changed logic to only clear partial cache when content is published/unpublished or trashed
---------
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Adds new dictionary/localization item for the clipboard dialog clear all prompt
* Removes the wrapping uui-box and moved inside the component itself
* Adds Clear Clipboard button and logic
* Adds uui-box from outer components consuimg this into this component
* Adds a header to uui-box
* Adds a conditional uui-button when we have items in clipboard
* Adds confirm dialog/prompt to ask if user wants to clear all items
* Adds in general_clipboard item to use in the UUI-box header
* Removes extra space & moves the requestItems outside the for loop
* Be a better citizen
Make sure the promise for the modal is caught and we return out early if user explictiy cancels modal or presses ESC
* Cleanup my noisy comments for a re-review
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* WiP blocklist migration
* Mostly working migration
* [WIP] deconstructed the migration to prefetch and process all data that requires the old definitions
* Working singleblock migration
* Abstracted some logic and applied it to settings elements too.
* Align class and file name.
* Minor code warning resolution.
* More and better comments + made classes internal where it made sense
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Add MemberType/MemberTypeContainer to supported EntityContainer object types
* Implement MemberTypeContainerRepository
* Prepare base controller for MemberTypeTreeControllerBase.
* Revert "Prepare base controller for MemberTypeTreeControllerBase."
This reverts commit ad213a23ad.
* Added foldersOnly flag in readiness for support in 17.1.
* Added foldersOnly flag in readiness for support in 17.1 (2).
---------
Co-authored-by: Ronald Barendse <ronald@barend.se>
* Added integration tests for PropertyTypeUsageService and adjusted assert in management API permissions test.
* Commented or fixed management API integration tests verifying permissions where we were asserting on an error response.
Added 'label attribute to the uui-button in the umb-news.card.element + Removing the redundant text for uui-button since label attribute is now present
* Fix block list inline mode
https://github.com/umbraco/Umbraco-CMS/issues/20618
* Fixed potential runtime errors
* Code cleanup
* Fixed Code Health Review
* Revert some changes
Commented out unused state properties and related code.
* Remove commented-out state property in block workspace view
* fix localization
* no need for question mark after ids, they should be presented as required
---------
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
* Add errorDetail property to umb-entity-item-ref
Add optional errorDetail property to display additional context
(such as file paths or IDs) in error states. This enhances the
error display to show both the error message and relevant details.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Make _removeItem protected in UmbPickerInputContext
Change #removeItem from private to protected to allow subclasses
to reuse the removal logic while customizing the confirmation dialog.
This enables better extensibility for specialized picker contexts.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix static file picker to show error state for missing files
Update umb-input-static-file to observe statuses and render based
on item state (loading, error, success). When a static file is
missing (API returns empty array), displays error state with alert
icon and file path detail using umb-entity-item-ref.
Also adds standalone property support for proper single-item styling.
Fixes#19329🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Show file path in static file remove confirmation dialog
Override requestRemoveItem in UmbStaticFilePickerInputContext to
display the file path instead of "Not found" in the confirmation
dialog when removing missing static files.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Show GUID in document picker error state
Display the document GUID as errorDetail when a document is
not found (deleted/gone). This provides useful context for
editors to identify which document was referenced.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Show GUID in document picker remove confirmation dialog
Display the document GUID instead of "Not found" in the remove
confirmation dialog when the document no longer exists. This
provides useful context for editors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: apply the temp model which the context uses
* Refactor: Move requestRemoveItem logic to base UmbPickerInputContext
Eliminated duplicate code across three picker contexts by:
- Adding protected getItemDisplayName() method to base class
- Moving requestRemoveItem implementation to base class
- Removing duplicate implementations from document, member, and static file pickers
- Static file picker overrides getItemDisplayName() to show file path
Net reduction: 19 lines of code (69 removed, 50 added)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Document Type Picker: Show error state for missing items (fixes#20367)
Apply the same error state handling to the document type picker that was
implemented for static files, documents, and members. When a referenced
document type is missing or deleted:
- Show error state with the GUID as errorDetail
- Allow removal with proper confirmation dialog
- Use umb-entity-item-ref for error display
- Use uui-ref-node-document-type for successful items
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Additional pickers: Show error states for missing items in user, language, media-type, member-type, member-group, and user-group pickers
Apply the same error state handling pattern to six additional picker types:
- user-input: Users
- input-language: Languages
- input-media-type: Media types
- input-member-type: Member types
- input-member-group: Member groups
- user-group-input: User groups
All pickers now:
- Observe statuses from UmbRepositoryItemsManager
- Show error state with GUID when referenced item is missing/deleted
- Use umb-entity-item-ref for error display
- Use specialized components (uui-ref-node, umb-user-group-ref, etc.) for successful items
- Allow removal with proper confirmation dialog showing GUID
Maintains code reusability by using the base class requestRemoveItem method
with getItemDisplayName() for consistent error handling across all pickers.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Lint: Remove unused 'when' imports from input-media-type and user-group-input
* Refactor: Add #renderItem helper method to all pickers for consistency
- Add #renderItem to user-input (extracted from inline repeat callback)
- Change _renderItem to #renderItem in user-group-input for consistency
- Change _renderItem to #renderItem in input-static-file for consistency
All 10 pickers now use consistent #renderItem helper method pattern,
improving code readability and maintainability as suggested by @nielslyngsoe
* `import` sorting
* Corrected (old) JSDoc typos
* Markup tidy-up
* exported `UmbPropertyEditorUIStaticFilePickerElement` as `element`
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: leekelleher <leekelleher@gmail.com>
Moves the _data.updateCurrent() call inside the updateLayoutBlock conditional
in setMasterTemplate(). This prevents spurious change detection when loading
templates from the server, while maintaining proper change tracking when users
actually modify the master template via the UI.
This completes the fix started in PR #20529 which added the updateLayoutBlock
parameter but inadvertently left the data model update outside the conditional.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
* Added custom validation for missing password and user/email
* Changed some of the logic behind custom validation, so it now uses aria-errormessage
* fix: imports from src folder instead
* build(deps-dev): bump vite to 7.2.0
* formatting
* fix: moves the form into the login.page.element.ts component to better control submission
* fix: creates elements globally
* fix: adds id back to form
* fix: no need to store references to all form elements
* fix: errormessage should show with password field in a span as well
* fix: checks validity of form
* fix: constructs form in auth.element.ts anyway and append localization to validation and add oninput and onblur
* chore: fixes import paths
* fix: fixes special case where ?status was not reset
* fix: changes wording in english
* fix: removes duplicate en-us keys
* feat: adds ariaLive and role attributes
* fix: always clears the text
* fix: username required validation should switch between username and email
* package-lock.json updated on (re)install
* Renamed SVG eye icon filenames
to be conventional and kebab-cased.
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Co-authored-by: leekelleher <leekelleher@gmail.com>
Fix config value access in UmbSliderPropertyValuePreset
Updated the `UmbSliderPropertyValuePreset` class to ensure the `.value` property is accessed for configuration items. This change improves the accuracy of retrieving `enableRange`, `min`, `max`, and `step` values, addressing potential bugs in value processing.
Co-authored-by: Luuk Peters <Luuk.Peters@proudnerds.com>
* Add setter to allow handling of requests to subscribe to newsletter on install.
* Correct serialization of newsletter subscription request.
* Fix serialization and use the Umbraco.EmailMarketing service for newsletter signup.
* Remove logging of user when setting telemetry level.
* Applied suggestions from code review.
* Fix memory leak with IOptionsMonitor.OnChange and non-singleton registered components.
* Dispose disposable data editors in ValueEditorCache.
* Removed unnecessary refactoring and clarified code comments.
* fix: Tiptap Media Picker: Skip media picker modal when editing existing images
Fixes the media picker workflow to match v13 behavior where clicking
an existing image directly opens the alt text/caption editor instead
of forcing users to re-select the same image from the media library.
Also fixes caption text extraction to properly read from the figcaption
node using Tiptap's NodeSelection API instead of unreliable attribute-based
approach.
Changes:
- Skip media picker when currentMediaUdi exists (lines 77-92)
- Extract caption from NodeSelection.node using descendants() (lines 55-73)
- Add NodeSelection export to tiptap externals for proper typing
* Refactor: Extract nested logic from media picker execute method
Reduces cyclomatic complexity from 15 to 1 by extracting conditional
logic into focused private helper methods. Addresses CodeScene warnings
for complex method and nested conditionals (bumpy road smell).
Created helper methods:
- #extractMediaUdi, #extractCaption, #findFigcaptionText
- #getMediaGuid, #updateImageWithMetadata
No functional changes - improves maintainability and testability.
* Added skip tag for the failing tests due to the issues and added waits for the flaky tests
* Commentted code as the reference items displays randomly
* Bumped version
* Added more waits to avoid the flaky tests
* Updated tests for setting culture and hostnames since the first content already has the default domain
* Fixed flaky tests
* Updated tests since the reload step is flaky
* Added more waits for the flaky tests in Windows
* Need to publish first document before set domain for second document
* Make permission tests run in the pipeline
* Added step to ensure the rollback action is completed
* Reverted npm command
* Added skip tag for the permission tests
* Fixed test for the culture and hostname permission
* Removed waits as it is includes in test helper
* Fixed test for adding a media in RTE Tiptap property editor
* Updated test helper function to avoid the flaky tests releated to block
* Added more waits to ensure image uploaded
* Bumped version
* Bumped version
* Reverted
* Reverted code
* Bumped version of test helper
* Bumped version
* Reverted code
* Added more waits to avoid flaky tests
* Added more waits
* Updated nightly pipeline: remove v17/dev, run different app setting tests by default and not run Relation Type in Linux as they are too flaky
* Added more waits
* Added npm command for testWindows
* Added more waits after creating a folder
* Add MoveFile it IFileSystem and implement on file systems.
* Rename media file on move to recycle bin.
* Rename file on restore from recycle bin.
* Add configuration to enabled recycle bin media protection.
* Expose backoffice authentication as cookie for non-backoffice usage.
Protected requests for media in recycle bin.
* Display protected image when viewing image cropper in the backoffice media recycle bin.
* Code tidy and comments.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Introduced helper class to DRY up repeated code between image cropper and file upload notification handlers.
* Reverted client-side and management API updates.
* Moved update of path to media file in recycle bin with deleted suffix to the server.
* Separate integration tests for add and remove.
* Use interpolated strings.
* Renamed variable.
* Move EnableMediaRecycleBinProtection to ContentSettings.
* Tidied up comments.
* Added TODO for 18.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Make the RTE treat an "empty" value as a non-value
* Additional tests
* Add tests for invariant and variant content.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Localized RTE property-editor UI label, removing "[Tiptap]"
* Updated acceptance test
* Localized the button label in the data-type and property-editor picker modals
* Based on @copilot suggestion, localized the property-editor UI label in the other places
* Added mandatory property to number range property editor and bind it to the inner input.
* Added mandatory message support.
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* Added request cache to content and media lookups in mult URL picker.
* Allow property editors to cache referenced entities from block data.
* Update src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add obsoletions.
* Minor spellcheck
* Ensure request cache is available before relying on it.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: kjac <kja@umbraco.dk>
* Generate BOM files on build
* Upload BOM to Dependency Track
* Move Backoffice BOM generation to right after install
The build and/or pack steps are deleting files that are needed for the BOM to be generated properly.
* Split the BOM uploads into different jobs
* Fix wrong usage of parameters
* Move order of dependency track stage
* Fix wrong umbracoVersion value
* Small fixes
* Log curl response headers
* Correct version sent to dependency track
* Adjusted curl flags
* Fix bom file path
* Fix dotnet bom file name
* Add Login UI to dependency track
* Generate BOM for E2E Tests
* Move dependency track stage
* Move acceptance test .env generation to e2e install template
Needed as the post install script is expecting this to exist.
* Use major version if public release
* Missing ')'
* Reverted npm install command changes in static assets project
* enforce update of children when collection
* only load one above and below collection children
* take 50 above a target for default experience
* revert reset target
* remove old impl
* Generate BOM files on build
* Upload BOM to Dependency Track
* Move Backoffice BOM generation to right after install
The build and/or pack steps are deleting files that are needed for the BOM to be generated properly.
* Split the BOM uploads into different jobs
* Fix wrong usage of parameters
* Move order of dependency track stage
* Fix wrong umbracoVersion value
* Small fixes
* Log curl response headers
* Correct version sent to dependency track
* Adjusted curl flags
* Fix bom file path
* Fix dotnet bom file name
* Add Login UI to dependency track
* Generate BOM for E2E Tests
* Move dependency track stage
* Move acceptance test .env generation to e2e install template
Needed as the post install script is expecting this to exist.
* Use major version if public release
* Missing ')'
* Reverted npm install command changes in static assets project
* enforce update of children when collection
* only load one above and below collection children
* take 50 above a target for default experience
* revert reset target
* remove old impl
* Added request cache to content and media lookups in mult URL picker.
* Allow property editors to cache referenced entities from block data.
* Update src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add obsoletions.
* Minor spellcheck
* Ensure request cache is available before relying on it.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: kjac <kja@umbraco.dk>
Add 'not trashed' condition to document bulk actions
Introduces the UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS to various document-related bulk action manifests, ensuring actions like duplicate, move, publish, unpublish, and trash are only available for entities that are not already in the recycle bin.
* Better title for icon colors
* Add name for legacy colors
* Translations of colors
* Fixed import, adding missing colour, added Italian translations.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Implimented an inline toggle button to show/hide your password, also changed the css to accommodate these changes
* Cleaned the css
Added the svg's to their own const for easy reuse
Added localization for the arialabel on the button
Seperated the createFormLayoutItem so there is a seperate for the password input
Moved all the conditional logic in the onclick event to fit inside one if/else statement
* Removed old logic that added a 100ms timeout that would sometimes be enough for localization to load, and replaced it with a function.
The function will try and resolve the promise by checking if the localize.terms methods returns a changed value, if not then it retries every 50ms or untill it hits a max retry of 40/2 seconds.
* Re adding the hide for -ms-reveal to support Microsoft Edge browsers
* Removed a console.log
* Alligned the button behavior so it fits better with what we have in the uui libary.
Now the button is always visible instead of appearing on hover or when in focus
* Update src/Umbraco.Web.UI.Login/src/auth.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Login/src/auth.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @iOvergaard
* Apply suggestion from @iOvergaard
* Adding the requested changes via my own fork (#20664)
Changed the logic for waitForLocallization Added the svg's as files that are imported instead of having the raw svg in the code
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Added mandatory support to property-editor-ui-number.
* Added form control to property-editor-ui-tags
* Added validator to the slider when value is missing and support for mandatory and mandatory message.
* Removed unnecessary ternary.
* Removed white space lit error.
* Fix tags input to handle undefined items array
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
* change property value to an object
* add const for picker data source type
* Add value editor and converter server-side
* register schema for property editor + move settings ui
---------
Co-authored-by: kjac <kja@umbraco.dk>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
* Trees: Restore backward compatibility for file system based tree controllers (closes#20602) (#20608)
* Restore backward compatibility for file system based tree controllers.
* Aligned obsoletion messages.
* Reverts nullability update on ConvertNotificationToRequestPayload.
* Remove unused help controller
* Correct documentation links
* Link to the new release site for compares
* Remove unused translation key with reference to Our
* Update NoNodes / NotFound to point to the forum instead of Our
* Change dashboards form Our to Forum and de-emphasize Discord as a support channel
* Removes Help controller reference
* Forgot to rename the css Id
* Update src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix typo in Community Forum help menu item name
* Refer to releases instead of a download page
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Update the default dashboard with better content and clearer headings
* Obsolete the HelpController instead
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Add ID when updating background job
* Reduce default period to 5 seconds
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Preview Device: refactored config
Fixed "flip" icon style.
Removed "shadow" as unnecessary.
Renamed "className" to "wrapperClass" to be descriptive.
* Preview element CSS refinement
* Preview element: load in private extensions
* Added "Preview Environments" preview-app
Made `unique`, `culture` and `segment` observable in the context.
* Aligned preview-app design
with `hidden` attribute and design consistency.
* Created "Preview" package
* Relocated "Preview Apps" and Context to the new package
* Deprecated `UmbDocumentPreviewRepository` (for v19)
as the methods have moved to `UmbPreviewRepository`.
* Removed Preview Sessions event listeners
* Changed localization from "End" to "Exit"
* chore: consumes context only when needed
* feat: uses the UmbPreviewRepository instead
* feat: adds localization to errors and ensures the function does not randomly throw
* feat: prevents creating a new repository for every click
* feat: prevents potential memory leak by adding a signal to the events added to each iframe update
* feat: adds a custom interface to prevent typescript errors
* feat: ensures new string states are checked properly
* docs: adds comment to avoid confusion
* feat: sets up scaling once per iframe load rather than on each update
* fix: ensures that you can go back to the default segment again
* feat: closes popovers when clicking on the iframe (losing blur) and if selecting an item (expect for devices)
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Removes preview sessions concept
Fixes#19443 and #19471.
The implementation of exiting sessions was a design flawed.
The v13 feature worked due to an implementation bug.
Exiting preview mode should be a deliberate action by the user.
* Added check to only find .css files in FileSystemTreeServiceBase.cs
* Marking GetFiles as virtual and overriding it in StyleSheetTreeService.cs to only find .css files
* Redone tests to fit new format
* Fix tests to use file extensions
* Adding file extensions to all other relevant tests
* Adding file filter to remaining trees
* Adding tests to ensure invalid filetypes wont show
* Encapulation and resolved minor warnings in tests.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Use tryExecute for delete API call
Replaces direct await of #delete with tryExecute to improve error handling in the delete method of UmbManagementApiDetailDataRequestManager.
* utility
* ability to replace
* deprecate removeStatus
* no need to call this any longer
* Sort statuses and ensure not appending statuses, only updating them
* hotfix: ensures that local urls stay relative so we land up on the correct backoffice host that the user initiated the preview session from originally
* feat: since ensureAbsoluteUrl is never supplied anymore, we can remove the parameter altogether
* Remove unused dependency
* Expose IsExternal for URLs
* feat: adds localize controller
* chore: generates api models
* feat: marks the internal preview default url as relative, so that the `<base>` tag is taken into consideration - that way the URL will open on whatever host is active
* Remove IsExternal from the API again
* regenerate types
---------
Co-authored-by: kjac <kja@umbraco.dk>
* Add 'Trashed' state to document workspace view
Introduces a new 'Trashed' label and tag for documents in the workspace view. Updates localization to include the 'Trashed' term for improved clarity when displaying trashed documents.
* Show trashed state in media workspace info view
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* feat: replaces manual WebSocket with the actual SignalR library on the preview context
* feat: informs the developer what went wrong in preview mode
* feat: awaits the stop connection before proceeding
* feat: ensures no existing connection exists
* clean up
* localizations
* group user permission by entity type
* adjustments
* fix lint errors
* Support granular permissions without entity type
Updated granular permission handling to allow permissions that are not tied to a specific entity type. Adjusted rendering logic and manifest interface to support undefined or empty forEntityTypes, and added UI for displaying ungrouped granular permissions.
* revert for now
---------
Co-authored-by: Mads Rasmussen <madsr@hey.com>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* Reduce log level of image cropper converter to avoid flooding logs with expected exceptions.
* Don't run publish branch long running operation on a background thread such that UmbracoContext is available.
* Revert to background thread and use EnsureUmbracoContext to ensure we can get an IUmbracoContext in the URL providers.
* Updated tests.
* Applied suggestion from code review.
* Clarified comment.
Fixes SQL error to ensure database relation between user group media start folder and deleted media item is removed.
# Conflicts:
# src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs
* Tiptap toolbar config: enable removal of unregistered extensions
* Tiptap statusbar config: enable removal of unregistered extensions
* Tiptap toolbar config: Typescript tidy-up
* Tiptap toolbar sorting amend
Removed the need for the `tiptap-toolbar-alias` attribute,
we can reuse the `data-mark`.
* Tiptap extension config UI amend
If the extension doesn't have a `description`,
then add the `alias` to the title/tooltip, to give a DX hint.
* Tiptap toolbar: adds `title` to placeholder skeleton
* Added missing `forExtensions` for Style Select and Horizontal Rule toolbar extensions
* Update src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/property-editor-ui-tiptap-toolbar-configuration.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/property-editor-ui-tiptap-statusbar-configuration.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Be consistent in use of GetOrCreateAsync overload in exists and retrieval.
Ensure nullability of ContentCacheNode is consistent in exists and retrieval.
* Applied suggestion from code review.
* Move seeding to Umbraco application starting rather than started, ensuring an initial request is served.
* Tighten up hybrid cache exists check with locking around check and remove, and use of cancellation token.
(cherry picked from commit 81a8a0c191)
* Store local time zone as UTC and do not throw validation error when stored time zone is different
* Additional fixes when switching between date time editors with and without time zone
* Additional fixes
* Ensure that an update is triggered when the expected value does not match the stored value
This will happen when switching between editors (with and without time zone) or switching between a specific time zone to the editor's local time zone.
* Fix inconsistencies with null and undefined
* Fix inconsistencies between date/time provided to the client and returned in the value converter (when switching between editors)
* Fix unit tests and small bug
* Adjust integration test
* Small improvement
* Update test data
* Adjust logic so that time zone offsets are updated every time the date value changes
* Do not pre-select time zone when switching between unspecified and time zone editors
* register structure context for recycle bin
* Update manifests.ts
* export consts
* move href construction to context + override for document and media
* Preview Exit: Gets the page's published URL on exit for redirect
* Preview Open Website: Uses the page's published URL
* Tweaked the published URL logic
* Code amends based on @copilot's suggestions
(cherry picked from commit d5a2f0572e)
* make document and media readonly when trashed + reload the entity
* introduce restore event + remove readonly
* handle media audit log todos
* disable content type picker when trashed
* disable template picker when trashed
* Introduce configurable batch size for indexing
* Stop using Examine indexing events for reporting index rebuild operation completeness (it is volatile)
* Block List: adds `$index` support for UFM labels
* Block Grid: adds `$index` support for UFM labels
* Block RTE: adds `$index` support for UFM labels
Which is always zero `0`.
But has been wired up if we do implement the index order in future.
* Updated tests
* E2E: Updated acceptance tests to match changes (#20493)
* Updated tests to match changes
* More updates
* Bumped version
* Reverted change
* feat: adds first draft of a context consume decorator
* feat: uses an options pattern
* feat: changes approach to use `addInitializer` and `queueMicroTask` instead
* feat: adds extra warning if context is consumed on disconnected controllers
* feat: example implementation of consume decorator
* feat: adds support for 'subscribe'
* feat: initial work on provide decorator
* docs: adds license to consume decorator
* feat: adds support for umbraco controllers with `hostConnected`
* feat: uses asPromise to handle one-time subscription instead
* test: adds unit tests for consume decorator
* feat: adds support for controllers through hostConnected injection
* feat: adds support for controllers through hostConnected injection
* test: adds unit tests for provide decorator
* docs: adds more documentation around usage and adds a few warnings in console when it detects wrong usage
* feat: removes unused controllerMap
* docs: adds wording on standard vs legacy decorators
* docs: clarifies usage around internal state
* feat: adds proper return types for decorators
* docs: adds more types
* feat: makes element optional
* feat: makes element optional
* feat: uses @consume in the log viewer to showcase
* chore: cleans up debug info
* feat: renames to `consumeContext` and `provideContext` to stay inline with our own methods
* chore: removes unneeded typings
* chore: removes not needed check
* chore: removes not needed check
* test: adds test for rendered value
* feat: splits up code into several smaller functions
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* docs: augments code example for creating a context
* Update src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/views/search/components/log-viewer-search-input.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Made card element it is own reusable component and passing the data as property.
* Created the umb-news-container element to handle all the priority grouping.
* Added hover styles to normal-priority cards.
* Removed unused variable.
* add pickable to vs code dictionary
* set up types for pickable filters in data sources
* pass search pickable filter to search result
* apply filter config in document data source example
* add pickable filters to custom tree example
* Update input-entity-data.context.ts
* remove unused
* Update types.ts
* Added request caching to media picker media retrieval, to improve performance in save operations.
* WIP: Update or insert in bulk when updating property data.
* Add tests verifying UpdateBatch.
* Fixed issue with UpdateBatch and SQL Server.
* Removed stopwatch.
* Fix test on SQLite (failing on SQLServer).
* Added temporary test for direct call to NPoco UpdateBatch.
* Fixed test on SQLServer.
* Add integration test verifying the same property data is persisted as before the performance refactor.
* Log expected warning in DocumentUrlService as debug.
(cherry picked from commit 12adfd52bd)
* Remove Microsoft.CodeAnalysis.CSharp from Infrastructure project
This was only needed for runtime compilation and thus is no longer needed in Infrastructure.
It also caused dependency problems with EF Core Design in previous versions.
* Disable CPM for UI project to better reflect consumers
This will ensure that we face any potential dependency issues consumers are also likely to run into.
* Add `Microsoft.CodeAnalysis.CSharp` reference to `Umbraco.Cms.DevelopmentMode.Backoffice`
* Remove Microsoft.CodeAnalysis.CSharp from Infrastructure project
This was only needed for runtime compilation and thus is no longer needed in Infrastructure.
It also caused dependency problems with EF Core Design in previous versions.
* Disable CPM for UI project to better reflect consumers
This will ensure that we face any potential dependency issues consumers are also likely to run into.
* Add `Microsoft.CodeAnalysis.CSharp` reference to `Umbraco.Cms.DevelopmentMode.Backoffice`
Add conditional registration for Entity Data Picker
Introduces an entry point for the Entity Data Picker property editor that registers its manifests only if picker data sources are present, preventing an unusable UI from appearing by default.
* Adding controller
* Lower case route to match other endpoints
* Adding service and typed output
* Renaming to NewsDashboard
* Moving more stuff to service
* Removing unused code
* Some refactoring in accordance with better architecture
* Created repository and mock data source for the news dashboard also display some data in the UI.
* Minor refactoring: naming, aligning with existing controller patterns.
* Update OpenApi.json.
* Update typed client sdk and types.
* Provide language to API endpoint, just in case we want to localize news in the future.
* Obsoleted configuration
* Moved mock data to mocks folder and updated repository to use the actual response model and service from the Api
* Prepared news repository with server data source.
* Rendered news items according to required group structure.
Added TODOs for remaining tasks.
* Fixed FE build issues.
* Update src/Umbraco.Core/Constants-Configuration.cs
* Fixed grid spacing, sanitize code and make the styles closer to the v13.
* Added container query and padding to the card body.
* Fix padding
* Fixed title according to priority.
* Relocated/renamed the news server data-source file
* Simplified the news repo/data-source classes
by extending `UmbControllerBase`, the host constructor is handled for us.
* Added `types.ts` export type files
* Refactored interface name + typing
* Added `uui-loader` component
* Tweaked styles, added box-shadow to cards
Added flexbox gap to the card body.
* Sorted import order
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: engjlr <enl@umbraco.dk>
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Adding controller
* Lower case route to match other endpoints
* Adding service and typed output
* Renaming to NewsDashboard
* Moving more stuff to service
* Removing unused code
* Some refactoring in accordance with better architecture
* Created repository and mock data source for the news dashboard also display some data in the UI.
* Minor refactoring: naming, aligning with existing controller patterns.
* Update OpenApi.json.
* Update typed client sdk and types.
* Provide language to API endpoint, just in case we want to localize news in the future.
* Obsoleted configuration
* Moved mock data to mocks folder and updated repository to use the actual response model and service from the Api
* Prepared news repository with server data source.
* Rendered news items according to required group structure.
Added TODOs for remaining tasks.
* Fixed FE build issues.
* Update src/Umbraco.Core/Constants-Configuration.cs
* Fixed grid spacing, sanitize code and make the styles closer to the v13.
* Added container query and padding to the card body.
* Fix padding
* Fixed title according to priority.
* Relocated/renamed the news server data-source file
* Simplified the news repo/data-source classes
by extending `UmbControllerBase`, the host constructor is handled for us.
* Added `types.ts` export type files
* Refactored interface name + typing
* Added `uui-loader` component
* Tweaked styles, added box-shadow to cards
Added flexbox gap to the card body.
* Sorted import order
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: engjlr <enl@umbraco.dk>
Co-authored-by: leekelleher <leekelleher@gmail.com>
* Add property editor data source extension types
Introduces types and extension interfaces for property editor data sources, including manifest and API definitions. Updates the main property-editor types export to include the new data source types.
* add test data sources
* wip collection and item repos
* export consts
* fix picker modal token
* make global components file
* render picker in data type
* wire up repositories
* append editor data source alias to data type detail model
* fix global manifest declaration
* make optional
* fix types
* register collection item picker modal element + wip collection menu extension
* register collection menu for property editor data source
* wire up modal tokens
* fix circular
* register as global element
* register default kind for collection menu
* wip fleshing out collection menu
* pass props + listen for selection events
* fix imports
* accept icon in manifest
* extend base type
* use correct data to calculate length
* export types
* add load more button
* wire up load more
* remove debugger
* add search for property editor data sources
* only select one data source
* rename file
* add entity type
* add manifest for search result item
* fix imports/exports
* fix manifest imports
* wire up data source value with workspace
* remove debugger
* wip property editor + input
* move data-source files
* more specific extension types
* remove copy from file name
* allow settings in manifests
* export types
* merge settings
* fix ui alias
* remerge if data source is removed
* Update data-type-details-workspace-view.element.ts
* reset data
* Update data-type-workspace.context.ts
* update merging + move mapping to data source
* Fix mutation of data.values in data type detail mapping
Refactored #mapServerResponseModelToEntityDetailModel to avoid mutating the original data.values array when removing the editorDataSourceAlias. This ensures the original server response remains unchanged and improves data integrity.
* add forDataSourceTypes to manifest
* update interfaces
* test data source implementations
* only show data source select if property editor supports it
* remove custom context
* remove unused token
* use generic collection item picker modal
* remove custom modal
* export types
* render data source alias on data type into view
* pass data source alias
* allow data source alias
* allow data source alias
* pass data source alias
* add prop for data source alias
* Add property editor data source alias support
* Add editor data source alias to property context
Introduces support for storing and retrieving the editor data source alias in UmbPropertyContext. Updates UmbPropertyElement to use the context for managing the data source alias and ensures the alias is set on the property editor element.
* pass data source alias to input
* pass data source alias to context
* update js docs
* split types from token file
* fix import
* update error message
* add more test sources
* Refactor repository manager initialization logic
Changed the initialization flow in UmbRepositoryItemsManager to support optional repository alias and deferred repository setup. Added setItemRepository and getItemRepository methods for explicit repository management, and moved repository initialization logic to a dedicated private method.
* remove support for passing a filter
* wip wire up input with modal
* add constant
* test user data source
* add todo
* require entityType on webhook items
* add entityType
* use id as unique
* add default icon
* wire up search
* add search to media
* pass config
* support configuration in data sources + temp test cases
* remove temp text
* change to one generic extension type with a data type sub type
* search in label
* pass filter args to collection item picker
* clean up
* aligning interfaces
* iterate status instead of item
* simplify examples
* add types for config
* move to examples
* add custom data examples for collection and tree
* update imports
* add manifests for collection and tree custom data examples
* add type guards
* add type guards
* Update types.ts
* add return type
* remove debuggers
* make observables optional
* add null checks for observables
* use statuses
* extend picker input context
* map config
* use data to set value when there is no observable
* store as string array
* Add getDefaultApiConstructor to tree item element
* make it optional
* fix search types
* add fallback icon and name
* remove unused imports
* pass stored value to input
* rename file
* remove unused config value
* make api observable
* add search to custom collection example
* render fallback item
* fix import order
* add fallback render to tree item element
* Update tree-item.element.ts
* Revert "Update tree-item.element.ts"
This reverts commit 3458877de9.
* Revert "add fallback render to tree item element"
This reverts commit b30219d3ed.
* move from data type to property editor
* align file names
* introduce picker-property-editor module
* remove custom types
* use basic types
* use tree item type
* Update input-entity-data.context.ts
* update types
* add interface for item model
* force unique on collection item model
* require an item model in picker context
* allow icon to be null
* extend item model from user group item model
* add entity type to mapped data
* Update user-group-item.server.data-source.ts
* align static file models
* correct types for user picker
* extend item model
* fix types
* more type fixing
* align models
* align models
* fix types
* add utils for fallback name and icon
* add todo
* use fallback name and icon functions
* Update default-picker-search-result-item.element.ts
* add fallback tree item if none is registered
* add search to example
* extract data source config and pass to api
* align naming
* temp type cast
* move search module into core
* fix illegal imports
* add missing const exports
* make property-editor-data-source module
* register property editor data source ref item + render description
* remove console log
* remove indention
* simplify data source type
* Update src/Umbraco.Web.UI.Client/src/packages/property-editors/entity-data-picker/input/input-entity-data.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/core/property-editor-data-source/input/input-property-editor-data-source.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/core/collection/menu/default/default-collection-menu.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* add todo
* hide add button when readonly
* check correct amount config
* Update input-entity-data.element.ts
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Adjust the `JsonBlockValueConverter` to handle conflicts with 'values' property (due to old data schema)
* Simplify code
* Add unit test to verify change.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* V16: Cache Version Mechanism (#19747)
* Add RepositoryCacheVersion table
* Add repository
* Add Cache version lock
* Add GetAll method to repository
* Add RepositoryCacheVersionService
* Remember to add lock in data creator
* Work my way out of constructor hell
This is why we use DI folks. 🤦
* Add checks to specific cache policies
* Fix migration
* Add to schema creator
* Fix database access
* Initialize the cache version on in memory miss
* Make cache version service internal
* Add tests
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Add missing obsoletions
* Prefer full name
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* fixed merge
* V16/feature/move last synced id to db (#19884)
* Foundation work for moving last synced id
* register manager and repo in dependency injection
* Fixing to make tests work
* Replacing the use of the old LastSyncedFileManager.cs with the new LastSyncedManager.cs
* Testing to delete out of sync id and old entries
* changing some stuff to please the reviewer.
* Inverted saving methods id check and fixed documentation mishaps
* Loadbalancing: Add Cache Sync service to allow us to roll forward isolated caches when backoffice is load balanced. (#20398)
* Split cache refreshers into internal and external caches
* Add obsolete constructor for CacheInstructionsPruningJob
* Add xml docs
* Move lastID management into CacheInstructionService
* Cache last synced ids in memory
* Lock when processing instructions
* Sync caches when out of sync
* Fix constructors for ICacheSyncService
* Cache version on request
* Register caches as synced when instructions are processed
* Rename CacheVersionAccessor to IRepositoryCacheVersionAccessor
* Set caches as synced before actually syncing the caches
* Set caches as synced before syncing, within scope, this should also lock the cache version from being written to whilst updating caches
* Only check version for backoffice requests
* Clear request cache when caches are syned
* Default to using NOOP cache version service
* Don't generate local identity in database server messenger anymore
* Fix ambiguous constructor
* Add helper method to switch to load balanced isolated caches
* Fix LastSyncedManagerTests
* Fix RepositoryCacheVersionServiceTests
* Fix DefaultCachePolicyTests
* Use correct constructor in FullDataSetRepositoryCachePolicy
* Minor cleanup
* Add XML docs
* Add more xml docs
* Apply suggestions from code review
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
---------
Co-authored-by: Zeegaan <skrivdetud@gmail.com>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Fix migration plan
* fix tests
* Fix integration tests
* Fix changes from github review
* Move premigrations to v17
* Make lock constantws sequential
* Fix comment
* Make IRepositoryCacheVersionService and ICacheSyncService protected on EntityRepositoryBase
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Nicklas Kramer <nik@umbraco.dk>
Co-authored-by: NillasKA <kramernicklas@gmail.com>
Co-authored-by: Zeegaan <skrivdetud@gmail.com>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* remove use of modals in collections
* add parent path to support absolute path generation
* add note
* make tree load more minimalistic
* set type and expand inherited styles
* also set title
* Update src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* create actions should not open as modal
* remove unused import
* fix router getActivePath
* make expand open the collection
* setTargetTakeSize to low when Collection parent
* expose typeUnique
* fix opening collection
* remove log
* active manager
* export
* impl active manager
* prepare for search param redirects
* fixed collapse feature
* set routes to undefined
* preserveQuery
* ensureSlash
* make a hard redirect for collections
* only if anscenstors are present in data.
* not full match anyway
* only forceShow on hasCollection
* remove umb-section-sidebar-context-menu
* rename to isMenu
* Update src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Serverside generated preview URLs
* Add URL provider notation to UrlInfo
* Change preview URL generation to happen at preview time based on provider alias
* Update XML docs
* Always add culture (if available) to preview URL
* Do not log user input (security vulnerability)
* Fix typo
* Re-generate TypeScript client
from Management API
* Deprecated `UmbDocumentPreviewRepository.enter()` (for v19)
Fixed TS errors
Added temp stub for `getPreviewUrl`
* Adds `previewOption` extension-type
* Adds "default" `previewOption` kind
* Relocated "Save and Preview" workspace action
reworked using the "default" `previewOption` kind.
* Added stub for "urlProvider" `previewOption` kind
* Renamed "workspace-action-default-kind.element.ts"
to a more suitable filename.
Exported element so can be reused in other packages,
e.g. documents, for the new "save and preview" feature.
* Refactored "Save and Preview" button
to work with first action's manifest/API.
* Reverted `previewOption` extension-type
Re-engineered to make a "urlProvider" kind for `workspaceActionMenuItem`.
This is to simplify the extension point and surrounding logic.
* Modified `saveAndPreview` Document Workspace Context
to accept a URL Provider Alias.
* Refactored "Save and Preview" button
to extend `UmbWorkspaceActionElement`.
This did mean exposing certain methods/properties to be overridable.
* Used `umbPeekError` to surface any errors to the user
* Renamed `urlProvider` kind to `previewOption`
* Relocated `urlProviderAlias` inside the `meta` property
* also throw an error
* Added missing `await`
* Fix build errors after forward merge
---------
Co-authored-by: leekelleher <leekelleher@gmail.com>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
* Start work
* Introduce dto
* Start making repository
* Add migrations
* Implement fetchable first job
* Fix up to also finish tasks
* Refactor jobs to distributed background jobs
* Filter jobs correctly on LastRun
* Hardcode delay
* Add settings to configure delay and period
* Fix formatting
* Add default data
* Add update on startup, which will update periods on startup
* Refactor service to return job directly
* Update src/Umbraco.Infrastructure/Services/Implement/DistributedJobService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Infrastructure/BackgroundJobs/DistributedBackgroundJobHostedService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/Umbraco.Infrastructure/BackgroundJobs/DistributedBackgroundJobHostedService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove unused
* Move jobs and make internal
* make OpenIddictCleanupJob.cs public, as it is used elsewhere
* Minor docstring changes
* Update src/Umbraco.Core/Persistence/Constants-Locks.cs
Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
* ´Throw correct exceptions
* Update xml doc
* Remove business logic from repository
* Remove more business logic from repository into service
* Remove adding jobs from migration
* fix creation
* Rename to ExecuteAsync
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: mole <nikolajlauridsen@protonmail.ch>
* Member type container in management API
* Fix naming
* Update service
* Fix services
* Register IMemberTypeContainerService in DI container
Added a new service registration for `IMemberTypeContainerService`
in the `AddCoreServices` method of `UmbracoBuilder.cs`.
* Replace auditRepository with auditService in constructor
* Add MemberTypeContainer to UdiEntityType mapping
---------
Co-authored-by: georgebid <91198628+georgebid@users.noreply.github.com>
Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
Remove `umb-media-picker-create-item` component
it was not being used internally.
There was previously an issue due to a routing issue,
(in that the Media Picker modal wasn't routed),
so the Media create workspace wouldn't work.
This could be resolved in future and see this feature return.
* add interface for item data resolver
* export interface
* add interface to Document item data resolver implementation
* allow to pass a item data resolver to trash action
* pipe resolver to modal
* pass resolver to document trash manifest
* use resolver in modal when available
* Bump Azure.Identity from 1.13.2 to 1.16.0
* Bump BenchmarkDotNet from 0.14.0 to 0.15.4
* Bump Bogus from 35.6.3 to 35.6.4
* Bump HtmlAgilityPack from 1.12.1 to 1.12.4
* Bump MailKit from 4.11.0 to 4.14.0
* Bump MessagePack from 3.1.3 to 3.1.4
* Bump Microsoft.AspNetCore.Mvc.Testing from 9.0.4 to 9.0.9
* Bump Microsoft.Data.SqlClient from 6.0.1 to 6.1.1
* Bump Microsoft.Extensions.Caching.Hybrid from 9.8.0 to 9.9.0
* Bump Microsoft.Extensions.Logging.Debug from 9.0.4 to 9.0.9
* Bump Microsoft.NET.Test.Sdk from 17.13.0 to 18.0.0
* Bump ncrontab from 3.3.3 to 3.4.0
* Bump Nerdbank.GitVersioning from 3.7.115 to 3.8.118
* Bump OpenIddict packages from 6.2.1 to 7.1.0
* Bump Serilog from 4.2.0 to 4.3.0
* Bump Serilog.Sinks.File from 6.0.0 to 7.0.0
* Bump Swashbuckle.AspNetCore from 8.1.1 to 9.0.6
* Bump System.Data.Odbc from 9.0.4 to 9.0.9
* Bump System.Data.OleDb from 9.0.4 to 9.0.9
* Bump Microsoft.IdentityModel.JsonWebTokens from 8.8.0 to 8.14.0
* Bump SixLabors.ImageSharp.Web from 3.1.5 to 3.2.0
- Implicit global usings were made opt-in (https://github.com/SixLabors/ImageSharp.Web/pull/391)
* Bump NJsonSchema from 11.0.2 to 11.5.1
* Bump Microsoft packages from 10.0.0-preview.7.25380.108 to 10.0.0-rc.1.25451.107
* Remove Azure.Identity package reference as implicitly referenced versions are no longer vulnerable
* Remove System.Runtime.Caching package reference as it is not used
* Remove System.Net.Http package reference as it is not used
* Set 'allowPrerelease' to true
Global.json was showing as invalid due to a pre-release version being referenced while 'allowPrerelease' was set to 'false'. This can be set to 'false' again later on.
* Remove System.Security.Cryptography.Xml package reference as implicitly referenced versions are no longer vulnerable
* Remove System.Text.RegularExpressions package reference as implicitly referenced versions are no longer vulnerable
* Remove Microsoft.IdentityModel.JsonWebTokens package reference as implicitly referenced versions are no longer vulnerable
* Remove System.Text.Encodings.Web package reference as it is not used
* Remove Microsoft.Data.SqlClient package reference as implicitly referenced versions are no longer vulnerable
* Remove Lucene.Net.Replicator package reference as implicitly referenced versions are no longer vulnerable
* Remove Microsoft.Extensions.Caching.Memory package reference where not used
* Add EFCore migration for OpenIddict v7 update
* Apply suggestion from @kjac
Cosmetic update: Removed blank line as suggested by Copilot
---------
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
* feat: adds new repository for document by id segment options
* chore: mocks up the new endpoint
* feat: all 'null' segments should appear on all languages
* feat: uses new endpoint in content detail workspace base
* feat: maps up the name of the segment
* chore: mock segment data
* feat: adds filter on available segments
* feat: do not alter behavior depending on "undefined" and "null"
* chore: updates mock handler
* feat: ensures that the segments are loaded based on an override method (because they only work for documents) and that they use a generic type (to avoid circular imports)
* feat: refines the segment filter
* chore: updates deprecated model
* feat: treats all culture-less segments as applying to everything
* docs: updates console warn for developers
* initial notes
* flat mapper impl
* first tests passed
* return incoming value to ensure it does not result in an error from an extension
* define the manifest type on UmbPropertyValueResolver
* finish property value flat-mapper
* make sure also to map values with no extension
* clean up test
* export controller
* fix block editor property resolver
* fix mapper types
* ensureVariantsData method
* ensure Block List only updates if it has an update
* ensure varians across for shared across segment and shared across cultures
* fix variant selector hints for segments
* fix hints in variant selector for segmented variants
* Upgrade to Tiptap v3
* Uses `@ts-expect-error` to ignore the TS complication errors
These can be removed once Tiptap has resolved the TypeScript definitions.
* Off-topic: corrected `flags` property in the mock data
Added in PR #19915
* Update src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/link.tiptap-extension.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* Webhooks: Removal of client-side deprecations for v17
* User: Removal of client-side deprecations for v17
* UFM: Removal of client-side deprecations for v17
* Tiptap: Removal of client-side deprecations for v17
* Templating: Removal of client-side deprecations for v17
* RTE: Removal of client-side deprecations for v17
* Relations: Removal of client-side deprecations for v17
* Search: Removal of client-side deprecations for v17
* Property Editors: Removal of client-side deprecations for v17
* URL Picker: Removal of client-side deprecations for v17
* Members: Removal of client-side deprecations for v17
* Media: Removal of client-side deprecations for v17
* Extension Insights: Removal of client-side deprecations for v17
* Documents: Removal of client-side deprecations for v17
* Media: Removal of client-side deprecations for v17
(part 2)
* Data Types: Removal of client-side deprecations for v17
* Core: Removal of client-side deprecations for v17
* Content: Removal of client-side deprecations for v17
* Clipboard: Removal of client-side deprecations for v17
* Blocks: Removal of client-side deprecations for v17
* Mocks: Removal of client-side deprecations for v17
* Libs: Removal of client-side deprecations for v17
* Apps: Removal of client-side deprecations for v17
* DevOps: Removal of client-side deprecations for v17
* Document Publishing Workspace: Removal of client-side deprecations for v17
Refactored to use `UmbDocumentPublishingWorkspaceContext`
* Reverted/modified some of my TODO comments
* Updated TODO comment
* Code cleanup sweep of TODO comments and tweaks
* Updated OpenApi.json, re-gen TS client
Tried to fix up mock data.
* Refactored the document variant name/fields
* Implemented co-pilot suggestions
---------
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
* Started the implementation of the new date time property editor
* Display picked time in local and UTC
* Adjustments to the way the timezones are displayed and the picker is configured
* Filter out `Etc/` (offset) timezones from the list
* Additional adjustments
* Introduced date format and time zone options (all, local or custom)
* Adjustments to the property editor configuration and value converter
* Use UUICombobox instead of UUISelect for displaying time zone options. Display UTC offset instead of short offset name in label.
* Allow searching by offset
* Ignore case when searching for time zone
* Store dates consistently (always same format)
* Add custom PropertyIndexValueFactory for the new property editor
* Adjustments when switching between time zone modes
* Small fixes and cleanup
* Started improving time zone config selection
* Small adjustments
* Remove selected time zones from the list + display label instead of value
* Localizing labels
* Remove unwanted character
* Fix incorrect order of custom time zones list
* Small fixes (mostly validation)
* Rename input time zone component
* Small adjustments
* Using model for stored value
* Save examine value as ISO format
* Adjusting class names for consistency
* Small fixes
* Add default data type configuration
* Rename `TimeZone` to `UmbTimeZone`
* Fix failing tests
* Started adding unit tests for DateWithTimeZonePropertyEditor
* Additional tests
* Additional tests
* Additional tests
* Fixed searches with regex special characters throwing errors
* Remove offset from generic UmbTimeZone type and added new type specific for the property editor
* Adjust property editor to show error when selected time zone is no longer available, instead of pre-selecting another one
* Do not preselect a time zone if a date is stored without time zone
This most likely means that the configuration of the editor changed to add time zone support. In this case we want to force the editor to select the applicable time zone.
* Fix failing backoffice build
* Added tests for DateTimeWithTimeZonePropertyIndexValueFactory
* Improved picker validation
* Remove unused code
* Move models to their corresponding places
* Renaming `DateTimeWithTimeZone` to `DateTime2`
* Fix data type count tests
* Simplifying code + adjusting value converter to support old picker value
* Adjustments to property editor unit tests
* Fix validation issue
* Fix default configuration for 'Date Time (Unspecified)'
* Rename validator
* Fix comment
* Adjust database creator default DateTime2 data types
* Update tests after adjusting default data types
* Add integration test for DateTime2 returned value type
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Aligning DateTime2Validator with other JSON validators. Added new model for API.
* Removed unused code and updated tests
* Fix validation error message
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Splitting the new date time editor into multiple (per output type)
* Adjust tests in DateTime2PropertyIndexValueFactoryTest
* Update value converter tests
* Group the new date time tests
* Adjust new property editor tests
* Adjust property editor integration tests
* Update data editor count tests
* Naming adjustments
* Small fixes
* Cleanup
- Remove unused files
- Remove 'None' option from configuration and update all the tests
* Update luxon depedencies
* Move GetValueFromSource to the value converter
* Add new property editor examples to mock data
* Re-organizing the code
* Adjustments from code review
* Place the date time property index value factories in their own files
* Small adjustments for code consistency
* Small adjustments
* Minor adjustment
* Small fix from copilot review
* Completed the set of XML header comments.
* use already existing query property
* fail is form control element is null or undefined
* using lit ref for querying and form control registration
* state for timeZonePickerValue and remove _disableAddButton
* Adjustments to form control registration
* Remove unused declaration
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
* Added the ability to set the telemetry level for an unattended install
Added 'UnattendedTelemetryLevel' to 'UnattendedSettings'
Renamed 'CreateUnattendedUserNotificationHandler' to 'PostUnattendedInstallNotificationHandler'
Set the telemetry level in the unattended install notification handler
* Add DefaultValue attribute to 'UnattendedTelemetryLevel'
* Added UnattendedTelemetryLevel to template.
* Updated cli and ide hosts.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Update Readme to signpost the Forum (#20268)
Update README.md with information about the forum
Making a small change to the Readme to signpost the Forum now that it's the place to go for help/questions
* Adding SourceWidth and SourceHeight to ImageUrlGenerationOptions
* Update src/Umbraco.Web.Common/Extensions/FriendlyImageCropperTemplateExtensions.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* QA Skip the known failing smoke test to avoid blocking other PRs (#20269)
Added skip for the failing smoke test
---------
Co-authored-by: Owain Williams <owaingdwilliams@gmail.com>
Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com>
* It worked before i must have broken it somehow. Commit as checkpoint
* Adding a reference from Web.UI.csproj to TestData to allow composers to be composed
* Changing readme and removing project reference
* Adjusted the UTC SQL Server migration to convert time zone ids to the correct format
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Small rename
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* align naming
* mute updates
* lower threshold
* add expansion model with target
* add function to link entries
* fix self import
* export constants
* update js docs for entity expansion manager
* link entries
* fix import
* do not export from menu here
* fix import
* fix import
* align how we register manifests
* add specific managers for section sidebar menu
* use structure items
* dot not expand current item
* Refactor section sidebar menu to use programmatic extension slot
Replaces the template-based <umb-extension-slot> with a programmatically created UmbExtensionSlotElement for improved performance and UX.
* add section context extension
* register menu as section context instead of hardcoding
* rename folder
* align naming
* export extension slot elements
* fix typings
* destroy extension slot element when host is disconnected
* Added user start node restrictions to sibling endpoints.
* use entry model
* move and rename
* register global context to hold menu state across sections
* temp observe section specific expansions
* temp observe section specific expansions
* add method to collapse multiple items
* Further integration tests.
* Tidy up.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* bind expansion to section
* make entity expansion manager generic
* Revert previous update.
* add helper method
* remove temp test data
* Retrieves item counts before and after the target for sibling endpoints and returns in API response.
* Applied previous update correctly.
* Removed blank line.
* Fix build and test asserts following merge.
* add getItem method
* Update OpenApi.json.
* generate new server types
* include last item in target
* add target pagination type
* return totalBefore and totalAfter
* call siblings endpoint for documents
* add method to load children with target
* rename to item
* wip target pagination manager
* add button to load prev tree items
* render prev and nexts buttons for tree items
* Update tree-load-prev-button.element.ts
* add util to append to unique array
* add state method to prepend data
* implement methods to load next and prev items
* add methods to interface
* Update tree-item-element-base.ts
* Update tree-item-context-base.ts
* remove unused
* align methods
* update types
* add jsdocs
* add deprecation notice
* fix jsdocs
* fix import
* Update tree-data-source.interface.ts
* remove duplicate type
* clean up
* fix page calculations
* remove unused
* clean up
* pass full entry to event
* add type for menu item expansion
* export types
* add menuItem alias
* Update types.ts
* support menu item expansion entry
* add const for menu item alias + use for breadcrumb and menu item
* add data type menu item alias const + apply to breadcrumb
* move to correct manifest
* add menu item alias to expand entries
* Update manifests.ts
* add menu structure kind types
* add kind to manifests
* add menu item context
* filter menu items
* handle menu item expansion
* clean up
* fix order
* add example dashboard and entity action
* import types
* align model type names
* align naming
* use ui component
* add guard for menu item entry
* use correct type
* Update section-sidebar-menu.element.ts
* Update entity-expansion.manager.ts
* export constants
* add menuItemAlias to manifest
* add menuItemAlias to manifest
* add menuItemAlias to manifest
* add menuItemAlias to manifest
* add menu item alias
* add menuItemAlias to manifest
* add menuItemAlias to manifest
* add menuItemAlias to manifest
* add alias
* add kind
* fix import path
* do not expand menu from modal
* collect all menu-item files in one folder
* fix lint errors
* Update content-detail-workspace-base.ts
* clean up
* rename to example
* add button to collapse everything within a section
* return correct data from base
* recalculate after
* fix breadcrumb for non-variant structure
* reload entity
* destroy
* remove self
* Updated acceptance tests to check if a caret button is open before clicking
* Bumped version of test helpers
* use const
* add target paging for tree root items
* more specific field names
* update field name
* add model for offset pagination
* add request to model name
* correct
* using Event Contsants for event map
* comment
* clean event listeners before adding new ones
* use createObservablePart
* add paging type guards
* add types
* add check for unique
* add comment
* pass data type id
* wip reload tree logic
* move start + end target logic to target pagination manager
* use target pagination manager in tree item context
* remove local references to start, end and base targets
* calculate before and after when reloading
* clean up
* support children in tree item context
* add methods to observe an expansion entry
* reload structure when item is created
* UX adjustments
* add controller alias to observer
* Update default-tree.context.ts
* Update default-tree.context.ts
* Update default-tree.context.ts
* test targets in document type tree data source
* when reloading only send the target if its part of the current items
* wip tree request manager
* make data source base a controller
* add tree request helper for document types
* use request helper in data source
* clear more data when clear is called
* when reopening a tree item - reuse previous state
* add tree item children manager
* split to manager
* clean up
* only return an entity model when getting target
* allow entity model as target
* add null checks
* add method for getSiblingsFrom
* implement target for tree data request manager
* Update default-tree.context.ts
* set parent for tree root
* reload if target is new
* add types for tree data request manager
* implement request manager for document tree
* use request manager for media tree
* add request manager for data type tree
* move into folder
* move into folder
* move into folder
* add target support for document blueprint
* add request manager for template tree
* add request manager for media type tree
* add hasChildren flag for root
* make start node its own thing
* move hasChildren logic to children manager
* Create tree-item-expansion.manager.ts
* use expansion manager
* align tree item managers
* Update tree-item-context-base.ts
* support take 0
* add methods to get new targets
* add retries
* add button loading states
* fix next start and end
* reset baset target
* use clear when restting children
* throw error if parent doesn't match request
* show notifcation when children is reset
* only render menu context for non trashed document and media items
* use correct import
* fix types
* update interfaces and imports to fix circular dependencies
* move into tree-item folder
* rename file
* Update tree-item-context-base.ts
* move token out of context file to remove circular dependency
* set take size to 50
* remove unused
* export const
* correct default value
* check on both sides after a new base target
* `import type` sort ordering
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Andreas Zerbst <andr317c@live.dk>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
Co-authored-by: Niels Lyngsø <niels.lyngso@gmail.com>
Co-authored-by: leekelleher <leekelleher@gmail.com>
* fix sql syntax issues
* unify all dtos, fix autoIncrement for NPoco.Insert and .BulkInsert
* fix Copilot review comments
* fix sql syntax in TrackedReferencesRepository.GetPagedDescendantsInReferences()
* remove changes in TemplateServiceTests
* Tweaks and fixes from first review.
* Reverted changes outside scope of PR.
* Use FirstOrDefault over SelectTop.
* Fix delete member issue.
* Fixed issue with create of webhooks.
* Reverted changes to default data install.
* Removed unused method.
* Rationalised use of quoting helpers.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix nullability issue.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* First Go at the single block property editor based on blocklistpropertyeditor
* Add simalar tests to the blocklist editor
Also check whether either block of configured blocks can be picked and used from a data perspective
* WIP singleblock Valiation tests
* Finished first full pass off SingleBlock validation testing
* Typos, Future test function
* Restore accidently removed file
* Introduce propertyValueConverter
* Comment updates
* Add singleBlock renderer
* Textual improvements
Comment improvements, remove licensing in file
* Update DataEditorCount by 1 as we introduced a new one
* Align test naming
* Add ignored singleblock default renderer
* Enable SingleBlock Property Indexing
* Enable Partial value merging
* Fix indentation
---------
Co-authored-by: kjac <kja@umbraco.dk>
* fix: moves current user config repository and related dependencies to the 'current-user' package
previously, it was not exported, so is not a breaking change
* chore: moves current-user-allow-mfa condition to the 'current-user' package to avoid circular dependencies (and because it naturally belongs there)
* feat: exports all current-user config-related items
* chore: move to 'current-user'
* chore: make sure to export all constants
* Removing obsoleted code from ApiMediaQueryService.cs
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from ContentCacheRefresher.cs
* Removing obsoleted code from ContentFinderByUrlAlias.cs and adjusting its tests to use the new logic
* Removing obsoleted code from ContentFinderByUrl.cs & its dependencies
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from DocumentCache.cs & its dependencies
* Removing obsoleted code from MediaCache.cs & its dependencies
* Removing obsoleted code from PublishedCacheBase.cs & its dependencies
* Removing obsoleted code from RenderNoContentController.cs and its tests
* Removing obsoleted code from UmbracoRouteValueTransformer.cs
* Removing obsoleted constructors from DefaultUrlProvider.cs
* Removing accidental bookmark
* Introducing a helper method to get the root keys in ApiMediaQueryService.cs
* Removing obsoleted code from Cache classes
* Removing unused imports
* Refactoring to meet the CR
* Added attribute to controller
* Fixing missing using statement
* Removing obsoleted constructor from ExternalLoginService.cs and making usages fit
* Removing obsoleted method from IContentTypeFilter.cs
* Removing obsoleted methods from IContentEditingService.cs
* Removing obosoleted code from DocumentUrlService.cs
* Removed obsoleted code from DataTypeService.cs
* Removed obsoleted code from PublishStatusService.cs
* Removing obsoleted code from the IContentPublishingService.cs and its dependencies. Also implementing a TODO in the service implementation
* Removing obsoleted code from IRelationService.cs
* Removing obsoleted code from ContentPublishingService.cs
* Removing obsoleted code from ContentEditingService.cs
* Removing obsoleted code from Constants-DataTypes.cs
* Removing obsoleted code from IAction.cs and its implementations
* Removing obsoleted code from IContentService.cs
* Removing obsoleted code from DomainUtilities.cs
* Removing obsoleted code from IIndexedEntitySearchService.cs and dependencies
* Removing obsoleted code from UrlProvider.cs
* Removing obsoleted code from AliasUrlProvider.cs
* Removing obsoleted code from ApiContentRouteBuilder.cs
* Removing obsoleted code from ApiPublishedContentCache.cs
* Removing obsoleted class TemplateQueryResult.cs
* Removing obsoleted code from ApiContentBuilder.cs
* Removing obsoleted code from HealthCheck.cs
* Removing obsoleted code from ContentTypeEditingService.cs
* Removing obsoleted code from NewDefaultUrlProvider.cs
* Removing obsoleted code from PublishedElementPropertyBase.cs
* Removing obsoleted code from WebhookRequestService.cs
* Bumping to obsolete in V18, due to usage in class that will be removed in V18
* Removing obsoleted code from PropertyValidationService.cs
* Removing obsoleted code from AddUnroutableContentWarningsWhenPublishingNotificationHandler.cs
* Removing obsoleted code from IMemberService.cs
* Removing obsoleted code from DocumentCache.cs
* Removing obsoleted code from ApiMediaQueryService.cs
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from ContentCacheRefresher.cs
* Removing obsoleted code from ContentFinderByUrlAlias.cs and adjusting its tests to use the new logic
* Removing obsoleted code from ContentFinderByUrl.cs & its dependencies
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from DocumentCache.cs & its dependencies
* Removing obsoleted code from MediaCache.cs & its dependencies
* Removing obsoleted code from PublishedCacheBase.cs & its dependencies
* Removing obsoleted code from RenderNoContentController.cs and its tests
* Removing obsoleted code from UmbracoRouteValueTransformer.cs
* Removing obsoleted constructors from DefaultUrlProvider.cs
* Removing accidental bookmark
* Introducing a helper method to get the root keys in ApiMediaQueryService.cs
* Removing obsoleted code from Cache classes
* Removing unused imports
* Refactoring to meet the CR
* Added attribute to controller
* Fixing missing using statement
* Removing ContentFinderByUrlAndTemplateTests.cs and dependencies
* Removing ContentFinderByAliasTests.cs
* Removing ContentFinderByAliasWithDomainsTests.cs
* Removing ContentFinderByIdentifierTestsBase.cs
* Removing ContentFinderByIdTests.cs
* Fixing ContentFinderByKeyTests.cs & ContentFinderByPageIdQueryTests.cs to work with new code
* Removing ContentFinderByUrlTests.cs & ContentFinderByUrlWithDomainsTests.cs
* Fixing ContentFinderByPageIdQueryTests.cs to actually test the result rather than force the result
* Removing comment and adding test scenario
* Removing obsoleted code from ApiMediaQueryService.cs
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from ContentCacheRefresher.cs
* Removing obsoleted code from ContentFinderByUrlAlias.cs and adjusting its tests to use the new logic
* Removing obsoleted code from ContentFinderByUrl.cs & its dependencies
* Removing obsoleted code from ApiRichTextMarkupParserTests.cs
* Removing obsoleted code from DocumentCache.cs & its dependencies
* Removing obsoleted code from MediaCache.cs & its dependencies
* Removing obsoleted code from PublishedCacheBase.cs & its dependencies
* Removing obsoleted code from RenderNoContentController.cs and its tests
* Removing obsoleted code from UmbracoRouteValueTransformer.cs
* Removing obsoleted constructors from DefaultUrlProvider.cs
* Removing the RadioValueEditor.cs & RadioValueValidator.cs obsoleted classes.
* Removing obsolete constructor from MultipleValueValidator.cs
* Removing obsolete constructor from EmailValidator.cs
* Removing obsoleted code from DataValueReferenceFactoryCollection.cs
* Removing obsoleted code from ApiContentBuilderBase.cs
* Fixing constructor missing attribute
* Making use of the TryGet result
* Fixing use of obsoleted constructor
* Removing silly bookmark comment
* Fixing deleted code and restructuring to use new cache
* Making use of TryGetRootKeys bool, to return null if false.
* Extending code to use new constructor
* Updated PublishedContentQuery.cs to return empty array
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
---------
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
* Removing obsoleted code from MigrationPlanExecutor.cs & Interface
* Removing obsoleted code from EmailAddressPropertyEditor.cs
* Removing obsoleted class CacheRebuilder.cs
* Removing obsoleted code from TextBuilder.cs
* Removing obsoleted class ICacheRebuilder.cs
* Removing obsoleted code from SerilogLogger.cs
* Removing the use of Infrastructure IBackgroundTaskQueue.cs and replacing usage with the Core replacement
* Removing obsoleted code from the FileUploadPropertyEditor.cs
* Removing obsoleted code from BlockValuePropertyValueEditorBase.cs
* Removing obsoleted constructors and methods from MultiNodeTreePickerPropertyEditor.cs and TextHeaderWriter.cs
* Removing obsoleted code from CacheInstructionService.cs
* Bumping obsoleted code from MigrationBase.cs to V18
* Removing obsoleted code from EmailSender.cs
* Removing obsoleted code from BlockEditorVarianceHandler.cs
* Removing obsoleted code from IBackOfficeApplicationManager.cs
* Removing obsoleted code from RedirectTracker.cs & RichTextEditorPastedImages.cs
* Persist and expose Umbraco system dates as UTC (#19705)
* Updated persistence DTOs defining default dates to use UTC.
* Remove ForceToUtc = false from all persistence DTO attributes (default when not specified is true).
* Removed use of SpecifyKind setting dates to local.
* Removed unnecessary Utc suffixes on properties.
* Persist current date time with UtcNow.
* Removed further necessary Utc suffixes and fixed failing unit tests.
* Added migration for SQL server to update database date default constraints.
* Added comment justifying not providing a migration for SQLite default date constraints.
* Ensure UTC for datetimes created from persistence DTOs.
* Ensure UTC when creating dates for published content rendering in Razor and outputting in delivery API.
* Fixed migration SQL syntax.
* Introduced AuditItemFactory for creating entries for the backoffice document history, so we can control the UTC setting on the retrieved persisted dates.
* Ensured UTC dates are retrieved for document versions.
* Ensured UTC is returned for backoffice display of last edited and published for variant content.
* Fixed SQLite syntax for default current datetime.
* Apply suggestions from code review
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
* Further updates from code review.
---------
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
* Migrate system dates from local server time to UTC (#19798)
* Add settings for the migration.
* Add migration and implement for SQL server.
* Implement for SQLite.
* Fixes from testing with SQL Server.
* Fixes from testing with SQLite.
* Code tidy.
* Cleaned up usings.
* Removed audit log date from conversion.
* Removed webhook log date from conversion.
* Updated update date initialization on saving dictionary items.
* Updated filter on log queries.
* Use timezone ID instead of system name to work cross-culture.
---------
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
* Removing obsoleted class GlobalSettingsExtensions.cs
* Removing obsoleted methods and usage from ObjectExtensions.cs
* Removing a ton of obsoleted methods from PublishedContentExtensions.cs
* Removing obsoleted constructors
* Removing obsoleted tag on private method that's still in use.
* Use unrestricted text field when creating data types based on the CheckboxList property editor.
Initialize default checkbox list data type with the unrestricted text field for storage on new installs.
Migrate existing data type and property data.
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Correctly use constant.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix nullability of Children extension
* Fix nullability of methods throughout the CMS
* Fix return types of some methods that cannot return null
* Revert nullable changes to result of ConvertSourceToIntermediate for property editors (whilst some property editors we know won't return null, it seems more consistent to adhere to the base class and interface nullability definition).
* Updated new webhook events to align with new nullability definitions.
* Reverted content editing service updates to align with base classes.
* Applied collection nullability updates on content repository to interface.
* Reverted value converter updates to match interface.
* Applied further collection updates to interface.
* Aligned media service interface with implementation for nullability.
* Update from code review.
---------
Co-authored-by: Ivo van der Bruggen <ivo@dutchbreeze.com>
Co-authored-by: Ivo van der Bruggen <ivo@vdbruggensoftware.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Introduce new AuditEntryService
- Moved logic related to the IAuditEntryRepository from the AuditService to the new service
- Introduced new Async methods
- Using ids (for easier transition from the previous Write method)
- Using keys
- Moved and updated integration tests related to the audit entries to a new test class `AuditEntryServiceTests`
- Added unit tests class `AuditEntryServiceTests` and added a few unit tests
- Added migration to add columns for `performingUserKey` and `affectedUserKey` and convert existing user ids
- Adjusted usages of the old AuditService.Write method to use the new one (mostly notification handlers)
* Audit service rework
- Added new async and paged methods
- Marked (now) redundant methods as obsolete
- Updated all of the usages to use the non-obsolete methods
- Added unit tests class `AuditServiceTests` and some unit tests
- Updated existing integration test
* Use the audit service instead of the repository directly in services
* Apply suggestions from code review
* Small improvement
* Update src/Umbraco.Core/Services/AuditService.cs
* Some minor adjustments following the merge
* Delete unnecessary file
* Small cleanup on the tests
* Remove changing user id to 0 (on audit) if user id is admin in media bulk save
* Remove reference to unused IUserIdKeyResolver in TemplateService
* Remove references to unused IShortStringHelper and GlobalSettings in FileService
* Started implementing new LongRunningOperationService and adjusting tasks to use this service
This service will manage operations that require status to be synced between servers (load balanced setup).
* Missing migration to add new lock. Other simplifications.
* Add job to cleanup the LongRunningOperations entries
* Add new DatabaseCacheRebuilder.RebuildAsync method
This is both async and returns an attempt, which will fail if a rebuild operation is already running.
* Missing LongRunningOperation database table creation on clean install
* Store expire date in the long running operation. Better handling of non-background operations.
Storing an expiration date allows setting different expiration times depending on the type of operation, and whether it is running in the background or not.
* Added integration tests for LongRunningOperationRepository
* Added unit tests for LongRunningOperationService
* Add type as a parameter to more repository calls. Distinguish between expiration and deletion in `LongRunningOperationRepository.CleanOperations`.
* Fix failing unit test
* Fixed `PerformPublishBranchAsync` result not being deserialized correctly
* Remove unnecessary DatabaseCacheRebuildResult value
* Add status to `LongRunningOperationService.GetResult` attempt to inform on why a result could not be retrieved
* General improvements
* Missing rename
* Improve the handling of long running operations that are not in background and stale operations
* Fix failing unit tests
* Fixed small mismatch between interface and implementation
* Use the new submit and poll functionality for the Examine index rebuild
* Use a fire and forget task instead of the background queue
* Apply suggestions from code review
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Make sure exceptions are caught when running in the background
* Alignment with other repositories (async + pagination)
* Fix build after merge
* Missing obsoletion messages
* Additional fixes
* Add Async suffix to service methods
* Missing adjustment
* Moved hardcoded settings to IOptions
* Fix issue in SQL Server where 0 is not accepted as requested number of rows
* Fix issue in SQL Server where query provided to count cannot contain orderby
* Additional SQL Server fixes
* Update method names
* Adjustments from code review
* Ignoring result of index rebuild in `IndexingNotificationHandler.Language.cs` (same behavior as before)
* Missed some obsoletion messages
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
* Introduce new AuditEntryService
- Moved logic related to the IAuditEntryRepository from the AuditService to the new service
- Introduced new Async methods
- Using ids (for easier transition from the previous Write method)
- Using keys
- Moved and updated integration tests related to the audit entries to a new test class `AuditEntryServiceTests`
- Added unit tests class `AuditEntryServiceTests` and added a few unit tests
- Added migration to add columns for `performingUserKey` and `affectedUserKey` and convert existing user ids
- Adjusted usages of the old AuditService.Write method to use the new one (mostly notification handlers)
* Audit service rework
- Added new async and paged methods
- Marked (now) redundant methods as obsolete
- Updated all of the usages to use the non-obsolete methods
- Added unit tests class `AuditServiceTests` and some unit tests
- Updated existing integration test
* Apply suggestions from code review
* Small improvement
* Update src/Umbraco.Core/Services/AuditService.cs
* Some minor adjustments following the merge
* Delete unnecessary file
* Small cleanup on the tests
* Introduce new AuditEntryService
- Moved logic related to the IAuditEntryRepository from the AuditService to the new service
- Introduced new Async methods
- Using ids (for easier transition from the previous Write method)
- Using keys
- Moved and updated integration tests related to the audit entries to a new test class `AuditEntryServiceTests`
- Added unit tests class `AuditEntryServiceTests` and added a few unit tests
- Added migration to add columns for `performingUserKey` and `affectedUserKey` and convert existing user ids
- Adjusted usages of the old AuditService.Write method to use the new one (mostly notification handlers)
* Apply suggestions from code review
* Small improvement
* Some adjustments following code review. Removed UnknownUserKey and used null instead.
* Small adjustments
* Better handle audits performed during the migration state
* Update TODO comment
@@ -9,7 +9,7 @@ In order to use Umbraco as a CMS and build your website with it, you should not
- Are you about to [create a pull request for Umbraco][contribution guidelines]?
- Are you trying to get to the bottom of a problem in your existing Umbraco installation?
If the answer is yes, please read on. Otherwise, make sure to head on over [to the download page](https://our.umbraco.com/download) and start using Umbraco CMS as intended.
If the answer is yes, please read on. Otherwise, make sure to head on over [to the releases page](https://releases.umbraco.com) and start using Umbraco CMS as intended.
## Table of contents
@@ -79,13 +79,12 @@ Conversely, if you are working on front-end only, you want to build the back-end
"AuthorizeCallbackLogoutPathName":"/logout",
"AuthorizeCallbackErrorPathName":"/error",
"BackOfficeTokenCookie":{
"Enabled":true,
"SameSite":"None"
}
```
> [!NOTE]
> If you get stuck in a login loop, try clearing your browser cookies for localhost, and make sure that the `BackOfficeTokenCookie` settings are correct. Namely, that `SameSite` should be set to `None` when running the front-end server separately.
> If you get stuck in a login loop, try clearing your browser cookies for localhost, and make sure that the `Umbraco:Cms:Security:BackOfficeTokenCookie:SameSite` setting is set to `None`.
@@ -24,7 +24,7 @@ Great question! The short version goes like this:
1.**Switch to the correct branch**
Switch to the `contrib` branch
Switch to the `main` branch
1.**Build**
@@ -32,7 +32,7 @@ Great question! The short version goes like this:
1.**Branch**
Create a new branch now and name it after the issue you're fixing, we usually follow the format: `temp-12345`. This means it's a temporary branch for the particular issue you're working on, in this case issue number `12345`. Don't commit to `contrib`, create a new branch first.
Create a new branch now and name it after the issue you're fixing, we usually follow the format: `temp-12345`. This means it's a temporary branch for the particular issue you're working on, in this case issue number `12345`. Don't commit to `main`, create a new branch first.
1.**Change**
@@ -42,7 +42,7 @@ Great question! The short version goes like this:
Done? Yay! 🎉
Remember to commit to your new `temp` branch, and don't commit to `contrib`. Then you can push the changes up to your fork on GitHub.
Remember to commit to your new `temp` branch, and don't commit to `main`. Then you can push the changes up to your fork on GitHub.
#### Keeping your Umbraco fork in sync with the main repository
@@ -59,10 +59,10 @@ Then when you want to get the changes from the main repository:
```
git fetch upstream
git rebase upstream/contrib
git rebase upstream/main
```
In this command we're syncing with the `contrib` branch, but you can of course choose another one if needed.
In this command we're syncing with the `main` branch, but you can of course choose another one if needed.
[More information on how this works can be found on the thoughtbot blog.][sync fork ext]
@@ -79,7 +79,7 @@ You can get in touch with [the core contributors team][core collabs] in multiple
- If there's an existing issue on the issue tracker then that's a good place to leave questions and discuss how to start or move forward.
- If you want to ask questions on some code you've already written you can create a draft pull request, [detailed in a GitHub blog post][draft prs].
- Unsure where to start? Did something not work as expected? Try leaving a note in the ["Contributing to Umbraco"][contrib forum] forum. The team monitors that one closely, so one of us will be on hand and ready to point you in the right direction.
- Unsure where to start? Did something not work as expected? Try leaving a note in the [forum][forum]. The team monitors that one closely, so one of us will be on hand and ready to point you in the right direction.
<!-- Local -->
@@ -90,7 +90,7 @@ You can get in touch with [the core contributors team][core collabs] in multiple
[sync fork ext]: http://robots.thoughtbot.com/post/5133345960/keeping-a-git-fork-updated "Details on keeping a git fork updated"
[draft prs]: https://github.blog/2019-02-14-introducing-draft-pull-requests/ "Github's blog post providing details on draft pull requests"
Enterprise-grade CMS built on .NET 10.0. This repository contains 21 production projects organized in a layered architecture with clear separation of concerns.
**Description**: A short, kebab-case description (a few words). This should be prefixed with the GitHub issue number if the update is related to resolving a tracked issue.
The repository contains BOTH (actively supported):
- **Current**: NPoco-based persistence (`Umbraco.Cms.Persistence.Sqlite`, `Umbraco.Cms.Persistence.SqlServer`) - widely used and fully supported
- **Future**: EF Core-based persistence (`Umbraco.Cms.Persistence.EFCore.*`) - migration in progress
**Note**: The codebase is actively migrating to EF Core, but NPoco remains the primary persistence layer and is not deprecated. Both are fully supported.
### Authentication: OpenIddict
All APIs use **OpenIddict** (OAuth 2.0/OpenID Connect):
- Reference tokens (not JWT) for better security
- **Secure cookie-based token storage** (v17+) - tokens stored in HTTP-only cookies with `__Host-` prefix
- Tokens are redacted from client-side responses and passed via secure cookies only
- ASP.NET Core Data Protection for token encryption
- Configured in `Umbraco.Cms.Api.Common`
- API requests must include credentials (`credentials: include` for fetch)
**Load Balancing Requirement**: All servers must share the same Data Protection key ring.
**This repository follows a layered architecture with strict dependency rules. The Core defines contracts, Infrastructure implements them, and Web/APIs consume them. Each layer can be understood independently, but dependencies always flow inward toward Core.**
<!-- OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer brings in a vulnerable version of Microsoft.IdentityModel.JsonWebTokens -->
<!-- Take top-level depedendency on Microsoft.IdentityModel.JsonWebTokens, because OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer depends on a vulnerable version -->
<!-- Azure.Identity, Microsoft.EntityFrameworkCore.SqlServer and Dazinator.Extensions.FileProviders brings in a legacy version of System.Text.Encodings.Web -->
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace. So this will run all tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace
# Filter tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace. So this will run all tests that are not part of the Umbraco.Infrastructure and the ManagementApi namespace
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace. So this will run all tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace. So this will run all tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure and ManagementApi namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
# Filter tests that are not part of the Umbraco.Infrastructure namespace. So this will run all tests that are not part of the Umbraco.Infrastructure namespace
**Configuration**: `BackOfficeTokenCookieSettings.Enabled` (default: true in v17+)
**Implications**: Client-side cannot access tokens; encrypted with Data Protection; load balancing needs shared key ring; API requests need `credentials: include`
---
## 6. Common Issues & Edge Cases
### Polymorphic Deserialization Requires `$type`
**Issue**: Deserializing to an interface without `$type` discriminator fails.
**This library is the foundation for all Umbraco CMS REST APIs. Focus on OpenAPI customization, authentication configuration, and polymorphic serialization when working here.**
// IMPORTANT: the handler must be AFTER the built-in query string handler, because the client-side SignalR library sometimes appends access tokens to the query string.
// IMPORTANT: the handler must be AFTER the built-in query string handler, because the client-side SignalR library sometimes appends access tokens to the query string.
**This library exposes Umbraco content and media via REST for headless scenarios. Focus on query handlers, access control, and member authentication when working here.**
Description=QueryParameterDescription("Explicitly defines which properties should be included in the response (by default all properties are included)"),
[Obsolete("Use the ReferencedBy2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedBy2 will be renamed back to ReferencedBy.")]
[Obsolete("Use the ReferencedDescendants2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedDescendants2 will be renamed back to ReferencedDescendants.")]
[Obsolete("Use the ReferencedBy2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedBy2 will be renamed back to ReferencedBy.")]
[Obsolete("Use the ReferencedDescendants2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedDescendants2 will be renamed back to ReferencedDescendants.")]
[Obsolete("Use the ReferencedBy2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedBy2 will be renamed back to ReferencedBy.")]
[Obsolete("Use the ReferencedDescendants2 action method instead. Scheduled for removal in Umbraco 19, when ReferencedDescendants2 will be renamed back to ReferencedDescendants.")]
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.