Conversation
…s for Umbraco 15 compatibility - Remove commented out Url.GetUmbracoApiService calls in ArticulateBlogImportController - Replace with direct URL paths using the controller's VersionedApiBackOfficeRoute - Fixes GetBlogMlExport and GetDisqusExport URL generation - Ensures compatibility with Umbraco 15 API changes
- Uncommented and updated ArticulateMarkdownPropertyEditor.cs for Umbraco 15 - Updated DataEditor attribute to use single parameter constructor - Changed inheritance from MarkdownPropertyEditor to DataEditor - Updated constructor to use IDataValueEditorFactory only - Kept ArticulateMarkdownEditorValueConverter unchanged as it was compatible - Build now succeeds without errors
- Uncommented and updated ThemePickerPropertyEditor.cs for Umbraco 15 - Updated DataEditor attribute to use single parameter constructor - Simplified constructor to use only IDataValueEditorFactory parameter - Removed obsolete EditorType parameter from constructor and attribute - Build continues to succeed without errors
- Removed ArticulateMarkdownPropertyEditor class as it's not needed - Kept ArticulateMarkdownEditorValueConverter for custom markdown processing - Reduced unnecessary dependencies and simplified the codebase - Build continues to succeed without errors
- Created new Lit-based web component for theme picker - Added modern property editor structure with manifests - Updated C# property editor with proper configuration - Added umbraco-package.json for Umbraco 15 extension system - Replaced old AngularJS implementation with modern web components - Maintained backward compatibility with existing API endpoints The theme picker now uses: - Lit web components for frontend UI - Modern extension manifest system - Umbraco 15 property editor architecture - Fetch API instead of AngularJS HTTP
- Created new Lit-based dashboard component replacing AngularJS dashboard - Added articulate-dashboard.element.js with modern reactive properties - Implemented blog importer as example sub-component with full functionality - Added dashboard manifest for Umbraco 15 extension system - Maintained all original functionality: welcome screen, management cards, detail views - Uses modern web components, CSS Grid, and Fetch API - Dynamic component loading for sub-modules - Responsive design with hover effects and transitions Dashboard features: - Welcome screen for new installations - Management grid with blog importer, exporter, and themes - Detailed views for each management tool - Modern UI with proper styling and interactions - Backward compatible with existing API endpoints
- Added complete blog exporter component with all original features - Added complete themes manager component with theme selection grid - Updated main dashboard to properly load all sub-components - Removed placeholder 'not implemented' messages - All components now fully functional with modern Lit architecture Blog Exporter features: - Content picker for Articulate node selection - Toggle for embedding images as base64 - Fetch API integration with proper error handling - File download handling (both direct and link-based) - Status messages and progress indication Themes Manager features: - Visual theme selection grid with hover effects - Theme name validation and error handling - Dynamic theme loading from API - Success/error status messaging - Modern card-based UI with gradients Technical improvements: - Dynamic component loading with proper imports - Consistent styling across all components - Error handling and validation - Responsive design patterns - Modern CSS with transitions and effects
- Incorporated the original themes.css styling and theme preview images - Added support for Material, Mini, Phantom, and VAPOR theme images - Maintained original .articulate-theme styling pattern for consistency - Added fallback gradient icons for themes without preview images - Preserved the original package selection styling with border highlights - Updated component to use proper 100x100px theme previews - Maintained backward compatibility with existing theme structure Features: - Uses actual theme preview images (theme-material.png, theme-mini.png, etc.) - Fallback to gradient icons with theme initial for custom themes - Original selection styling with blue border highlights - Responsive layout maintaining original visual design - Proper path resolution for theme assets
|
I have fork/branch in progress, will sync and base my PR's off this. Pretty much same state, much of back office UI+API progressed , also builds but work to do, e.g. some Doc Type changes needed for latest media types/pickers. Should I drop Umbraco 14 (.net 8.0) support? I have been focusing on v15 but did have multi-targeting for 14 + test site (and 16). Guess we can always come back to 14 if demand? |
remove .net 8 support amend api's for Guid instead of integer last commit before PR's against official branch feature/umb15 Shazwazza#455
- Register Smidge - Replace DefaultUrlProvider with NewDefaultUrlProvider - Replace ContentFinderByUrl with ContentFinderByUrlNew
Installer fixes - allow installer to run
|
Status update:
|
Add attributes file
**IMPORTANT** Using `"rollForward": "latestFeature" will prevent the build completing with an exception in the `Microsoft.NET.Sdk.StaticWebAssets` task. Reference: [Intermittent Error on Build](dotnet/aspnetcore#57147)
- Angular based BackOffice extensions are replaced by the new Lit and TypeScript based BackOffice extensions in the `Articulate.Api.Management` Client project. - Themes have moved to the `wwwroot\Views\Articulate\_System\` folder pending migration from ASP.NET Web Forms (Master Pages) to Layouts in ASP.NET Core and the ``Articulate.Web` project - The mobile optimised Markdown Editor has moved to the `Articulate.Web` project - this is disabled on the frontend for now pending OpenIddict based authentication with the BackOffice Management API.
- global using's replaced by `_ViewImports.cshtml` per theme - Latest supported 3rd party CSS and JavaScript assets, removed jQuery, latest Font Awesome free for branding (e.g. X) - Accessibility and web vitals improvements - Latest Google Tags/Analytics support - Minor feature and bug fixes e.g. Author RSS links corrected, https links, random tag order
- Replaced by `Articulate.Api.Management` project
- `ArticulateViewLocationExpander` resolves location of Articulate Views and Partials (not assets) for User themes, System themes and other Views (e.g. Markdown Editor); current active theme resolved by `ArticulateThemeResolver` service. - `PathHelper` removed and replaced by View expander, amends to `DefaultThemes` to support asset resolution , extending `ArticulateConstants` with Path locations and assist with (my) typo's - Theme Repository service to support BackOffice copy theme feature and listing available themes. - Views/Partial are now compiled at build time into assembly - Themes are also now embedded as resources in assembly to support BackOffice copy theme feature - NOTE: Developer edit and browser refresh (hot reload) currently not implemented, Razor runtime compilation for improved DX pending/future PR: [Enable runtime compilation for a Razor class library] (https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-9.0&tabs=visual-studio#enable-runtime-compilation-for-a-razor-class-library)
- `ContentUrls` not used - `UrlHelperExtensions` no longer used, ThemedAsset superseded and other methods moved to PublishedContentExtensions as IMasterModel extensions, IUrlHelper not used (UmbracoHelperExtensions simiraly - Moved to Extensions namespace (better implicit using's support) - Legacy Google Analytics UA extension method updated to uses Google Tags - Migrate obsolete methods, e.g. ILocalizationService -> ILanguageService , Parent/Children -> Parent()/Children() - Image Crop enhancement to check for (legacy) properties with just a string path
- Removed unused IVariationContextAccessor - Basic nullable enhancements where possible - Removed PathHelper calls, View Expander now finds - Minor amends to update obsolete methods, use Async where possible,
- Retire SendingContentHandler, logic moved to ContentSavingHandler - Retire ServerVariablesParsingHandler, replace by Management API / Client - Update ContentTypeSavingHandler to set ListView property - Update obsolete methods, basic nullable amends -
- Update obsolete methods - basic nullable support - Import first image correctly as MediaItem, not just a path - Enhance async usage
- Sample theme views (List, Post, Author, Authors, Tags), layout (_Layout, _ViewImports, _ViewStart) and multiple partials - Add theme assets (site.css and site.js) implementing responsive styling, typography, UI components - pnpm-lock.yaml updated to reflect dependency/version bumps. - update git ignore
…erty-value-preset - Moved default blog values ( heme, pageSize, route urls, label names, and enableComments) from ContentSavingHandler out to ManifestPropertyValuePreset for the Backoffice extension. - The ContentSavingHandler no longer blindly resets these defaults for IsArticulateRoot, solving the issue where wiping out route properties wasn't respected. - BlogMlImporter explicitly sets enableComments (and routes) programmatically, preserving importer behavior. - Added graceful fallbacks to ArticulateViewLocationExpander and ArticulateThemeResolver for an empty Theme property, along with debug and info logging. - docs: add guide on bypassing theme engine for advanced developers
- Introduce domain- and segment-aware routing and validation for Articulate. - Added ArticulateDomainMatcher, ArticulateRouteChangeDetector, ArticulateRouteSegmentHelper and ArticulateRouteValidator to validate configured route segments, detect route-affecting content changes, normalize/resolve configured segments and match domains more robustly. - Refactored ArticulateRouter to build routes into a temporary cache, validate overlapping root mappings, inject logging, use the new validators/matchers, and make route mapping domain-aware. - Updated ContentCacheRefresherHandler to use the change detector and expose GetArticulateRoots. - Updated controllers and published-content helpers to use the route-segment helper (returning empty/not found when segments are not configured) and added helpers to check for configured routes. - Adjusted ArticulateRootNodeCache domain lookup to use ArticulateDomainMatcher. - Restore 'optional' routes behaviour, if search, tags or category url not set on blog root, disable related routes.
- Introduce ArticulateTagInfo and add scoped tag retrieval APIs to avoid cross-blog tag mixing. IArticulateTagRepository now exposes GetAllTags and GetAllTagInfos (scoped by rootPath + tagGroup) and the repository implements these (with runtime cache in release). - GetTagQuery was changed to accept a rootPath string and callers updated accordingly. - ArticulateTagService gained GetAllTags and internal GetAllTagInfos wrappers that create scopes for repository calls. - MetaWeblog provider now depends on ArticulateTagService, uses GetAllTagInfos/GetAllTags and maps tag Name/Id (Id.ToString(CultureInfo.InvariantCulture)) or name strings when building CategoryInfo/Tag objects. - UmbracoHelperExtensions now resolves the tags base URL via ArticulateRouteSegmentHelper.GetConfiguredSegment and returns an empty PostTagCollection if not configured.
- Add route checks to avoid rendering broken links when category, tag or search routes are not available. - Uses Model.HasCategoriesRoute(), HasTagsRoute() and HasSearchRoute() to gate menu items, search forms and tag/category links (falling back to non-link spans when needed).
- Set explicit Layout in views - add tabindex and aria-hidden on decorative/secondary anchors - and use loading/fetchpriority attributes on images (lazy/high) to improve loading behavior. - Make menus, tags and search conditional on available routes (HasCategoriesRoute, HasTagsRoute, HasSearchRoute) and render non-link spans when routes are missing to avoid broken links. - Minor cleanups - Defer site.js with the defer attribute to avoid blocking render. - normalize Layout filename in _ViewStart - add local route checks/variables in PostTags to reduce repeated calls - remove a stray "#nullable enable" from SampleTheme.cs.
- Delete the hardcoded default TargetFrameworks (net9.0;net10.0) from Directory.Build.props; this avoids forcing TFMs across projects - consolidate/remove several redundant PropertyGroup wrappers. - remove a duplicate IncludeSymbols entry - adjust property grouping/comments to simplify the MSBuild props file, reduces duplicated/fragmented property blocks.
- Add a guard clause in ArticulateAuthorsController.Index to throw ArgumentOutOfRangeException when rootBlogNodeId is zero or negative.
Update the GeneratedCodeAttribute in Resources.Designer.cs from 17.0.0.0 to 18.0.0.0 to reflect regeneration with a newer StronglyTypedResourceBuilder tool. This is an auto-generated resources file and introduces no functional changes.
…nstall only - fix unintended publishing of draft posts during package upgrades - Inject IContentTypeService and ISqlContext and use the Articulate content type to enumerate all non-trashed Articulate root nodes (via GetPagedOfType with an SQL filter) instead of using FirstOrDefault on root content. - Iterate and publish each root's branch, selecting IncludeUnpublished for first-time publishes and ForceRepublish otherwise. - Improve logging to include node IDs, warn when no roots are found, and surface partial publish failures and exceptions per-node.
- Add a new V_6_0_0 migration to make the blog UrlName properties optional and include it in the Articulate upgrade plan (new migration class + GUID). - Refactor ArticulateRouteValidator: unify and extend validation to support both IPublishedContent and IContent, add configurable route aliases, centralize node path parsing and root description helpers - improve configured-segment and root-domain overlap checks, and accept URL segment providers for normalization. - Minor formatting change in migration handler and update of package.zip to remove mandatory for optional route values - surface validation errors as back office notification via new ContentPublishingHandler
- Avoid capturing a mutable local when registering Response.OnCompleted by using a dedicated exportStream variable - simplify a Trashed predicate to use !x.Trashed - eagerly materialize several IEnumerable<string> sequences into arrays to prevent multiple/deferred enumeration. - simplify a theme name null/whitespace check in the theme resolver.
- Refactor ArticulateBlogPresetApi signature/formatting and introduce multiple property-value preset manifests (string, integer, theme, toggle) with specific aliases/filters, and export them from the presets manifest. - Add eslint-import-resolver-typescript to the client package and update ESLint config to ignore @Umbraco-CMS unresolved imports. - run lint
- Rename and extend the Articulate root lifecycle handler (ContentSavedAsyncHandler -> ArticulateRootContentLifecycleHandler) and register it for both ContentSavedNotification and ContentPublishedNotification. - Ensure required child nodes (archive, authors) are created atomically and returned so they can be published when the root is published; - add GetChild, change EnsureChildNodeExists to return the child or null, and add PublishRequiredChildNode to publish missing children. - Improve race handling and logging around child creation and publish failures. - Update ContentCacheRefresherHandler to pass an allowUnpublishedRefresh flag into RefreshById, skip handling of unpublished instances in the instance refresh path, and respect removal/change semantics when deciding whether to refresh unpublished content. - Small rename of a validation Uri field to _domainValidationBaseUri in ContentPublishingHandler for clarity.
- Enable the 'enableComments' property by default for newly created posts. - ContentSavingHandler now sets all culture values for 'enableComments' to 1 when the content has no identity (created outside the backoffice UI). - MarkdownEditorApiController also sets an invariant/default 'enableComments' value (true) when preparing content via the Markdown editor API to keep API-created posts consistent with the backoffice behavior.
- Packaging support, split and clarify publish decision logic - Extract CanAutoPublish and separate flows for migrations and package imports (ShouldPublishAfterMigration / ShouldPublishAfterPackageImport). - Replace PublishArticulateTree with PublishArticulateRoots, add helpers GetAllArticulateRoots and GetInstalledArticulateRoots, dedupe roots, and introduce TryGetPublishBranchFilter to avoid auto-publishing unpublished roots unless explicitly allowed. - Improve logging and more precisely handle runtime state, AutoPublishOnStartup, and which roots should be published after migrations or package installs. - Make the migration notification handler internal
Change visibility to reduce public API surface
Add /.dotnet-home to .gitignore and simplify README's theme section
- Introduce a new Articulate.Tests project with multiple unit/integration test files (components, routing, migrations, setup/teardown) and include test appsettings. - Update solution and project files to include the test project. - Modify build scripts (build.ps1, build.sh) to run `dotnet test` (failing the build on test failures) before packing, gated by CI / RUN_TESTS env var
Updated actions/checkout to v6.0.2, dotnet/nbgv to v0.5.1, pnpm/action-setup to v5.0.0, actions/setup-node to v6.3.0, and actions/setup-dotnet to v5.2.0, actions/upload-artifact@v7.0.1, actions/cache@v5.0.4
- Add FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true to CI workflows (build.yml and build-linux.yml) to ensure JavaScript actions run on Node 24. - Also bump pnpm requirement and packageManager to 10.33 - [Deprecation of Node 20 on GitHub Actions runners](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/)
- fixes builder.Build() failures caused by a circular dependency when referencing Umbraco.Cms.DevelopmentMode.Backoffice.Refactor filter DI - Update ArticulateFrontEndFilterConvention to target controllers from the Articulate assembly only and apply a ServiceFilterAttribute for RouteCacheRefresherFilter. - Simplify ConfigureArticulateMvcOptions to add a new convention instance instead of relying on an injected convention. - Refactor DI registrations in ArticulateComposer to use TryAdd* where appropriate, register RouteCacheRefresherFilter as transient, prefer TryAddSingleton to avoid overwriting existing registrations. - Add unit tests (ArticulateFrontEndFilterConventionTests) and startup smoke tests, update test project references (Microsoft.AspNetCore.App, Umbraco.Cms, conditional DevelopmentMode.Backoffice for net10).
- remove unused helper CreateRoot method in routing tests
- Pass a resolved build version into the client build and simplify version resolution. - csproj: Add a PropertyGroup to resolve _ResolvedArticulateAppVersion from ArticulateAppVersion, NBGV_SemVer2, PackageVersion, or Version (in that order) and pass it to the client build as ARTICULATE_APP_VERSION via EnvironmentVariables on the Exec that runs the client build. - vite.config.ts: Remove execSync/nbgv-based detection and introduce a deterministic resolution flow: read package.json for a default version, accept ARTICULATE_APP_VERSION from the environment for production builds, warn-and-fallback for local dev, and throw an error on CI if the env var is missing. - Also expose the chosen version as import.meta.env.APP_VERSION.
- Update back-office auth to use AuthenticateAsync and make the checker async, removing direct cookie unprotect logic and the IOptionsMonitor dependency. - Update TitleTile.cshtml to await the new async method. - Refactor client authService: rename resolveSafeRedirectUrl to resolveSafeSameOriginUrl, use window.location.origin as fallback, return full parsed URL, use window.location.assign for logout redirect, minor cleanup/formatting and safety improvements for sign-out handling and token revocation.
Umbraco 16 (.NET 9) and Umbraco 17 (.NET 10)
This PR is a work in progress so that folks can see the diffs between the develop branch and getting v15 supported.
Anyone that wants to contribute to this should create a PR to target the feature/umb15 branch.
I've asked AI to do a ton of the conversions 🙈🙉🙊🐵 (RooCode + Claude Sonnet 4) - I have no idea if any of it is correct or works yet.
What I did to get to this state:
Getting it to compile
feature/umb13branch updated to support only Umbraco 13 and it builds and works.feature/umb15, Updated to Umbraco 15 dependencies, fixed all compilation issues - but meant just commenting out entire files in some cases, see 8efd089.AI attempts
I normally use RooCode and Claude Sonnet 4 (prev 3.7 was good too). But in the first attempt, I decided to again try Copilot in Agent mode, which I've never had a good experience with ... and it shows:
I also enabled the Fetch MCP tool.
Copilot /w Claude Sonnet 4
Prompt:
It tried to help but I had to keep telling it that it made mistakes and then had to manually fix up formatting, this is all it was able to do:
RooCode /w Claude Sonnet 4
Now that I reminded myself how bad Copilot is, I switched back to RooCode (highly recommend, make sure you read the docs). I normally enable auto-approve in RooCode for everything and just use 'Code' mode since I'll be editing code and just make sure it creates git commits along the way.
Prompt:
Result: c511bfc
Prompt:
Result: c4ae033
Prompt:
Result: 89f9951
Prompt:
Result: 9333dab
I won't post all the chatter that it responds with, but as an example of the summary that it output for the above work so far at this below. Note, that after each phase of it completing its steps that its come up with based on the prompt, it will produce a full report like below: 🙌
Prompt:
Result: 23ef6c9
You'll see that its also created 2 different files complete with details about how it migrated the property editors and dashboards 🎉
Prompt:
Result: 990aec2
Prompt:
Result: 0bc2e36
Prompt:
Result: 0bc2e36