Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
- uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: recursive
- name: Verify commit exists in origin/master
run: |
git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/*
Expand All @@ -29,7 +31,6 @@ jobs:
- name: Push
run: |
dotnet nuget push Geta.Optimizely.Categories.${{env.VERSION}}.nupkg --source https://nuget.pkg.github.com/Geta/index.json --api-key ${{env.GITHUB_TOKEN}}
dotnet nuget push Geta.Optimizely.Categories.Find.${{env.VERSION}}.nupkg --source https://nuget.pkg.github.com/Geta/index.json --api-key ${{env.GITHUB_TOKEN}}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create GitHub Release with Auto-Generated Notes
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "sub/geta-foundation-core"]
path = sub/geta-foundation-core
url = https://github.com/Geta/geta-foundation-core
branch = upgrade/cms13-2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Tracking a temporary feature/upgrade branch (upgrade/cms13-2) in .gitmodules is risky because once the upgrade is merged and the branch is deleted, future submodule updates tracking this branch will fail. It is recommended to track a stable branch (e.g., main or master) or remove the branch configuration entirely to default to the repository's default branch.

    branch = main

52 changes: 52 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Changelog

All notable changes to this project are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

First release targeting **.NET 10** and **Optimizely CMS 13**. This is a major version; upgrading from 1.x requires retargeting and recompiling your solution. See [Upgrading to Optimizely CMS 13](README.md#upgrading-to-optimizely-cms-13) in the README.

### Changed

- **BREAKING:** Upgraded to .NET 10 and Optimizely CMS 13 (`EPiServer.CMS.* 13.1.0`). Earlier versions target .NET 6 / Optimizely CMS 12.
- Rewrote the category property editor as native ES6 JavaScript modules, replacing the legacy Dojo/Dijit widgets (required by the CMS 13 editing UI).

### Removed

- **BREAKING:** `[AllowedTypes(typeof(CategoryData))]` on a `ContentReference` / `IList<ContentReference>` property no longer renders a category picker. On CMS 13 the native content reference picker does not resolve the base `CategoryData` type to its concrete category types, so the picker comes up empty. Use the `[Categories]` attribute, `[UIHint(CategoryUIHint.Categories)]`, or `[UIHint(CategoryUIHint.Category)]` instead. This is a source-only change — stored category references are unaffected and no data migration is required.
- Removed the legacy Dojo category selector widgets (`module/ClientResources/Scripts/widget/*`).

## [1.1.3] - 2025-01-31

- Removed an unused constructor parameter from `DefaultCategoryContentLoader` ([#41](https://github.com/Geta/geta-optimizely-categories/pull/41)).

## [1.1.2] - 2025-01-23

- Category hierarchy handling and routing improvements ([#30](https://github.com/Geta/geta-optimizely-categories/pull/30)).

## [1.1.1] - 2023-12-27

- Removed version constraints on the `Geta.Optimizely.Categories.Find` package.

## [1.1.0] - 2023-12-27

- Build/release pipeline improvements.

## [1.0.0] - 2022-05-27

- First stable release for Optimizely CMS 12 / .NET 6.

## [0.0.1] - 2022-05-18

- Initial release.

[Unreleased]: https://github.com/Geta/geta-optimizely-categories/compare/v1.1.3...HEAD
[1.1.3]: https://github.com/Geta/geta-optimizely-categories/compare/v1.1.2...v1.1.3
[1.1.2]: https://github.com/Geta/geta-optimizely-categories/compare/v1.1.1...v1.1.2
[1.1.1]: https://github.com/Geta/geta-optimizely-categories/compare/v1.1.0...v1.1.1
[1.1.0]: https://github.com/Geta/geta-optimizely-categories/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/Geta/geta-optimizely-categories/compare/v0.0.1...v1.0.0
[0.0.1]: https://github.com/Geta/geta-optimizely-categories/releases/tag/v0.0.1
161 changes: 119 additions & 42 deletions Geta.Optimizely.Categories.sln
Original file line number Diff line number Diff line change
@@ -1,42 +1,119 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32516.85
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Geta.Optimizely.Categories", "src\Geta.Optimizely.Categories\Geta.Optimizely.Categories.csproj", "{B98D1645-CBE3-4466-BCDA-09B0E4044449}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{3139E63B-C823-4FBE-934D-F1B7CAB3D34C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Foundation", "sandbox\Foundation\src\Foundation\Foundation.csproj", "{FD55722F-036D-45D4-84B4-3B97317DF2E7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Geta.Optimizely.Categories.Find", "src\Geta.Optimizely.Categories.Find\Geta.Optimizely.Categories.Find.csproj", "{1B0B8069-16AE-4156-8D96-5E65B3022CC5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|Any CPU.Build.0 = Release|Any CPU
{FD55722F-036D-45D4-84B4-3B97317DF2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD55722F-036D-45D4-84B4-3B97317DF2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD55722F-036D-45D4-84B4-3B97317DF2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD55722F-036D-45D4-84B4-3B97317DF2E7}.Release|Any CPU.Build.0 = Release|Any CPU
{1B0B8069-16AE-4156-8D96-5E65B3022CC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B0B8069-16AE-4156-8D96-5E65B3022CC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B0B8069-16AE-4156-8D96-5E65B3022CC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B0B8069-16AE-4156-8D96-5E65B3022CC5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{FD55722F-036D-45D4-84B4-3B97317DF2E7} = {3139E63B-C823-4FBE-934D-F1B7CAB3D34C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EC4AAEB0-EC5C-4B9D-AEC3-D2BCB8D89226}
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32516.85
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Geta.Optimizely.Categories", "src\Geta.Optimizely.Categories\Geta.Optimizely.Categories.csproj", "{B98D1645-CBE3-4466-BCDA-09B0E4044449}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Geta.Optimizely.Categories.Web", "src\Geta.Optimizely.Categories.Web\Geta.Optimizely.Categories.Web.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The project Geta.Optimizely.Categories.Web is configured with the legacy C# project type GUID ({FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}). Since this is a modern .NET project, it should use the SDK-style project type GUID ({9A19103F-16F7-4668-BE54-9A1E7A4F7556}) for consistency and better tooling support.

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Geta.Optimizely.Categories.Web", "src\Geta.Optimizely.Categories.Web\Geta.Optimizely.Categories.Web.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}"

EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "geta-foundation-core", "geta-foundation-core", "{637F7C28-82DB-4DFA-ADB4-B6061538FC11}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Foundation", "sub\geta-foundation-core\src\Foundation\Foundation.csproj", "{482B37E4-8CBF-426A-865C-8AB7E4E145DA}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The project Foundation is configured with the legacy C# project type GUID ({FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}). It should be updated to use the SDK-style project type GUID ({9A19103F-16F7-4668-BE54-9A1E7A4F7556}).

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Foundation", "sub\geta-foundation-core\src\Foundation\Foundation.csproj", "{482B37E4-8CBF-426A-865C-8AB7E4E145DA}"

EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Foundation.AppHost", "sub\geta-foundation-core\src\Foundation.AppHost\Foundation.AppHost.csproj", "{21873564-1FF0-41B3-B9EE-3D1EAF274763}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The project Foundation.AppHost is configured with the legacy C# project type GUID ({FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}). It should be updated to use the SDK-style project type GUID ({9A19103F-16F7-4668-BE54-9A1E7A4F7556}).

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Foundation.AppHost", "sub\geta-foundation-core\src\Foundation.AppHost\Foundation.AppHost.csproj", "{21873564-1FF0-41B3-B9EE-3D1EAF274763}"

EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Foundation.AppHost.ServiceDefaults", "sub\geta-foundation-core\src\Foundation.AppHost.ServiceDefaults\Foundation.AppHost.ServiceDefaults.csproj", "{FF8CF906-96C1-4205-8E53-CFE933F054A2}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The project Foundation.AppHost.ServiceDefaults is configured with the legacy C# project type GUID ({FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}). It should be updated to use the SDK-style project type GUID ({9A19103F-16F7-4668-BE54-9A1E7A4F7556}).

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Foundation.AppHost.ServiceDefaults", "sub\geta-foundation-core\src\Foundation.AppHost.ServiceDefaults\Foundation.AppHost.ServiceDefaults.csproj", "{FF8CF906-96C1-4205-8E53-CFE933F054A2}"

EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Geta.Optimizely.Categories.Tests", "tests\Geta.Optimizely.Categories.Tests\Geta.Optimizely.Categories.Tests.csproj", "{08CA7750-BA09-4987-BC55-2D6F7638C381}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The project Geta.Optimizely.Categories.Tests is configured with the legacy C# project type GUID ({FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}). It should be updated to use the SDK-style project type GUID ({9A19103F-16F7-4668-BE54-9A1E7A4F7556}).

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Geta.Optimizely.Categories.Tests", "tests\Geta.Optimizely.Categories.Tests\Geta.Optimizely.Categories.Tests.csproj", "{08CA7750-BA09-4987-BC55-2D6F7638C381}"

EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|x64.ActiveCfg = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|x64.Build.0 = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|x86.ActiveCfg = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Debug|x86.Build.0 = Debug|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|Any CPU.Build.0 = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|x64.ActiveCfg = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|x64.Build.0 = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|x86.ActiveCfg = Release|Any CPU
{B98D1645-CBE3-4466-BCDA-09B0E4044449}.Release|x86.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.Build.0 = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|x64.ActiveCfg = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|x64.Build.0 = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|x86.ActiveCfg = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Debug|x86.Build.0 = Debug|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|Any CPU.Build.0 = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|x64.ActiveCfg = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|x64.Build.0 = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|x86.ActiveCfg = Release|Any CPU
{482B37E4-8CBF-426A-865C-8AB7E4E145DA}.Release|x86.Build.0 = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|x64.ActiveCfg = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|x64.Build.0 = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|x86.ActiveCfg = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Debug|x86.Build.0 = Debug|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|Any CPU.Build.0 = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|x64.ActiveCfg = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|x64.Build.0 = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|x86.ActiveCfg = Release|Any CPU
{21873564-1FF0-41B3-B9EE-3D1EAF274763}.Release|x86.Build.0 = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|x64.ActiveCfg = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|x64.Build.0 = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|x86.ActiveCfg = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Debug|x86.Build.0 = Debug|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|Any CPU.Build.0 = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|x64.ActiveCfg = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|x64.Build.0 = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|x86.ActiveCfg = Release|Any CPU
{FF8CF906-96C1-4205-8E53-CFE933F054A2}.Release|x86.Build.0 = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|x64.ActiveCfg = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|x64.Build.0 = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|x86.ActiveCfg = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Debug|x86.Build.0 = Debug|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|Any CPU.Build.0 = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|x64.ActiveCfg = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|x64.Build.0 = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|x86.ActiveCfg = Release|Any CPU
{08CA7750-BA09-4987-BC55-2D6F7638C381}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{482B37E4-8CBF-426A-865C-8AB7E4E145DA} = {637F7C28-82DB-4DFA-ADB4-B6061538FC11}
{21873564-1FF0-41B3-B9EE-3D1EAF274763} = {637F7C28-82DB-4DFA-ADB4-B6061538FC11}
{FF8CF906-96C1-4205-8E53-CFE933F054A2} = {637F7C28-82DB-4DFA-ADB4-B6061538FC11}
{08CA7750-BA09-4987-BC55-2D6F7638C381} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
EndGlobalSection
Comment on lines +110 to +115

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The solution folder src (GUID {827E0CD3-B72D-47B6-A68D-7590B98EB39B}) was added to the solution, but the main projects Geta.Optimizely.Categories (GUID {B98D1645-CBE3-4466-BCDA-09B0E4044449}) and Geta.Optimizely.Categories.Web (GUID {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}) are not nested under it in the NestedProjects section. This will cause them to appear at the root of the solution in the IDE instead of inside the src folder.

GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EC4AAEB0-EC5C-4B9D-AEC3-D2BCB8D89226}
EndGlobalSection
EndGlobal
39 changes: 34 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Geta Optimizely Categories

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Geta_geta-optimizely-categories&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Geta_geta-optimizely-categories)
[![Platform](https://img.shields.io/badge/Platform-.NET%206-blue.svg?style=flat](https://img.shields.io/badge/Platform-.NET%206-blue.svg?style=flat))](https://docs.microsoft.com/en-us/dotnet/)
[![Platform](https://img.shields.io/badge/Optimizely-%2012-orange.svg?style=flat)](http://world.episerver.com/cms/)
[![Platform](https://img.shields.io/badge/Platform-.NET%2010-blue.svg?style=flat](https://img.shields.io/badge/Platform-.NET%2010-blue.svg?style=flat))](https://docs.microsoft.com/en-us/dotnet/)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The markdown link for the .NET platform badge is malformed and contains nested/mismatched brackets and parentheses. It should be simplified to a standard markdown link format.

Suggested change
[![Platform](https://img.shields.io/badge/Platform-.NET%2010-blue.svg?style=flat](https://img.shields.io/badge/Platform-.NET%2010-blue.svg?style=flat))](https://docs.microsoft.com/en-us/dotnet/)
[![Platform](https://img.shields.io/badge/Platform-.NET%2010-blue.svg?style=flat)](https://docs.microsoft.com/en-us/dotnet/)

[![Platform](https://img.shields.io/badge/Optimizely-%2013-orange.svg?style=flat)](http://world.episerver.com/cms/)

## Description

Expand Down Expand Up @@ -74,6 +74,35 @@ Instead of going to admin mode to manage categories, you now do it in edit mode,

![extended category tree](/docs/extended-category-tree.jpg)

## Upgrading to Optimizely CMS 13

This version targets .NET 10 and Optimizely CMS 13. Besides the framework upgrade (which requires retargeting and recompiling your solution), there is one behavioural breaking change to be aware of.

### `[AllowedTypes(typeof(CategoryData))]` no longer renders the category picker

On Optimizely CMS 12 you could skip the `[Categories]` attribute and apply `[AllowedTypes(typeof(CategoryData))]` to an `IList<ContentReference>` / `ContentReference` property to reuse the native content reference editor for categories.

On Optimizely CMS 13 the native content reference picker no longer resolves the base `CategoryData` type to its concrete category content types, so such a property opens an **empty picker** ("No Contents").

Switch the property to the package's own editor (the `[Categories]` attribute or a `CategoryUIHint`), which is unaffected:

```csharp
// Before (CMS 12) — no longer works on CMS 13
[AllowedTypes(typeof(CategoryData))]
public virtual IList<ContentReference> Categories { get; set; }

// After (CMS 13) — use one of these
[Categories]
public virtual IList<ContentReference> Categories { get; set; }

[UIHint(CategoryUIHint.Categories)]
public virtual IList<ContentReference> Categories { get; set; }
```

For a single category, use `[UIHint(CategoryUIHint.Category)]` on a `ContentReference` (unchanged).

This is a **source-only** change — stored category references are not affected and no data migration is required.

## Configuration

- CategorySeparator - defaults to **"__"**
Expand Down Expand Up @@ -118,14 +147,14 @@ There is a context menu in the selector where you quickly can create and auto pu

![category selector dialog create new](/docs/category-selector-dialog-create-new.jpg)

If you prefer to use the native content reference list editor for your categories you can skip the CategoriesAttribute:
If you prefer a `UIHint` over the `[Categories]` attribute, use `CategoryUIHint.Categories` for a multi-select list:

```csharp
[AllowedTypes(typeof(CategoryData))]
[UIHint(CategoryUIHint.Categories)]
public virtual IList<ContentReference> Categories { get; set; }
```

![content reference list](/docs/content-reference-list.jpg)
> **Note:** On Optimizely CMS 12 you could instead apply `[AllowedTypes(typeof(CategoryData))]` and reuse the native content reference editor. This is **no longer supported on Optimizely CMS 13** — see [Upgrading to Optimizely CMS 13](#upgrading-to-optimizely-cms-13).

If you want a single category on your content type just add a ContentReference property:

Expand Down
Loading
Loading