├── .github └── workflows │ └── release.yml ├── .gitignore ├── LICENSE ├── Readme.md ├── images ├── data-type-settings.png └── icon.png ├── src ├── .editorconfig ├── .vscode │ ├── launch.json │ └── tasks.json ├── Our.FeatureFlags.sln ├── Our.FeatureFlags │ ├── Composer.cs │ ├── Editor │ │ ├── Configuration │ │ │ ├── FeatureFlaggedConfiguration.cs │ │ │ └── FeatureFlaggedConfigurationEditor.cs │ │ ├── FeatureFlaggedEditor.cs │ │ └── FeatureFlaggedPropertyValueConverter.cs │ ├── Extensions │ │ ├── FeatureManagerExtensions.cs │ │ └── UmbracoBuilderExtensions.cs │ ├── FeatureFlagsManifestFilter.cs │ ├── Filters │ │ ├── UmbracoBackOfficeUser │ │ │ ├── MatchCondition.cs │ │ │ ├── UmbracoBackOfficeUserFilter.cs │ │ │ └── UmbracoBackOfficeUserFilterSettings.cs │ │ └── UmbracoDomain │ │ │ ├── UmbracoDomainFilter.cs │ │ │ └── UmbracoDomainFilterSettings.cs │ ├── NotificationHandlers │ │ ├── FeatureContentPublishingNotificationHandler.cs │ │ └── FeatureContentSendingNotificationHandler.cs │ └── Our.FeatureFlags.csproj └── Site │ ├── DemoSiteV10 │ ├── .config │ │ └── dotnet-tools.json │ ├── .gitignore │ ├── Backoffice │ │ └── MenuRenderingNotificationHandler.cs │ ├── Components │ │ ├── Contact │ │ │ └── ContactViewComponent.cs │ │ ├── PageHeaderComponent.cs │ │ └── PageHeaderViewModel.cs │ ├── Controllers │ │ ├── BetaTemplateController.cs │ │ ├── Contact │ │ │ └── ContactSurfaceController.cs │ │ └── Search │ │ │ ├── ISearchServiceFactory.cs │ │ │ ├── SearchController.cs │ │ │ └── SearchServiceFactory.cs │ ├── DemoSiteV10.csproj │ ├── Features.cs │ ├── Helpers │ │ └── QueryStringHelper.cs │ ├── Models │ │ ├── Article.generated.cs │ │ ├── ArticleControls.generated.cs │ │ ├── ArticleList.generated.cs │ │ ├── BetaTemplate.generated.cs │ │ ├── Contact.generated.cs │ │ ├── ContactFormControls.generated.cs │ │ ├── Content.generated.cs │ │ ├── ContentControls.generated.cs │ │ ├── Error.generated.cs │ │ ├── File.generated.cs │ │ ├── Folder.generated.cs │ │ ├── FooterControls.generated.cs │ │ ├── HeaderControls.generated.cs │ │ ├── Home.generated.cs │ │ ├── IconLinkItem.generated.cs │ │ ├── Image.generated.cs │ │ ├── MainImageControls.generated.cs │ │ ├── Member.generated.cs │ │ ├── MemberLogin.generated.cs │ │ ├── SEocontrols.generated.cs │ │ ├── Search.generated.cs │ │ ├── Search │ │ │ ├── ISearchResults.cs │ │ │ └── SearchResults.cs │ │ ├── UmbracoMediaArticle.generated.cs │ │ ├── UmbracoMediaAudio.generated.cs │ │ ├── UmbracoMediaVectorGraphics.generated.cs │ │ ├── UmbracoMediaVideo.generated.cs │ │ ├── ViewModels │ │ │ ├── ContactViewModel.cs │ │ │ └── SearchViewModel.cs │ │ ├── VisibilityControls.generated.cs │ │ └── XMlsitemap.generated.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Services │ │ ├── ExamineSearchService.cs │ │ ├── ISearchService.cs │ │ └── SearchService.cs │ ├── Startup.cs │ ├── Views │ │ ├── BetaTemplate.cshtml │ │ ├── Components │ │ │ ├── Contact │ │ │ │ └── default.cshtml │ │ │ └── PageHeader │ │ │ │ └── Default.cshtml │ │ ├── Home.cshtml │ │ ├── Partials │ │ │ ├── blockgrid │ │ │ │ ├── area.cshtml │ │ │ │ ├── areas.cshtml │ │ │ │ ├── default.cshtml │ │ │ │ └── items.cshtml │ │ │ ├── blocklist │ │ │ │ └── default.cshtml │ │ │ ├── footer.cshtml │ │ │ ├── grid │ │ │ │ ├── Clean.cshtml │ │ │ │ ├── bootstrap3-fluid.cshtml │ │ │ │ ├── bootstrap3.cshtml │ │ │ │ └── editors │ │ │ │ │ ├── base.cshtml │ │ │ │ │ ├── embed.cshtml │ │ │ │ │ ├── macro.cshtml │ │ │ │ │ ├── media.cshtml │ │ │ │ │ ├── rte.cshtml │ │ │ │ │ └── textstring.cshtml │ │ │ ├── latestArticles.cshtml │ │ │ ├── mainNavigation.cshtml │ │ │ ├── metaData.cshtml │ │ │ └── xmlSitemap.cshtml │ │ ├── _ViewImports.cshtml │ │ ├── article.cshtml │ │ ├── articleList.cshtml │ │ ├── contact.cshtml │ │ ├── content.cshtml │ │ ├── error.cshtml │ │ ├── master.cshtml │ │ ├── search.cshtml │ │ └── xMLSitemap.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ ├── uSync │ │ └── v9 │ │ │ ├── Content │ │ │ ├── about-community.config │ │ │ ├── about.config │ │ │ ├── beta-page.config │ │ │ ├── beta-page_euopln4d.config │ │ │ ├── blog.config │ │ │ ├── community.config │ │ │ ├── conferences.config │ │ │ ├── contact.config │ │ │ ├── error.config │ │ │ ├── home.config │ │ │ ├── meetups.config │ │ │ ├── popular-blogs.config │ │ │ ├── search.config │ │ │ └── xmlsitemap.config │ │ │ ├── ContentTypes │ │ │ ├── article.config │ │ │ ├── articlecontrols.config │ │ │ ├── articlelist.config │ │ │ ├── betatemplate.config │ │ │ ├── contact.config │ │ │ ├── contactformcontrols.config │ │ │ ├── content.config │ │ │ ├── contentcontrols.config │ │ │ ├── error.config │ │ │ ├── footercontrols.config │ │ │ ├── headercontrols.config │ │ │ ├── home.config │ │ │ ├── iconlinkitem.config │ │ │ ├── mainimagecontrols.config │ │ │ ├── search.config │ │ │ ├── seocontrols.config │ │ │ ├── visibilitycontrols.config │ │ │ └── xmlsitemap.config │ │ │ ├── DataTypes │ │ │ ├── ApprovedColor.config │ │ │ ├── CheckboxList.config │ │ │ ├── ContentGrid.config │ │ │ ├── ContentPicker.config │ │ │ ├── DatePicker.config │ │ │ ├── DatePickerWithTime.config │ │ │ ├── Dropdown.config │ │ │ ├── DropdownFontAwesomeIcons.config │ │ │ ├── DropdownMultiple.config │ │ │ ├── FlaggedImage.config │ │ │ ├── IconLinkList.config │ │ │ ├── ImageCropper.config │ │ │ ├── ImageMediaPicker.config │ │ │ ├── LabelBigint.config │ │ │ ├── LabelDatetime.config │ │ │ ├── LabelDecimal.config │ │ │ ├── LabelInteger.config │ │ │ ├── LabelString.config │ │ │ ├── LabelTime.config │ │ │ ├── ListViewContent.config │ │ │ ├── ListViewMedia.config │ │ │ ├── ListViewMembers.config │ │ │ ├── MediaPicker.config │ │ │ ├── MediaPickerLegacy.config │ │ │ ├── MemberPicker.config │ │ │ ├── MultiURLPicker.config │ │ │ ├── MultiUrlPickerSingleUrlPicker.config │ │ │ ├── MultipleImageMediaPicker.config │ │ │ ├── MultipleMediaPicker.config │ │ │ ├── MultipleMediaPickerLegacy.config │ │ │ ├── NestedIconList.config │ │ │ ├── Numeric.config │ │ │ ├── Radiobox.config │ │ │ ├── RichtextEditor.config │ │ │ ├── SingleUrlPicker.config │ │ │ ├── Tags.config │ │ │ ├── Textarea.config │ │ │ ├── Textstring.config │ │ │ ├── TrueFalse.config │ │ │ ├── UploadArticle.config │ │ │ ├── UploadAudio.config │ │ │ ├── UploadFile.config │ │ │ ├── UploadVectorGraphics.config │ │ │ └── UploadVideo.config │ │ │ ├── Dictionary │ │ │ ├── article.by.config │ │ │ ├── article.on.config │ │ │ ├── article.posted.config │ │ │ ├── articlelist.viewall.config │ │ │ ├── contactform.email.config │ │ │ ├── contactform.message.config │ │ │ ├── contactform.name.config │ │ │ ├── contactform.send.config │ │ │ ├── footer.copyrightstatement.config │ │ │ ├── footer.copyrighttitle.config │ │ │ ├── navigation.menutitle.config │ │ │ ├── navigation.sitename.config │ │ │ ├── paging.next.config │ │ │ ├── paging.of.config │ │ │ ├── paging.page.config │ │ │ ├── paging.previous.config │ │ │ ├── search.placeholder.config │ │ │ ├── search.results.config │ │ │ └── search.searchbutton.config │ │ │ ├── Domains │ │ │ ├── da_da.config │ │ │ ├── en_en-us.config │ │ │ ├── https-localhost-44340-da_da.config │ │ │ └── https-localhost-44340-en_en-us.config │ │ │ ├── Languages │ │ │ ├── da.config │ │ │ └── en-us.config │ │ │ ├── Media │ │ │ ├── 24-days-people-at-codegarden.config │ │ │ ├── bluetooth-white-keyboard.config │ │ │ ├── chairs-lamps.config │ │ │ ├── codegarden-keynote.config │ │ │ ├── community-front-row.config │ │ │ ├── desktop-notebook-glasses.config │ │ │ ├── first-timers-at-codegarden.config │ │ │ ├── friendly-chair.config │ │ │ ├── front-row-audience-smiles.config │ │ │ ├── meetup-organizers-at-codegarden.config │ │ │ ├── phone-pen-binder.config │ │ │ ├── sample-images.config │ │ │ ├── say-cheese.config │ │ │ ├── skrift-at-codegarden.config │ │ │ ├── triangle-table-chairs.config │ │ │ └── umbracoffee-codegarden.config │ │ │ ├── MediaTypes │ │ │ ├── file.config │ │ │ ├── folder.config │ │ │ ├── image.config │ │ │ ├── umbracomediaarticle.config │ │ │ ├── umbracomediaaudio.config │ │ │ ├── umbracomediavectorgraphics.config │ │ │ └── umbracomediavideo.config │ │ │ ├── Templates │ │ │ ├── article.config │ │ │ ├── articlelist.config │ │ │ ├── betatemplate.config │ │ │ ├── contact.config │ │ │ ├── content.config │ │ │ ├── error.config │ │ │ ├── home.config │ │ │ ├── master.config │ │ │ ├── search.config │ │ │ └── xmlsitemap.config │ │ │ └── usync.config │ └── wwwroot │ │ ├── clean-assets │ │ ├── css │ │ │ ├── search-images.css │ │ │ └── styles.css │ │ └── js │ │ │ ├── scripts.js │ │ │ └── umb-snow.js │ │ ├── css │ │ └── dropdownStyles.css │ │ └── favicon.ico │ └── DemoSiteV13 │ ├── .config │ └── dotnet-tools.json │ ├── .gitignore │ ├── Backoffice │ └── MenuRenderingNotificationHandler.cs │ ├── Components │ ├── Contact │ │ └── ContactViewComponent.cs │ ├── PageHeaderComponent.cs │ └── PageHeaderViewModel.cs │ ├── Controllers │ ├── BetaTemplateController.cs │ ├── Contact │ │ └── ContactSurfaceController.cs │ └── Search │ │ ├── ISearchServiceFactory.cs │ │ ├── SearchController.cs │ │ └── SearchServiceFactory.cs │ ├── DemoSiteV13.csproj │ ├── Features.cs │ ├── Helpers │ └── QueryStringHelper.cs │ ├── Models │ ├── Article.generated.cs │ ├── ArticleControls.generated.cs │ ├── ArticleList.generated.cs │ ├── BetaTemplate.generated.cs │ ├── Contact.generated.cs │ ├── ContactFormControls.generated.cs │ ├── Content.generated.cs │ ├── ContentControls.generated.cs │ ├── Error.generated.cs │ ├── File.generated.cs │ ├── Folder.generated.cs │ ├── FooterControls.generated.cs │ ├── HeaderControls.generated.cs │ ├── Home.generated.cs │ ├── IconLinkItem.generated.cs │ ├── Image.generated.cs │ ├── MainImageControls.generated.cs │ ├── Member.generated.cs │ ├── MemberLogin.generated.cs │ ├── SEocontrols.generated.cs │ ├── Search.generated.cs │ ├── Search │ │ ├── ISearchResults.cs │ │ └── SearchResults.cs │ ├── UmbracoMediaArticle.generated.cs │ ├── UmbracoMediaAudio.generated.cs │ ├── UmbracoMediaVectorGraphics.generated.cs │ ├── UmbracoMediaVideo.generated.cs │ ├── ViewModels │ │ ├── ContactViewModel.cs │ │ └── SearchViewModel.cs │ ├── VisibilityControls.generated.cs │ └── XMlsitemap.generated.cs │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Services │ ├── ExamineSearchService.cs │ ├── ISearchService.cs │ └── SearchService.cs │ ├── Startup.cs │ ├── Views │ ├── BetaTemplate.cshtml │ ├── Components │ │ ├── Contact │ │ │ └── default.cshtml │ │ └── PageHeader │ │ │ └── Default.cshtml │ ├── Home.cshtml │ ├── Partials │ │ ├── blockgrid │ │ │ ├── area.cshtml │ │ │ ├── areas.cshtml │ │ │ ├── default.cshtml │ │ │ └── items.cshtml │ │ ├── blocklist │ │ │ └── default.cshtml │ │ ├── footer.cshtml │ │ ├── grid │ │ │ ├── Clean.cshtml │ │ │ ├── bootstrap3-fluid.cshtml │ │ │ ├── bootstrap3.cshtml │ │ │ └── editors │ │ │ │ ├── base.cshtml │ │ │ │ ├── embed.cshtml │ │ │ │ ├── macro.cshtml │ │ │ │ ├── media.cshtml │ │ │ │ ├── rte.cshtml │ │ │ │ └── textstring.cshtml │ │ ├── latestArticles.cshtml │ │ ├── mainNavigation.cshtml │ │ ├── metaData.cshtml │ │ └── xmlSitemap.cshtml │ ├── _ViewImports.cshtml │ ├── article.cshtml │ ├── articleList.cshtml │ ├── contact.cshtml │ ├── content.cshtml │ ├── error.cshtml │ ├── master.cshtml │ ├── search.cshtml │ └── xMLSitemap.cshtml │ ├── appsettings-schema.Umbraco.Cms.json │ ├── appsettings-schema.usync.json │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ ├── uSync │ └── v9 │ │ ├── Content │ │ ├── about-community.config │ │ ├── about.config │ │ ├── beta-page.config │ │ ├── beta-page_euopln4d.config │ │ ├── blog.config │ │ ├── community.config │ │ ├── conferences.config │ │ ├── contact.config │ │ ├── error.config │ │ ├── home.config │ │ ├── meetups.config │ │ ├── popular-blogs.config │ │ ├── search.config │ │ └── xmlsitemap.config │ │ ├── ContentTypes │ │ ├── article.config │ │ ├── articlecontrols.config │ │ ├── articlelist.config │ │ ├── betatemplate.config │ │ ├── contact.config │ │ ├── contactformcontrols.config │ │ ├── content.config │ │ ├── contentcontrols.config │ │ ├── error.config │ │ ├── footercontrols.config │ │ ├── headercontrols.config │ │ ├── home.config │ │ ├── iconlinkitem.config │ │ ├── mainimagecontrols.config │ │ ├── search.config │ │ ├── seocontrols.config │ │ ├── visibilitycontrols.config │ │ └── xmlsitemap.config │ │ ├── DataTypes │ │ ├── ApprovedColor.config │ │ ├── CheckboxList.config │ │ ├── ContentGrid.config │ │ ├── ContentPicker.config │ │ ├── DatePicker.config │ │ ├── DatePickerWithTime.config │ │ ├── Dropdown.config │ │ ├── DropdownFontAwesomeIcons.config │ │ ├── DropdownMultiple.config │ │ ├── FlaggedImage.config │ │ ├── IconLinkList.config │ │ ├── ImageCropper.config │ │ ├── ImageMediaPicker.config │ │ ├── LabelBigint.config │ │ ├── LabelDatetime.config │ │ ├── LabelDecimal.config │ │ ├── LabelInteger.config │ │ ├── LabelString.config │ │ ├── LabelTime.config │ │ ├── ListViewContent.config │ │ ├── ListViewMedia.config │ │ ├── ListViewMembers.config │ │ ├── MediaPicker.config │ │ ├── MediaPickerLegacy.config │ │ ├── MemberPicker.config │ │ ├── MultiURLPicker.config │ │ ├── MultiUrlPickerSingleUrlPicker.config │ │ ├── MultipleImageMediaPicker.config │ │ ├── MultipleMediaPicker.config │ │ ├── MultipleMediaPickerLegacy.config │ │ ├── NestedIconList.config │ │ ├── Numeric.config │ │ ├── Radiobox.config │ │ ├── RichtextEditor.config │ │ ├── SingleUrlPicker.config │ │ ├── Tags.config │ │ ├── Textarea.config │ │ ├── Textstring.config │ │ ├── TrueFalse.config │ │ ├── UploadArticle.config │ │ ├── UploadAudio.config │ │ ├── UploadFile.config │ │ ├── UploadVectorGraphics.config │ │ └── UploadVideo.config │ │ ├── Dictionary │ │ ├── article.by.config │ │ ├── article.on.config │ │ ├── article.posted.config │ │ ├── articlelist.viewall.config │ │ ├── contactform.email.config │ │ ├── contactform.message.config │ │ ├── contactform.name.config │ │ ├── contactform.send.config │ │ ├── footer.copyrightstatement.config │ │ ├── footer.copyrighttitle.config │ │ ├── navigation.menutitle.config │ │ ├── navigation.sitename.config │ │ ├── paging.next.config │ │ ├── paging.of.config │ │ ├── paging.page.config │ │ ├── paging.previous.config │ │ ├── search.placeholder.config │ │ ├── search.results.config │ │ └── search.searchbutton.config │ │ ├── Domains │ │ ├── da_da.config │ │ ├── en_en-us.config │ │ ├── https-localhost-44340-da_da.config │ │ └── https-localhost-44340-en_en-us.config │ │ ├── Languages │ │ ├── da.config │ │ └── en-us.config │ │ ├── Media │ │ ├── 24-days-people-at-codegarden.config │ │ ├── bluetooth-white-keyboard.config │ │ ├── chairs-lamps.config │ │ ├── codegarden-keynote.config │ │ ├── community-front-row.config │ │ ├── desktop-notebook-glasses.config │ │ ├── first-timers-at-codegarden.config │ │ ├── friendly-chair.config │ │ ├── front-row-audience-smiles.config │ │ ├── meetup-organizers-at-codegarden.config │ │ ├── phone-pen-binder.config │ │ ├── sample-images.config │ │ ├── say-cheese.config │ │ ├── skrift-at-codegarden.config │ │ ├── triangle-table-chairs.config │ │ └── umbracoffee-codegarden.config │ │ ├── MediaTypes │ │ ├── file.config │ │ ├── folder.config │ │ ├── image.config │ │ ├── umbracomediaarticle.config │ │ ├── umbracomediaaudio.config │ │ ├── umbracomediavectorgraphics.config │ │ └── umbracomediavideo.config │ │ ├── Templates │ │ ├── article.config │ │ ├── articlelist.config │ │ ├── betatemplate.config │ │ ├── contact.config │ │ ├── content.config │ │ ├── error.config │ │ ├── home.config │ │ ├── master.config │ │ ├── search.config │ │ └── xmlsitemap.config │ │ └── usync.config │ └── wwwroot │ ├── clean-assets │ ├── css │ │ ├── search-images.css │ │ └── styles.css │ └── js │ │ ├── scripts.js │ │ └── umb-snow.js │ ├── css │ └── dropdownStyles.css │ └── favicon.ico └── umbraco-marketplace.json /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build and Package 2 | on: 3 | push: 4 | tags: 5 | - "v*.*" 6 | 7 | env: 8 | BUILD_CONFIG: 'Release' 9 | SOLUTION: './src/Our.FeatureFlags/Our.FeatureFlags.csproj' 10 | 11 | jobs: 12 | 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Get tag 18 | id: tag 19 | uses: dawidd6/action-get-tag@v1.1.0 20 | with: 21 | strip_v: true 22 | 23 | - name: Checkout 24 | uses: actions/checkout@v3 25 | 26 | - name: Setup NuGet 27 | uses: NuGet/setup-nuget@v1 28 | with: 29 | nuget-version: '6.x' 30 | 31 | - name: Setup .NET 32 | uses: actions/setup-dotnet@v3 33 | with: 34 | dotnet-version: 6.x 35 | 36 | - name: Restore dependencies 37 | run: nuget restore $SOLUTION 38 | 39 | - name: Build 40 | run: dotnet build $SOLUTION --configuration $BUILD_CONFIG -p:Version=${{steps.tag.outputs.tag}} --no-restore 41 | 42 | - name: Push package to NuGet 43 | run: dotnet nuget push **\*.nupkg 44 | --api-key ${{ secrets.NUGET_DEPLOY_KEY }} 45 | --source https://api.nuget.org/v3/index.json 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Matthew-Wise 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Our.FeatureFlags 2 | 3 | Enables you to use [Microsoft.FeatureManagement](https://docs.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core?tabs=core5x) to not only control your front end by these filters and flags but also your back office properties. 4 | 5 | These properties can still be mandatory and have validation. 6 | 7 | # Installing 8 | 9 | Follow the install step(s) for [Microsoft.FeatureManagement](https://docs.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core?tabs=core5x). 10 | 11 | The package will register its dependencies using a Composer so no additional configuration is needed. 12 | 13 | 14 | # Using 15 | 16 | Create the data type you want to wrap then create a Feature Flagged data type that wraps it. Within your code use the FeatureManager as per the [Microsoft.FeatureManagement](https://docs.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core?tabs=core5x) documentation. 17 | 18 | Properties work with Models builder as if there were not feature flagged. 19 | 20 | # Known Issues and work arounds 21 | 22 | ## HasValue check 23 | Uses the base property value converter method of checking this, as I am unable to get the correct converter on this request. 24 | 25 | I would suggest never using HasValue and instead null check etc the strongly type value. 26 | 27 | 28 | 29 | ## Attribution 30 | The logo for Our.FeatureFlags - [Toggle icons created by Freepik - Flaticon](https://www.flaticon.com/free-icons/toggle) -------------------------------------------------------------------------------- /images/data-type-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matthew-Wise/feature-flagging-umbraco/03fbf1fb4d0fa48be0e0cd9175b91e667413c9e6/images/data-type-settings.png -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matthew-Wise/feature-flagging-umbraco/03fbf1fb4d0fa48be0e0cd9175b91e667413c9e6/images/icon.png -------------------------------------------------------------------------------- /src/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | // Use IntelliSense to find out which attributes exist for C# debugging 6 | // Use hover for the description of the existing attributes 7 | // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md 8 | "name": ".NET Core Launch (web)", 9 | "type": "coreclr", 10 | "request": "launch", 11 | "preLaunchTask": "build", 12 | // If you have changed target frameworks, make sure to update the program path. 13 | "program": "${workspaceFolder}/Site/bin/Debug/net5.0/FeatureFlags.Site.dll", 14 | "args": [], 15 | "cwd": "${workspaceFolder}/Site", 16 | "stopAtEntry": false, 17 | // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser 18 | "serverReadyAction": { 19 | "action": "openExternally", 20 | "pattern": "\\bNow listening on:\\s+(https?://\\S+)" 21 | }, 22 | "env": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | }, 25 | "sourceFileMap": { 26 | "/Views": "${workspaceFolder}/Views" 27 | } 28 | }, 29 | { 30 | "name": ".NET Core Attach", 31 | "type": "coreclr", 32 | "request": "attach" 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /src/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "build", 6 | "command": "dotnet", 7 | "type": "process", 8 | "args": [ 9 | "build", 10 | "${workspaceFolder}/Site/FeatureFlags.Site.csproj", 11 | "/property:GenerateFullPaths=true", 12 | "/consoleloggerparameters:NoSummary" 13 | ], 14 | "problemMatcher": "$msCompile" 15 | }, 16 | { 17 | "label": "publish", 18 | "command": "dotnet", 19 | "type": "process", 20 | "args": [ 21 | "publish", 22 | "${workspaceFolder}/Site/FeatureFlags.Site.csproj", 23 | "/property:GenerateFullPaths=true", 24 | "/consoleloggerparameters:NoSummary" 25 | ], 26 | "problemMatcher": "$msCompile" 27 | }, 28 | { 29 | "label": "watch", 30 | "command": "dotnet", 31 | "type": "process", 32 | "args": [ 33 | "watch", 34 | "run", 35 | "${workspaceFolder}/Site/FeatureFlags.Site.csproj", 36 | "/property:GenerateFullPaths=true", 37 | "/consoleloggerparameters:NoSummary" 38 | ], 39 | "problemMatcher": "$msCompile" 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Composer.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags; 2 | 3 | using Our.FeatureFlags.Extensions; 4 | using Umbraco.Cms.Core.Composing; 5 | using Umbraco.Cms.Core.DependencyInjection; 6 | 7 | internal class Composer : IComposer 8 | { 9 | public void Compose(IUmbracoBuilder builder) 10 | { 11 | builder.AddOurFeatureFlags(); 12 | 13 | builder.ManifestFilters().Append(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Editor/Configuration/FeatureFlaggedConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Editor.Configuration; 2 | 3 | using System; 4 | using System.Collections.Generic; 5 | using Microsoft.FeatureManagement; 6 | using Umbraco.Cms.Core.PropertyEditors; 7 | 8 | public class FeatureFlaggedConfiguration 9 | { 10 | public FeatureFlaggedConfiguration() 11 | { 12 | Requirement = RequirementType.All; 13 | Features = new List(); 14 | } 15 | 16 | [ConfigurationField(key: nameof(Requirement), 17 | name: nameof(Requirement), 18 | view: "radiobuttonlist", 19 | Description = "Controls whether 'All' or 'Any' feature in a list of features should be enabled to render the editor")] 20 | public RequirementType Requirement { get; set; } 21 | 22 | [ConfigurationField(key: nameof(Features), 23 | name: nameof(Features), 24 | view: "checkboxlist", 25 | Description = "Features which control if this editor should be rendered")] 26 | public List Features { get; set; } 27 | 28 | [ConfigurationField(key: nameof(DataType), 29 | name: "Data Type", 30 | view: "treepicker", 31 | Description = "The data type to feature flag")] 32 | public Guid DataType { get; set; } 33 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Extensions/FeatureManagerExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Extensions; 2 | 3 | using System.Collections.Generic; 4 | using System.Threading.Tasks; 5 | 6 | using Microsoft.FeatureManagement; 7 | 8 | public static class FeatureManagerExtensions 9 | { 10 | public static async Task> GetEnabledFeatures(this IFeatureManager featureManager) 11 | { 12 | var enabledFeatures = new List(); 13 | 14 | await foreach (var featureName in featureManager.GetFeatureNamesAsync()) 15 | { 16 | if (await featureManager.IsEnabledAsync(featureName)) 17 | { 18 | enabledFeatures.Add(featureName); 19 | } 20 | } 21 | 22 | return enabledFeatures; 23 | } 24 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Extensions/UmbracoBuilderExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Extensions; 2 | 3 | using Our.FeatureFlags.NotificationHandlers; 4 | using Umbraco.Cms.Core.DependencyInjection; 5 | using Umbraco.Cms.Core.Notifications; 6 | 7 | public static class UmbracoBuilderExtensions 8 | { 9 | public static IUmbracoBuilder AddOurFeatureFlags(this IUmbracoBuilder builder) 10 | { 11 | //Umbraco's helper method checks to see if NotificationAsyncHandler is already registered if so skips it. 12 | builder 13 | .AddNotificationAsyncHandler() 14 | .AddNotificationAsyncHandler(); 15 | 16 | return builder; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Our.FeatureFlags/FeatureFlagsManifestFilter.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags; 2 | 3 | using Umbraco.Cms.Core.Manifest; 4 | 5 | internal class FeatureFlagsManifestFilter : IManifestFilter 6 | { 7 | public void Filter(List manifests) => manifests.Add(new PackageManifest 8 | { 9 | PackageName = "Our.FeatureFlags", 10 | Version = typeof(FeatureFlagsManifestFilter).Assembly.GetName().Version?.ToString(3) ?? string.Empty, 11 | }); 12 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Filters/UmbracoBackOfficeUser/MatchCondition.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Filters.UmbracoBackOfficeUser; 2 | 3 | using Microsoft.FeatureManagement; 4 | 5 | internal sealed class MatchCondition 6 | { 7 | 8 | /// 9 | public RequirementType Match { get; set; } = RequirementType.Any; 10 | 11 | public string[] Values { get; set; } = Array.Empty(); 12 | 13 | public bool IsMatch(IEnumerable valuesToMatch) 14 | { 15 | if(Values.Any() == false) 16 | { 17 | return true; 18 | } 19 | 20 | return Match switch 21 | { 22 | RequirementType.All => Values.All(v => valuesToMatch.Contains(v, StringComparer.InvariantCultureIgnoreCase)), 23 | RequirementType.Any => Values.Any(v => valuesToMatch.Contains(v, StringComparer.InvariantCultureIgnoreCase)), 24 | _ => false 25 | }; 26 | } 27 | 28 | public bool IsMatch(string email) => IsMatch(new[] { email }); 29 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Filters/UmbracoBackOfficeUser/UmbracoBackOfficeUserFilterSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Filters.UmbracoBackOfficeUser; 2 | 3 | using Microsoft.FeatureManagement; 4 | 5 | internal sealed class UmbracoBackOfficeUserFilterSettings 6 | { 7 | /// 8 | public RequirementType Match { get; set; } = RequirementType.Any; 9 | 10 | /// 11 | /// Groups to check the user had to enable the flag 12 | /// 13 | public MatchCondition Groups { get; set; } = new(); 14 | 15 | /// 16 | /// Email addresses to check the user had to enable the flag 17 | /// 18 | public MatchCondition EmailAddresses { get; set; } = new(); 19 | } -------------------------------------------------------------------------------- /src/Our.FeatureFlags/Filters/UmbracoDomain/UmbracoDomainFilterSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Our.FeatureFlags.Filters.UmbracoDomain; 2 | 3 | using Microsoft.FeatureManagement; 4 | 5 | public class UmbracoDomainFilterSettings 6 | { 7 | public RequirementType RequirementType { get; set; } = RequirementType.Any; 8 | 9 | public string[] Domains { get; set; } = Array.Empty(); 10 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "6.0.10", 7 | "commands": [ 8 | "dotnet-ef" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Backoffice/MenuRenderingNotificationHandler.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Backoffice; 2 | 3 | using Microsoft.FeatureManagement; 4 | using Umbraco.Cms.Core.Events; 5 | using Umbraco.Cms.Core.Notifications; 6 | using Umbraco.Cms.Web.Common.PublishedModels; 7 | 8 | public class MenuRenderingNotificationHandler : INotificationHandler 9 | { 10 | private readonly IFeatureManager _featureManager; 11 | 12 | public MenuRenderingNotificationHandler(IFeatureManager featureManager) 13 | { 14 | _featureManager = featureManager; 15 | } 16 | 17 | public async void Handle(SendingAllowedChildrenNotification notification) 18 | { 19 | if (await _featureManager.IsEnabledAsync(Features.BetaTemplate)) 20 | { 21 | return; 22 | } 23 | 24 | notification.Children = notification.Children.Where(c => c.Alias != BetaTemplate.ModelTypeAlias); 25 | } 26 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Components/Contact/ContactViewComponent.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components.Contact; 2 | 3 | using DemoSite.Models.ViewModels; 4 | using Microsoft.AspNetCore.Mvc; 5 | 6 | [ViewComponent(Name = "Contact")] 7 | public class ContactViewComponent : ViewComponent 8 | { 9 | public IViewComponentResult Invoke(ContactViewModel model) 10 | { 11 | return View(model); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Components/PageHeaderComponent.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components; 2 | 3 | using Microsoft.AspNetCore.Mvc; 4 | using Umbraco.Cms.Core.Models.PublishedContent; 5 | using Umbraco.Cms.Web.Common.PublishedModels; 6 | 7 | [ViewComponent(Name = "PageHeader")] 8 | public class PageHeaderComponent : ViewComponent 9 | { 10 | public IViewComponentResult Invoke(IPublishedContent content) 11 | { 12 | var model = new PageHeaderViewModel 13 | { 14 | Name = content.Name 15 | }; 16 | 17 | if (content is IHeaderControls header) 18 | { 19 | model.Title = header.Title; 20 | model.Subtitle = header.Subtitle; 21 | } 22 | 23 | if(content is IMainImageControls mainImage) 24 | { 25 | model.BackgroundImage = mainImage.MainImage; 26 | } 27 | 28 | if (content is Article article) 29 | { 30 | model.ArticleDate = article.ArticleDate; 31 | } 32 | 33 | return View(model); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Components/PageHeaderViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components; 2 | 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public class PageHeaderViewModel 6 | { 7 | public string? Name { get; set; } 8 | 9 | public string? Title { get; set; } 10 | 11 | public string? Subtitle { get; set; } 12 | 13 | public bool HasSubtitle => !string.IsNullOrWhiteSpace(Subtitle); 14 | 15 | public IPublishedContent? BackgroundImage { get; set; } 16 | 17 | public bool HasBackgroundImage => BackgroundImage != null; 18 | 19 | public string? AuthorName { get; set; } 20 | 21 | public bool HasAuthor => !string.IsNullOrWhiteSpace(AuthorName); 22 | 23 | public DateTime? ArticleDate { get; set; } 24 | 25 | public bool IsArticle => ArticleDate.HasValue; 26 | 27 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Controllers/BetaTemplateController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace DemoSite.Controllers; 4 | 5 | using Microsoft.AspNetCore.Mvc.ViewEngines; 6 | using Microsoft.FeatureManagement.Mvc; 7 | using Umbraco.Cms.Core.Web; 8 | using Umbraco.Cms.Web.Common.Controllers; 9 | using Umbraco.Cms.Web.Common.PublishedModels; 10 | 11 | [FeatureGate(Features.BetaUser)] 12 | public class BetaTemplateController : RenderController 13 | { 14 | public BetaTemplateController(ILogger logger, ICompositeViewEngine compositeViewEngine, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, compositeViewEngine, umbracoContextAccessor) 15 | { 16 | } 17 | 18 | [FeatureGate(Features.BetaUser)] 19 | public IActionResult BetaTemplate(BetaTemplate model) 20 | { 21 | return View(model); 22 | } 23 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Controllers/Search/ISearchServiceFactory.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Controllers.Search; 2 | 3 | using DemoSite.Services; 4 | 5 | public interface ISearchServiceFactory 6 | { 7 | Task GetSearchService(); 8 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Controllers/Search/SearchServiceFactory.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Controllers.Search; 2 | 3 | using DemoSite.Services; 4 | using Microsoft.FeatureManagement; 5 | using System; 6 | 7 | public class SearchServiceFactory : ISearchServiceFactory 8 | { 9 | private readonly IFeatureManager _featureManager; 10 | 11 | private readonly IServiceProvider _serviceProvider; 12 | 13 | public SearchServiceFactory(IFeatureManager featureManager, IServiceProvider serviceProvider) 14 | { 15 | _featureManager = featureManager; 16 | _serviceProvider = serviceProvider; 17 | } 18 | 19 | public async Task GetSearchService() 20 | { 21 | if (await _featureManager.IsEnabledAsync(Features.DanishSite)) 22 | { 23 | return _serviceProvider.GetRequiredService(); 24 | } 25 | 26 | return _serviceProvider.GetRequiredService(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Features.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite; 2 | public static class Features 3 | { 4 | public const string BackOfficeUser = nameof(BackOfficeUser); 5 | 6 | public const string DanishSite = nameof(DanishSite); 7 | 8 | public const string SearchImages = nameof(SearchImages); 9 | 10 | public const string BetaUser = nameof(BetaUser); 11 | 12 | public const string BetaTemplate = nameof(BetaTemplate); 13 | } 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Helpers/QueryStringHelper.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Helpers; 2 | 3 | public static class QueryStringHelper 4 | { 5 | public static int GetIntFromQueryString(IQueryCollection queryString, string key, int fallbackValue = 0) 6 | { 7 | var stringValue = queryString[key].ToString(); 8 | if (stringValue != null && !string.IsNullOrWhiteSpace(stringValue) && int.TryParse(stringValue, out var numericValue)) 9 | { 10 | return numericValue; 11 | } 12 | return fallbackValue; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Models/Search/ISearchResults.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.Search; 2 | using System.Collections.Generic; 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public interface ISearchResults 6 | { 7 | long TotalRecords { get; set; } 8 | IEnumerable? Content { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Models/Search/SearchResults.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.Search; 2 | using System.Collections.Generic; 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public class SearchResults : ISearchResults 6 | { 7 | public long TotalRecords { get; set; } 8 | 9 | public IEnumerable? Content { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Models/ViewModels/ContactViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.ViewModels; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | public class ContactViewModel 5 | { 6 | [Required(ErrorMessage = "Please enter your name")] 7 | public string Name { get; set; } = string.Empty; 8 | 9 | [Required(ErrorMessage = "Please enter your email address")] 10 | [EmailAddress(ErrorMessage = "Please enter a valid email address")] 11 | public string Email { get; set; } = string.Empty; 12 | 13 | [Required] 14 | [MaxLength(500, ErrorMessage = "Your message must be 500 characters or less")] 15 | public string Message { get; set; } = string.Empty; 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Models/ViewModels/SearchViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.ViewModels; 2 | 3 | using DemoSite.Models.Search; 4 | using Microsoft.Extensions.Primitives; 5 | using Umbraco.Cms.Core.Models.PublishedContent; 6 | 7 | public class SearchViewModel : PublishedContentWrapped 8 | { 9 | public SearchViewModel(IPublishedContent content, IPublishedValueFallback publishedValueFallback) : base(content, publishedValueFallback) 10 | { 11 | } 12 | 13 | public ISearchResults? Results { get; internal set; } 14 | public StringValues SearchQuery { get; internal set; } 15 | public string? SearchServiceName { get; set; } 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Program.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite; 2 | 3 | public class Program 4 | { 5 | public static void Main(string[] args) 6 | => CreateHostBuilder(args) 7 | .Build() 8 | .Run(); 9 | 10 | public static IHostBuilder CreateHostBuilder(string[] args) => 11 | Host.CreateDefaultBuilder(args) 12 | .ConfigureUmbracoDefaults() 13 | .ConfigureWebHostDefaults(webBuilder => 14 | { 15 | webBuilder.ConfigureAppConfiguration(config => 16 | { 17 | var settings = config.Build(); 18 | string connectionString = settings.GetConnectionString("AppConfig"); 19 | if (!string.IsNullOrWhiteSpace(connectionString)) 20 | { 21 | config.AddAzureAppConfiguration(o => 22 | { 23 | o.Connect(connectionString); 24 | o.UseFeatureFlags(o => o.CacheExpirationInterval = TimeSpan.FromSeconds(1)); //Setting this low for demo purposes 25 | }); 26 | } 27 | }); 28 | webBuilder.UseStaticWebAssets(); 29 | webBuilder.UseStartup(); 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:27670", 8 | "sslPort": 44340 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": true, 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "Umbraco.Web.UI": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": true, 22 | "launchBrowser": true, 23 | "applicationUrl": "https://localhost:44340;http://localhost:27670", 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development" 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Services/ExamineSearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | using Examine; 5 | using Umbraco.Cms.Core; 6 | using Umbraco.Cms.Core.PublishedCache; 7 | using Umbraco.Cms.Web.Common.PublishedModels; 8 | using ISearchResults = Models.Search.ISearchResults; 9 | 10 | public sealed class ArticleSearchService : ISearchService 11 | { 12 | 13 | private readonly IExamineManager _examineManager; 14 | private readonly IPublishedSnapshotAccessor _publishedSnapshot; 15 | 16 | public ArticleSearchService(IExamineManager examineManager, IPublishedSnapshotAccessor publishedSnapshot) 17 | { 18 | _examineManager = examineManager; 19 | _publishedSnapshot = publishedSnapshot; 20 | } 21 | 22 | public ISearchResults GetSearchResults(string searchTerm) 23 | { 24 | if (!_examineManager.TryGetIndex(Constants.UmbracoIndexes.ExternalIndexName, out var index) || string.IsNullOrWhiteSpace(searchTerm)) 25 | { 26 | return new SearchResults(); 27 | } 28 | 29 | var results = index 30 | .Searcher 31 | .CreateQuery("content") 32 | .ManagedQuery(searchTerm) 33 | .And() 34 | .NodeTypeAlias(Article.ModelTypeAlias) 35 | .Execute(new Examine.Search.QueryOptions(0, 10)); 36 | 37 | return new SearchResults 38 | { 39 | TotalRecords = results.TotalItemCount, 40 | Content = results.ToPublishedSearchResults(_publishedSnapshot.GetRequiredPublishedSnapshot().Content) 41 | }; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Services/ISearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | 5 | public interface ISearchService 6 | { 7 | ISearchResults GetSearchResults(string searchTerm); 8 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Services/SearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | using System.Globalization; 5 | using Umbraco.Cms.Core; 6 | 7 | public sealed class SearchService : ISearchService 8 | { 9 | private readonly IPublishedContentQuery publishedContentQuery; 10 | 11 | public SearchService(IPublishedContentQuery publishedContentQuery) 12 | { 13 | this.publishedContentQuery = publishedContentQuery; 14 | } 15 | 16 | public ISearchResults GetSearchResults(string searchTerm) 17 | { 18 | if (string.IsNullOrWhiteSpace(searchTerm)) 19 | { 20 | return new SearchResults(); 21 | } 22 | 23 | var results = publishedContentQuery 24 | .Search(searchTerm, 0, 10, out long totalRecords, 25 | CultureInfo.CurrentUICulture.Name); 26 | return new SearchResults 27 | { 28 | TotalRecords = totalRecords, 29 | Content = results 30 | }; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/BetaTemplate.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Web.Common.PublishedModels; 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels; 4 | 5 | 6 | @{ 7 | Layout = "master.cshtml"; 8 | } 9 | @(await Component.InvokeAsync(Model)) 10 | 11 |
12 | @Html.GetGridHtml(Model, "mainContent", "Clean") 13 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Home.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | } 7 | 8 | @(await Component.InvokeAsync(Model)) 9 | 10 | 11 | @if (Model.MainContent != null) 12 | { 13 |
14 | @Html.GetGridHtml(Model, "mainContent", "Clean") 15 |
16 | } 17 | 18 | @await Html.PartialAsync("~/Views/Partials/latestArticles.cshtml") -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/blockgrid/area.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | 4 |
9 | @await Html.GetBlockGridItemsHtmlAsync(Model) 10 |
11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/blockgrid/areas.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Areas.Any() != true) { return; } 5 | } 6 | 7 |
9 | @foreach (var area in Model.Areas) 10 | { 11 | @await Html.GetBlockGridItemAreaHtmlAsync(area) 12 | } 13 |
14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/blockgrid/default.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
10 | @await Html.GetBlockGridItemsHtmlAsync(Model) 11 |
12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/blockgrid/items.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Models.Blocks 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage> 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
8 | @foreach (var item in Model) 9 | { 10 |
18 | @{ 19 | var partialViewName = "blockgrid/Components/" + item.Content.ContentType.Alias; 20 | try 21 | { 22 | @await Html.PartialAsync(partialViewName, item) 23 | } 24 | catch (InvalidOperationException) 25 | { 26 |

27 | Could not render component of type: @(item.Content.ContentType.Alias) 28 |
29 | This likely happened because the partial view @partialViewName could not be found. 30 |

31 | } 32 | } 33 |
34 | } 35 |
36 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/blocklist/default.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Core.Models.Blocks 3 | @{ 4 | if (!Model.Any()) { return; } 5 | } 6 |
7 | @foreach (var block in Model) 8 | { 9 | if (block?.ContentUdi == null) { continue; } 10 | var data = block.Content; 11 | @await Html.PartialAsync("blocklist/Components/" + data.ContentType.Alias, block) 12 | } 13 |
14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/grid/editors/base.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | 3 | @try 4 | { 5 | string editor = EditorView(Model); 6 | @await Html.PartialAsync(editor, (object)Model) 7 | } 8 | catch (Exception ex) 9 | { 10 |
@ex.ToString()
11 | } 12 | 13 | @functions{ 14 | 15 | public static string EditorView(dynamic contentItem) 16 | { 17 | string view = contentItem.editor.render != null ? contentItem.editor.render.ToString() : contentItem.editor.view.ToString(); 18 | view = view.ToLower().Replace(".html", ".cshtml"); 19 | 20 | if (!view.Contains("/")) 21 | { 22 | view = "grid/editors/" + view; 23 | } 24 | 25 | return view; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/grid/editors/embed.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @{ 4 | string embedValue = Convert.ToString(Model.value); 5 | embedValue = embedValue.DetectIsJson() ? Model.value.preview : Model.value; 6 | } 7 | 8 |
9 | @Html.Raw(embedValue) 10 |
11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/grid/editors/macro.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @if (Model.value != null) 4 | { 5 | string macroAlias = Model.value.macroAlias.ToString(); 6 | var parameters = new Dictionary(); 7 | foreach (var mpd in Model.value.macroParamsDictionary) 8 | { 9 | parameters.Add(mpd.Name, mpd.Value); 10 | } 11 | 12 | 13 | @await Umbraco.RenderMacroAsync(macroAlias, parameters) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/grid/editors/rte.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Templates 2 | @model dynamic 3 | @inject HtmlLocalLinkParser HtmlLocalLinkParser; 4 | @inject HtmlUrlParser HtmlUrlParser; 5 | @inject HtmlImageSourceParser HtmlImageSourceParser; 6 | 7 | @{ 8 | var value = HtmlLocalLinkParser.EnsureInternalLinks(Model.value.ToString()); 9 | value = HtmlUrlParser.EnsureUrls(value); 10 | value = HtmlImageSourceParser.EnsureImageSources(value); 11 | } 12 | 13 | @Html.Raw(value) 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/grid/editors/textstring.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web 2 | @model dynamic 3 | 4 | @if (Model.editor.config.markup != null) 5 | { 6 | string markup = Model.editor.config.markup.ToString(); 7 | markup = markup.Replace("#value#", Html.ReplaceLineBreaks((string)Model.value.ToString()).ToString()); 8 | 9 | if (Model.editor.config.style != null) 10 | { 11 | markup = markup.Replace("#style#", Model.editor.config.style.ToString()); 12 | } 13 | 14 | 15 | @Html.Raw(markup) 16 | 17 | } 18 | else 19 | { 20 | 21 |
@Model.value
22 |
23 | } 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/Partials/xmlSitemap.cshtml: -------------------------------------------------------------------------------- 1 | @model IPublishedContent 2 | @{ 3 | 4 | var homePage = Model.AncestorOrSelf("home"); 5 | void RenderChildPages(IEnumerable contentItems) 6 | { 7 | if (contentItems.Any()) 8 | { 9 | foreach (var content in contentItems.Where(x => x.IsVisible())) 10 | { 11 | if (!(content.HasProperty("excludeFromSitemap") && content.Value("excludeFromSitemap"))) 12 | { 13 | @content.Url(mode:UrlMode.Absolute)@content.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") 14 | if (content.Children.Any(x => x.IsVisible())) 15 | { 16 | RenderChildPages(content.Children); 17 | } 18 | } 19 | } 20 | } 21 | }; 22 | } 23 | 24 | 27 | @homePage.Url(mode: UrlMode.Absolute)1.0@homePage.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") 28 | @{ 29 | RenderChildPages(homePage.Children); 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using DemoSite.Components 2 | @using DemoSite.Helpers 3 | @using Umbraco.Extensions 4 | @using Microsoft.FeatureManagement 5 | @using Umbraco.Cms.Web.Common.PublishedModels 6 | @using Umbraco.Cms.Web.Common.Views 7 | @using Umbraco.Cms.Core.Models.PublishedContent 8 | @using Microsoft.AspNetCore.Html 9 | @using DemoSite 10 | 11 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 12 | @addTagHelper *, Microsoft.FeatureManagement.AspNetCore 13 | @addTagHelper *, Smidge 14 | @inject Smidge.SmidgeHelper SmidgeHelper 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/article.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ Layout = "master.cshtml"; } 5 | 6 | @(await Component.InvokeAsync(Model)) 7 | 8 |
9 | @Html.GetGridHtml(Model, "mainContent", "Clean") 10 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/articleList.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | } 7 | 8 | @(await Component.InvokeAsync(Model)) 9 | 10 | @await Html.PartialAsync("~/Views/Partials/latestArticles.cshtml") -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/contact.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | var submitted = false; 7 | if (bool.TryParse(TempData["Success"]?.ToString() ?? "", out var success)) 8 | { 9 | submitted = true; 10 | } 11 | } 12 | @(await Component.InvokeAsync(Model)) 13 | 14 |
15 |
16 |
17 |
18 | @if(submitted) 19 | { 20 | 21 | @if (success) 22 | { 23 | @Model.SuccessMessage 24 | } 25 | else 26 | { 27 | @Model.ErrorMessage 28 | } 29 | } 30 | else 31 | { 32 | @Model.InstructionMessage 33 |
34 | @await Component.InvokeAsync("Contact") 35 |
36 | 37 | } 38 |
39 |
40 |
41 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/content.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | @(await Component.InvokeAsync(Model)) 9 | 10 |
11 | @Html.GetGridHtml(Model, "mainContent", "Clean") 12 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/error.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | @(await Component.InvokeAsync(Model)) 9 | 10 |
11 | @Html.GetGridHtml(Model, "mainContent", "Clean") 12 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV10/Views/xMLSitemap.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @{ 3 | Context.Response.ContentType = "text/xml"; 4 | Layout = null; 5 | } 6 | @(await Html.CachedPartialAsync("~/Views/Partials/xmlSitemap.cshtml", Model, TimeSpan.FromMinutes(60))) 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./appsettings-schema.json", 3 | "Serilog": { 4 | "MinimumLevel": { 5 | "Default": "Information", 6 | "Override": { 7 | "Microsoft": "Warning", 8 | "Microsoft.Hosting.Lifetime": "Information", 9 | "System": "Warning" 10 | } 11 | } 12 | }, 13 | "Umbraco": { 14 | "CMS": { 15 | "Global": { 16 | "Id": "b800734d-71c3-4656-93b9-d42925e47fd5", 17 | "UseHttps": true, 18 | "SanitizeTinyMce": true 19 | }, 20 | "Content": { 21 | "ContentVersionCleanupPolicy": { 22 | "EnableCleanup": true 23 | } 24 | }, 25 | "ModelsBuilder": { 26 | "ModelsMode": "Nothing" 27 | }, 28 | "Hosting": { 29 | "Debug": false 30 | }, 31 | "Unattended": { 32 | "InstallUnattended": true, 33 | "UpgradeUnattended": true 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/libman.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "defaultProvider": "cdnjs", 4 | "libraries": [] 5 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Content/about.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Content/beta-page.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | /[-20]/BetaPage 6 | true 7 | betaTemplate 8 | 2022-11-16T18:35:20 9 | 10 | 0 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | <Value><![CDATA[Welcome to the beta]]></Value> 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Content/beta-page_euopln4d.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Home 5 | /Home/BetaPage 6 | false 7 | betaTemplate 8 | 2022-11-16T19:30:36 9 | 10 | 6 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | <Value><![CDATA[Welcome to the beta]]></Value> 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Content/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Home 5 | /Home/XMLSitemap 6 | false 7 | xMLSitemap 8 | 2021-10-09T23:24:16 9 | 10 | 4 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/article.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Article 5 | icon-article color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | articleControls 15 | contentControls 16 | headerControls 17 | mainImageControls 18 | sEOControls 19 | visibilityControls 20 | 21 | article 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/betatemplate.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Beta Template 5 | icon-medal color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | 13 | False 14 | 15 | 16 | 17 | Pages 18 | 19 | contentControls 20 | headerControls 21 | sEOControls 22 | visibilityControls 23 | 24 | BetaTemplate 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/contact.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Contact 5 | icon-message color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | contactFormControls 15 | headerControls 16 | mainImageControls 17 | sEOControls 18 | visibilityControls 19 | 20 | contact 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/error.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Error 5 | icon-application-error color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | contentControls 15 | headerControls 16 | mainImageControls 17 | sEOControls 18 | visibilityControls 19 | 20 | error 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/search.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Search 5 | icon-search color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Culture 11 | false 12 | 13 | False 14 | 15 | 16 | 17 | Pages 18 | 19 | headerControls 20 | mainImageControls 21 | sEOControls 22 | visibilityControls 23 | 24 | search 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/ContentTypes/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | XML Sitemap 5 | icon-sitemap color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | visibilityControls 15 | 16 | xMLSitemap 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/ApprovedColor.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Approved Color 5 | Umbraco.ColorPicker 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/CheckboxList.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Checkbox list 5 | Umbraco.CheckBoxList 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/ContentPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Content Picker 5 | Umbraco.ContentPicker 6 | Nvarchar 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/DatePicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Date Picker 5 | Umbraco.DateTime 6 | Date 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/DatePickerWithTime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Date Picker with time 5 | Umbraco.DateTime 6 | Date 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Dropdown.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Dropdown 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/DropdownFontAwesomeIcons.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [Dropdown] Font Awesome Icons 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/DropdownMultiple.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Dropdown multiple 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/FlaggedImage.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Flagged Image 5 | Our.FeatureFlags.FeatureFlagged 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/IconLinkList.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/ImageCropper.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Image Cropper 5 | Umbraco.ImageCropper 6 | Ntext 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/ImageMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Image Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelBigint.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (bigint) 5 | Umbraco.Label 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelDatetime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (datetime) 5 | Umbraco.Label 6 | Date 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelDecimal.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (decimal) 5 | Umbraco.Label 6 | Decimal 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelInteger.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (integer) 5 | Umbraco.Label 6 | Integer 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelString.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (string) 5 | Umbraco.Label 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/LabelTime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (time) 5 | Umbraco.Label 6 | Date 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/ListViewMedia.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | List View - Media 5 | Umbraco.ListView 6 | Nvarchar 7 | 8 | 54 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MediaPickerLegacy.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Media Picker (legacy) 5 | Umbraco.MediaPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MemberPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Member Picker 5 | Umbraco.MemberPicker 6 | Nvarchar 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MultiURLPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multi URL Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MultiUrlPickerSingleUrlPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [MultiUrlPicker] Single Url Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MultipleImageMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Image Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MultipleMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/MultipleMediaPickerLegacy.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Media Picker (legacy) 5 | Umbraco.MediaPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/NestedIconList.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [Nested] Icon List 5 | Umbraco.NestedContent 6 | Ntext 7 | 8 | 22 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Numeric.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Numeric 5 | Umbraco.Integer 6 | Integer 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Radiobox.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Radiobox 5 | Umbraco.RadioButtonList 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/RichtextEditor.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Richtext editor 5 | Umbraco.TinyMCE 6 | Ntext 7 | 8 | 38 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/SingleUrlPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Single Url Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Tags.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Tags 5 | Umbraco.Tags 6 | Ntext 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Textarea.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Textarea 5 | Umbraco.TextArea 6 | Ntext 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/Textstring.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Textstring 5 | Umbraco.TextBox 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/TrueFalse.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | True/false 5 | Umbraco.TrueFalse 6 | Integer 7 | 8 | 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/UploadArticle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Article 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/UploadAudio.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Audio 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/UploadFile.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload File 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/UploadVectorGraphics.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Vector Graphics 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/DataTypes/UploadVideo.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Video 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/article.by.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | by 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/article.on.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | on 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/article.posted.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Posted 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/articlelist.viewall.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | View all posts 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/contactform.email.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Email Address 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/contactform.message.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Message 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/contactform.name.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Name 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/contactform.send.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Send 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/footer.copyrightstatement.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Clean Starter Kit 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/footer.copyrighttitle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Copyright 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/navigation.menutitle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Menu 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/navigation.sitename.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Clean Starter Kit 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/paging.next.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Next 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/paging.of.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | of 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/paging.page.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Page 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/paging.previous.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Prev 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/search.placeholder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Search... 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/search.results.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <p>We found <strong>{0}</strong> results when searching for <strong>{1}</strong></p> 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Dictionary/search.searchbutton.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Search 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Domains/da_da.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | false 5 | da 6 | /Home 7 | 8 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Domains/en_en-us.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | false 5 | en-US 6 | /Home 7 | 8 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Domains/https-localhost-44340-da_da.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Domains/https-localhost-44340-en_en-us.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Languages/da.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | da 4 | false 5 | false 6 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Languages/en-us.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | en-US 4 | false 5 | true 6 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/24-days-people-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/daysPeopleAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:25 9 | 10 | 13 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/bluetooth-white-keyboard.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/BluetoothWhiteKeyboard 6 | false 7 | Image 8 | 2021-10-09T23:24:20 9 | 10 | 1 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/chairs-lamps.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/ChairsLamps 6 | false 7 | Image 8 | 2021-10-09T23:24:19 9 | 10 | 0 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/codegarden-keynote.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/CodegardenKeynote 6 | false 7 | Image 8 | 2021-10-09T23:24:23 9 | 10 | 8 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/community-front-row.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/CommunityFrontRow 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 4 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/desktop-notebook-glasses.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/DesktopNotebookGlasses 6 | false 7 | Image 8 | 2021-10-09T23:24:25 9 | 10 | 14 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/first-timers-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FirstTimersAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 12 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/friendly-chair.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FriendlyChair 6 | false 7 | Image 8 | 2021-10-09T23:24:23 9 | 10 | 9 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/front-row-audience-smiles.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FrontRowAudienceSmiles 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 11 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/meetup-organizers-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/MeetupOrganizersAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:22 9 | 10 | 6 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/phone-pen-binder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/PhonePenBinder 6 | false 7 | Image 8 | 2021-10-09T23:24:20 9 | 10 | 2 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/sample-images.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | /SampleImages 6 | false 7 | Folder 8 | 2021-10-09T23:24:19 9 | 10 | 0 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/say-cheese.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/SayCheese 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 10 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/skrift-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/SkriftAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 5 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/triangle-table-chairs.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/TriangleTableChairs 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 3 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Media/umbracoffee-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/UmbracoffeeCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:22 9 | 10 | 7 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/MediaTypes/folder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Folder 5 | icon-folder 6 | icon-folder 7 | 8 | True 9 | False 10 | Nothing 11 | false 12 | 13 | 14 | 15 | 16 | Folder 17 | Image 18 | File 19 | umbracoMediaVideo 20 | umbracoMediaAudio 21 | umbracoMediaArticle 22 | umbracoMediaVectorGraphics 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/article.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/articlelist.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/betatemplate.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/contact.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/content.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/error.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/home.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/master.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/search.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/Templates/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/uSync/v9/usync.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 2021-10-09T23:29:14 4 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/wwwroot/clean-assets/css/search-images.css: -------------------------------------------------------------------------------- 1 | .post-preview.with-images { 2 | display: flex; 3 | flex-direction: row; 4 | margin: 5px; 5 | } 6 | 7 | .post-preview.with-images img{ 8 | margin:0 5px; 9 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/wwwroot/clean-assets/js/scripts.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Clean Blog v6.0.7 (https://startbootstrap.com/theme/clean-blog) 3 | * Copyright 2013-2021 Start Bootstrap 4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-clean-blog/blob/master/LICENSE) 5 | */ 6 | window.addEventListener('DOMContentLoaded', () => { 7 | let scrollPos = 0; 8 | const mainNav = document.getElementById('mainNav'); 9 | const headerHeight = mainNav.clientHeight; 10 | window.addEventListener('scroll', function() { 11 | const currentTop = document.body.getBoundingClientRect().top * -1; 12 | if ( currentTop < scrollPos) { 13 | // Scrolling Up 14 | if (currentTop > 0 && mainNav.classList.contains('is-fixed')) { 15 | mainNav.classList.add('is-visible'); 16 | } else { 17 | mainNav.classList.remove('is-visible', 'is-fixed'); 18 | } 19 | } else { 20 | // Scrolling Down 21 | mainNav.classList.remove(['is-visible']); 22 | if (currentTop > headerHeight && !mainNav.classList.contains('is-fixed')) { 23 | mainNav.classList.add('is-fixed'); 24 | } 25 | } 26 | scrollPos = currentTop; 27 | }); 28 | }) 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/wwwroot/css/dropdownStyles.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /**umb_name:h2*/ 4 | h2 { 5 | font-size: 2.4em; 6 | } 7 | 8 | /**umb_name:h3*/ 9 | h3 { 10 | font-size: 2em; 11 | } 12 | 13 | /**umb_name:h4*/ 14 | h4 { 15 | font-size: 1.8em; 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV10/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matthew-Wise/feature-flagging-umbraco/03fbf1fb4d0fa48be0e0cd9175b91e667413c9e6/src/Site/DemoSiteV10/wwwroot/favicon.ico -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "6.0.10", 7 | "commands": [ 8 | "dotnet-ef" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Backoffice/MenuRenderingNotificationHandler.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Backoffice; 2 | 3 | using Microsoft.FeatureManagement; 4 | using Umbraco.Cms.Core.Events; 5 | using Umbraco.Cms.Core.Notifications; 6 | using Umbraco.Cms.Web.Common.PublishedModels; 7 | 8 | public class MenuRenderingNotificationHandler : INotificationHandler 9 | { 10 | private readonly IFeatureManager _featureManager; 11 | 12 | public MenuRenderingNotificationHandler(IFeatureManager featureManager) 13 | { 14 | _featureManager = featureManager; 15 | } 16 | 17 | public async void Handle(SendingAllowedChildrenNotification notification) 18 | { 19 | if (await _featureManager.IsEnabledAsync(Features.BetaTemplate)) 20 | { 21 | return; 22 | } 23 | 24 | notification.Children = notification.Children.Where(c => c.Alias != BetaTemplate.ModelTypeAlias); 25 | } 26 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Components/Contact/ContactViewComponent.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components.Contact; 2 | 3 | using DemoSite.Models.ViewModels; 4 | using Microsoft.AspNetCore.Mvc; 5 | 6 | [ViewComponent(Name = "Contact")] 7 | public class ContactViewComponent : ViewComponent 8 | { 9 | public IViewComponentResult Invoke(ContactViewModel model) 10 | { 11 | return View(model); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Components/PageHeaderComponent.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components; 2 | 3 | using Microsoft.AspNetCore.Mvc; 4 | using Umbraco.Cms.Core.Models.PublishedContent; 5 | using Umbraco.Cms.Web.Common.PublishedModels; 6 | 7 | [ViewComponent(Name = "PageHeader")] 8 | public class PageHeaderComponent : ViewComponent 9 | { 10 | public IViewComponentResult Invoke(IPublishedContent content) 11 | { 12 | var model = new PageHeaderViewModel 13 | { 14 | Name = content.Name 15 | }; 16 | 17 | if (content is IHeaderControls header) 18 | { 19 | model.Title = header.Title; 20 | model.Subtitle = header.Subtitle; 21 | } 22 | 23 | if(content is IMainImageControls mainImage) 24 | { 25 | model.BackgroundImage = mainImage.MainImage; 26 | } 27 | 28 | if (content is Article article) 29 | { 30 | model.ArticleDate = article.ArticleDate; 31 | } 32 | 33 | return View(model); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Components/PageHeaderViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Components; 2 | 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public class PageHeaderViewModel 6 | { 7 | public string? Name { get; set; } 8 | 9 | public string? Title { get; set; } 10 | 11 | public string? Subtitle { get; set; } 12 | 13 | public bool HasSubtitle => !string.IsNullOrWhiteSpace(Subtitle); 14 | 15 | public IPublishedContent? BackgroundImage { get; set; } 16 | 17 | public bool HasBackgroundImage => BackgroundImage != null; 18 | 19 | public string? AuthorName { get; set; } 20 | 21 | public bool HasAuthor => !string.IsNullOrWhiteSpace(AuthorName); 22 | 23 | public DateTime? ArticleDate { get; set; } 24 | 25 | public bool IsArticle => ArticleDate.HasValue; 26 | 27 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Controllers/BetaTemplateController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace DemoSite.Controllers; 4 | 5 | using Microsoft.AspNetCore.Mvc.ViewEngines; 6 | using Microsoft.FeatureManagement.Mvc; 7 | using Umbraco.Cms.Core.Web; 8 | using Umbraco.Cms.Web.Common.Controllers; 9 | using Umbraco.Cms.Web.Common.PublishedModels; 10 | 11 | [FeatureGate(Features.BetaUser)] 12 | public class BetaTemplateController : RenderController 13 | { 14 | public BetaTemplateController(ILogger logger, ICompositeViewEngine compositeViewEngine, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, compositeViewEngine, umbracoContextAccessor) 15 | { 16 | } 17 | 18 | [FeatureGate(Features.BetaUser)] 19 | public IActionResult BetaTemplate(BetaTemplate model) 20 | { 21 | return View(model); 22 | } 23 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Controllers/Search/ISearchServiceFactory.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Controllers.Search; 2 | 3 | using DemoSite.Services; 4 | 5 | public interface ISearchServiceFactory 6 | { 7 | Task GetSearchService(); 8 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Controllers/Search/SearchServiceFactory.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Controllers.Search; 2 | 3 | using DemoSite.Services; 4 | using Microsoft.FeatureManagement; 5 | using System; 6 | 7 | public class SearchServiceFactory : ISearchServiceFactory 8 | { 9 | private readonly IFeatureManager _featureManager; 10 | 11 | private readonly IServiceProvider _serviceProvider; 12 | 13 | public SearchServiceFactory(IFeatureManager featureManager, IServiceProvider serviceProvider) 14 | { 15 | _featureManager = featureManager; 16 | _serviceProvider = serviceProvider; 17 | } 18 | 19 | public async Task GetSearchService() 20 | { 21 | if (await _featureManager.IsEnabledAsync(Features.DanishSite)) 22 | { 23 | return _serviceProvider.GetRequiredService(); 24 | } 25 | 26 | return _serviceProvider.GetRequiredService(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Features.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite; 2 | public static class Features 3 | { 4 | public const string BackOfficeUser = nameof(BackOfficeUser); 5 | 6 | public const string DanishSite = nameof(DanishSite); 7 | 8 | public const string SearchImages = nameof(SearchImages); 9 | 10 | public const string BetaUser = nameof(BetaUser); 11 | 12 | public const string BetaTemplate = nameof(BetaTemplate); 13 | } 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Helpers/QueryStringHelper.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Helpers; 2 | 3 | public static class QueryStringHelper 4 | { 5 | public static int GetIntFromQueryString(IQueryCollection queryString, string key, int fallbackValue = 0) 6 | { 7 | var stringValue = queryString[key].ToString(); 8 | if (stringValue != null && !string.IsNullOrWhiteSpace(stringValue) && int.TryParse(stringValue, out var numericValue)) 9 | { 10 | return numericValue; 11 | } 12 | return fallbackValue; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Models/Search/ISearchResults.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.Search; 2 | using System.Collections.Generic; 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public interface ISearchResults 6 | { 7 | long TotalRecords { get; set; } 8 | IEnumerable? Content { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Models/Search/SearchResults.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.Search; 2 | using System.Collections.Generic; 3 | using Umbraco.Cms.Core.Models.PublishedContent; 4 | 5 | public class SearchResults : ISearchResults 6 | { 7 | public long TotalRecords { get; set; } 8 | 9 | public IEnumerable? Content { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Models/ViewModels/ContactViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.ViewModels; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | public class ContactViewModel 5 | { 6 | [Required(ErrorMessage = "Please enter your name")] 7 | public string Name { get; set; } = string.Empty; 8 | 9 | [Required(ErrorMessage = "Please enter your email address")] 10 | [EmailAddress(ErrorMessage = "Please enter a valid email address")] 11 | public string Email { get; set; } = string.Empty; 12 | 13 | [Required] 14 | [MaxLength(500, ErrorMessage = "Your message must be 500 characters or less")] 15 | public string Message { get; set; } = string.Empty; 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Models/ViewModels/SearchViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Models.ViewModels; 2 | 3 | using DemoSite.Models.Search; 4 | using Microsoft.Extensions.Primitives; 5 | using Umbraco.Cms.Core.Models.PublishedContent; 6 | 7 | public class SearchViewModel : PublishedContentWrapped 8 | { 9 | public SearchViewModel(IPublishedContent content, IPublishedValueFallback publishedValueFallback) : base(content, publishedValueFallback) 10 | { 11 | } 12 | 13 | public ISearchResults? Results { get; internal set; } 14 | public StringValues SearchQuery { get; internal set; } 15 | public string? SearchServiceName { get; set; } 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Program.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite; 2 | 3 | public class Program 4 | { 5 | public static void Main(string[] args) 6 | => CreateHostBuilder(args) 7 | .Build() 8 | .Run(); 9 | 10 | public static IHostBuilder CreateHostBuilder(string[] args) => 11 | Host.CreateDefaultBuilder(args) 12 | .ConfigureUmbracoDefaults() 13 | .ConfigureWebHostDefaults(webBuilder => 14 | { 15 | webBuilder.ConfigureAppConfiguration(config => 16 | { 17 | var settings = config.Build(); 18 | string connectionString = settings.GetConnectionString("AppConfig"); 19 | if (!string.IsNullOrWhiteSpace(connectionString)) 20 | { 21 | config.AddAzureAppConfiguration(o => 22 | { 23 | o.Connect(connectionString); 24 | o.UseFeatureFlags(o => o.CacheExpirationInterval = TimeSpan.FromSeconds(1)); //Setting this low for demo purposes 25 | }); 26 | } 27 | }); 28 | webBuilder.UseStaticWebAssets(); 29 | webBuilder.UseStartup(); 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:27670", 8 | "sslPort": 44340 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": true, 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "Umbraco.Web.UI": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": true, 22 | "launchBrowser": true, 23 | "applicationUrl": "https://localhost:44340;http://localhost:27670", 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development" 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Services/ExamineSearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | using Examine; 5 | using Umbraco.Cms.Core; 6 | using Umbraco.Cms.Core.PublishedCache; 7 | using Umbraco.Cms.Web.Common.PublishedModels; 8 | using ISearchResults = Models.Search.ISearchResults; 9 | 10 | public sealed class ArticleSearchService : ISearchService 11 | { 12 | 13 | private readonly IExamineManager _examineManager; 14 | private readonly IPublishedSnapshotAccessor _publishedSnapshot; 15 | 16 | public ArticleSearchService(IExamineManager examineManager, IPublishedSnapshotAccessor publishedSnapshot) 17 | { 18 | _examineManager = examineManager; 19 | _publishedSnapshot = publishedSnapshot; 20 | } 21 | 22 | public ISearchResults GetSearchResults(string searchTerm) 23 | { 24 | if (!_examineManager.TryGetIndex(Constants.UmbracoIndexes.ExternalIndexName, out var index) || string.IsNullOrWhiteSpace(searchTerm)) 25 | { 26 | return new SearchResults(); 27 | } 28 | 29 | var results = index 30 | .Searcher 31 | .CreateQuery("content") 32 | .ManagedQuery(searchTerm) 33 | .And() 34 | .NodeTypeAlias(Article.ModelTypeAlias) 35 | .Execute(new Examine.Search.QueryOptions(0, 10)); 36 | 37 | return new SearchResults 38 | { 39 | TotalRecords = results.TotalItemCount, 40 | Content = results.ToPublishedSearchResults(_publishedSnapshot.GetRequiredPublishedSnapshot().Content) 41 | }; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Services/ISearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | 5 | public interface ISearchService 6 | { 7 | ISearchResults GetSearchResults(string searchTerm); 8 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Services/SearchService.cs: -------------------------------------------------------------------------------- 1 | namespace DemoSite.Services; 2 | 3 | using DemoSite.Models.Search; 4 | using System.Globalization; 5 | using Umbraco.Cms.Core; 6 | 7 | public sealed class SearchService : ISearchService 8 | { 9 | private readonly IPublishedContentQuery publishedContentQuery; 10 | 11 | public SearchService(IPublishedContentQuery publishedContentQuery) 12 | { 13 | this.publishedContentQuery = publishedContentQuery; 14 | } 15 | 16 | public ISearchResults GetSearchResults(string searchTerm) 17 | { 18 | if (string.IsNullOrWhiteSpace(searchTerm)) 19 | { 20 | return new SearchResults(); 21 | } 22 | 23 | var results = publishedContentQuery 24 | .Search(searchTerm, 0, 10, out long totalRecords, 25 | CultureInfo.CurrentUICulture.Name); 26 | return new SearchResults 27 | { 28 | TotalRecords = totalRecords, 29 | Content = results 30 | }; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/BetaTemplate.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Web.Common.PublishedModels; 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels; 4 | 5 | 6 | @{ 7 | Layout = "master.cshtml"; 8 | } 9 | @(await Component.InvokeAsync(Model)) 10 | 11 |
12 | @Html.GetGridHtml(Model, "mainContent", "Clean") 13 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Home.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | } 7 | 8 | @(await Component.InvokeAsync(Model)) 9 | 10 | 11 | @if (Model.MainContent != null) 12 | { 13 |
14 | @Html.GetGridHtml(Model, "mainContent", "Clean") 15 |
16 | } 17 | 18 | @await Html.PartialAsync("~/Views/Partials/latestArticles.cshtml") -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/blockgrid/area.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | 4 |
9 | @await Html.GetBlockGridItemsHtmlAsync(Model) 10 |
11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/blockgrid/areas.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Areas.Any() != true) { return; } 5 | } 6 | 7 |
9 | @foreach (var area in Model.Areas) 10 | { 11 | @await Html.GetBlockGridItemAreaHtmlAsync(area) 12 | } 13 |
14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/blockgrid/default.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
10 | @await Html.GetBlockGridItemsHtmlAsync(Model) 11 |
12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/blockgrid/items.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Models.Blocks 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage> 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
8 | @foreach (var item in Model) 9 | { 10 |
18 | @{ 19 | var partialViewName = "blockgrid/Components/" + item.Content.ContentType.Alias; 20 | try 21 | { 22 | @await Html.PartialAsync(partialViewName, item) 23 | } 24 | catch (InvalidOperationException) 25 | { 26 |

27 | Could not render component of type: @(item.Content.ContentType.Alias) 28 |
29 | This likely happened because the partial view @partialViewName could not be found. 30 |

31 | } 32 | } 33 |
34 | } 35 |
36 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/blocklist/default.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Core.Models.Blocks 3 | @{ 4 | if (!Model.Any()) { return; } 5 | } 6 |
7 | @foreach (var block in Model) 8 | { 9 | if (block?.ContentUdi == null) { continue; } 10 | var data = block.Content; 11 | @await Html.PartialAsync("blocklist/Components/" + data.ContentType.Alias, block) 12 | } 13 |
14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/grid/editors/base.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | 3 | @try 4 | { 5 | string editor = EditorView(Model); 6 | @await Html.PartialAsync(editor, (object)Model) 7 | } 8 | catch (Exception ex) 9 | { 10 |
@ex.ToString()
11 | } 12 | 13 | @functions{ 14 | 15 | public static string EditorView(dynamic contentItem) 16 | { 17 | string view = contentItem.editor.render != null ? contentItem.editor.render.ToString() : contentItem.editor.view.ToString(); 18 | view = view.ToLower().Replace(".html", ".cshtml"); 19 | 20 | if (!view.Contains("/")) 21 | { 22 | view = "grid/editors/" + view; 23 | } 24 | 25 | return view; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/grid/editors/embed.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @{ 4 | string embedValue = Convert.ToString(Model.value); 5 | embedValue = embedValue.DetectIsJson() ? Model.value.preview : Model.value; 6 | } 7 | 8 |
9 | @Html.Raw(embedValue) 10 |
11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/grid/editors/macro.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @if (Model.value != null) 4 | { 5 | string macroAlias = Model.value.macroAlias.ToString(); 6 | var parameters = new Dictionary(); 7 | foreach (var mpd in Model.value.macroParamsDictionary) 8 | { 9 | parameters.Add(mpd.Name, mpd.Value); 10 | } 11 | 12 | 13 | @await Umbraco.RenderMacroAsync(macroAlias, parameters) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/grid/editors/rte.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Templates 2 | @model dynamic 3 | @inject HtmlLocalLinkParser HtmlLocalLinkParser; 4 | @inject HtmlUrlParser HtmlUrlParser; 5 | @inject HtmlImageSourceParser HtmlImageSourceParser; 6 | 7 | @{ 8 | var value = HtmlLocalLinkParser.EnsureInternalLinks(Model.value.ToString()); 9 | value = HtmlUrlParser.EnsureUrls(value); 10 | value = HtmlImageSourceParser.EnsureImageSources(value); 11 | } 12 | 13 | @Html.Raw(value) 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/grid/editors/textstring.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web 2 | @model dynamic 3 | 4 | @if (Model.editor.config.markup != null) 5 | { 6 | string markup = Model.editor.config.markup.ToString(); 7 | markup = markup.Replace("#value#", Html.ReplaceLineBreaks((string)Model.value.ToString()).ToString()); 8 | 9 | if (Model.editor.config.style != null) 10 | { 11 | markup = markup.Replace("#style#", Model.editor.config.style.ToString()); 12 | } 13 | 14 | 15 | @Html.Raw(markup) 16 | 17 | } 18 | else 19 | { 20 | 21 |
@Model.value
22 |
23 | } 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/Partials/xmlSitemap.cshtml: -------------------------------------------------------------------------------- 1 | @model IPublishedContent 2 | @{ 3 | 4 | var homePage = Model.AncestorOrSelf("home"); 5 | void RenderChildPages(IEnumerable contentItems) 6 | { 7 | if (contentItems.Any()) 8 | { 9 | foreach (var content in contentItems.Where(x => x.IsVisible())) 10 | { 11 | if (!(content.HasProperty("excludeFromSitemap") && content.Value("excludeFromSitemap"))) 12 | { 13 | @content.Url(mode:UrlMode.Absolute)@content.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") 14 | if (content.Children.Any(x => x.IsVisible())) 15 | { 16 | RenderChildPages(content.Children); 17 | } 18 | } 19 | } 20 | } 21 | }; 22 | } 23 | 24 | 27 | @homePage.Url(mode: UrlMode.Absolute)1.0@homePage.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") 28 | @{ 29 | RenderChildPages(homePage.Children); 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using DemoSite.Components 2 | @using DemoSite.Helpers 3 | @using Umbraco.Extensions 4 | @using Microsoft.FeatureManagement 5 | @using Umbraco.Cms.Web.Common.PublishedModels 6 | @using Umbraco.Cms.Web.Common.Views 7 | @using Umbraco.Cms.Core.Models.PublishedContent 8 | @using Microsoft.AspNetCore.Html 9 | @using DemoSite 10 | 11 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 12 | @addTagHelper *, Microsoft.FeatureManagement.AspNetCore 13 | @addTagHelper *, Smidge 14 | @inject Smidge.SmidgeHelper SmidgeHelper 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/article.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ Layout = "master.cshtml"; } 5 | 6 | @(await Component.InvokeAsync(Model)) 7 | 8 |
9 | @Html.GetGridHtml(Model, "mainContent", "Clean") 10 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/articleList.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | } 7 | 8 | @(await Component.InvokeAsync(Model)) 9 | 10 | @await Html.PartialAsync("~/Views/Partials/latestArticles.cshtml") -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/contact.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | @{ 5 | Layout = "master.cshtml"; 6 | var submitted = false; 7 | if (bool.TryParse(TempData["Success"]?.ToString() ?? "", out var success)) 8 | { 9 | submitted = true; 10 | } 11 | } 12 | @(await Component.InvokeAsync(Model)) 13 | 14 |
15 |
16 |
17 |
18 | @if(submitted) 19 | { 20 | 21 | @if (success) 22 | { 23 | @Model.SuccessMessage 24 | } 25 | else 26 | { 27 | @Model.ErrorMessage 28 | } 29 | } 30 | else 31 | { 32 | @Model.InstructionMessage 33 |
34 | @await Component.InvokeAsync("Contact") 35 |
36 | 37 | } 38 |
39 |
40 |
41 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/content.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 3 | 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | @(await Component.InvokeAsync(Model)) 9 | 10 |
11 | @Html.GetGridHtml(Model, "mainContent", "Clean") 12 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/error.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | @(await Component.InvokeAsync(Model)) 9 | 10 |
11 | @Html.GetGridHtml(Model, "mainContent", "Clean") 12 |
-------------------------------------------------------------------------------- /src/Site/DemoSiteV13/Views/xMLSitemap.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @{ 3 | Context.Response.ContentType = "text/xml"; 4 | Layout = null; 5 | } 6 | @(await Html.CachedPartialAsync("~/Views/Partials/xmlSitemap.cshtml", Model, TimeSpan.FromMinutes(60))) 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./appsettings-schema.json", 3 | "Serilog": { 4 | "MinimumLevel": { 5 | "Default": "Information", 6 | "Override": { 7 | "Microsoft": "Warning", 8 | "Microsoft.Hosting.Lifetime": "Information", 9 | "System": "Warning" 10 | } 11 | } 12 | }, 13 | "Umbraco": { 14 | "CMS": { 15 | "Global": { 16 | "Id": "b800734d-71c3-4656-93b9-d42925e47fd5", 17 | "UseHttps": true, 18 | "SanitizeTinyMce": true 19 | }, 20 | "Content": { 21 | "ContentVersionCleanupPolicy": { 22 | "EnableCleanup": true 23 | } 24 | }, 25 | "ModelsBuilder": { 26 | "ModelsMode": "Nothing" 27 | }, 28 | "Hosting": { 29 | "Debug": false 30 | }, 31 | "Unattended": { 32 | "InstallUnattended": true, 33 | "UpgradeUnattended": true 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/libman.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "defaultProvider": "cdnjs", 4 | "libraries": [] 5 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Content/about.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Content/beta-page.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | /[-20]/BetaPage 6 | true 7 | betaTemplate 8 | 2022-11-16T18:35:20 9 | 10 | 0 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | <Value><![CDATA[Welcome to the beta]]></Value> 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Content/beta-page_euopln4d.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Home 5 | /Home/BetaPage 6 | false 7 | betaTemplate 8 | 2022-11-16T19:30:36 9 | 10 | 6 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | <Value><![CDATA[Welcome to the beta]]></Value> 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Content/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Home 5 | /Home/XMLSitemap 6 | false 7 | xMLSitemap 8 | 2021-10-09T23:24:16 9 | 10 | 4 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/article.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Article 5 | icon-article color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | articleControls 15 | contentControls 16 | headerControls 17 | mainImageControls 18 | sEOControls 19 | visibilityControls 20 | 21 | article 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/betatemplate.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Beta Template 5 | icon-medal color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | 13 | False 14 | 15 | 16 | 17 | Pages 18 | 19 | contentControls 20 | headerControls 21 | sEOControls 22 | visibilityControls 23 | 24 | BetaTemplate 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/contact.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Contact 5 | icon-message color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | contactFormControls 15 | headerControls 16 | mainImageControls 17 | sEOControls 18 | visibilityControls 19 | 20 | contact 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/error.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Error 5 | icon-application-error color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | contentControls 15 | headerControls 16 | mainImageControls 17 | sEOControls 18 | visibilityControls 19 | 20 | error 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/search.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Search 5 | icon-search color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Culture 11 | false 12 | 13 | False 14 | 15 | 16 | 17 | Pages 18 | 19 | headerControls 20 | mainImageControls 21 | sEOControls 22 | visibilityControls 23 | 24 | search 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/ContentTypes/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | XML Sitemap 5 | icon-sitemap color-blue 6 | folder.png 7 | 8 | False 9 | False 10 | Nothing 11 | false 12 | Pages 13 | 14 | visibilityControls 15 | 16 | xMLSitemap 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/ApprovedColor.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Approved Color 5 | Umbraco.ColorPicker 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/CheckboxList.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Checkbox list 5 | Umbraco.CheckBoxList 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/ContentPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Content Picker 5 | Umbraco.ContentPicker 6 | Nvarchar 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/DatePicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Date Picker 5 | Umbraco.DateTime 6 | Date 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/DatePickerWithTime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Date Picker with time 5 | Umbraco.DateTime 6 | Date 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Dropdown.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Dropdown 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/DropdownFontAwesomeIcons.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [Dropdown] Font Awesome Icons 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/DropdownMultiple.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Dropdown multiple 5 | Umbraco.DropDown.Flexible 6 | Nvarchar 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/FlaggedImage.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Flagged Image 5 | Our.FeatureFlags.FeatureFlagged 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/IconLinkList.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/ImageCropper.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Image Cropper 5 | Umbraco.ImageCropper 6 | Ntext 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/ImageMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Image Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelBigint.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (bigint) 5 | Umbraco.Label 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelDatetime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (datetime) 5 | Umbraco.Label 6 | Date 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelDecimal.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (decimal) 5 | Umbraco.Label 6 | Decimal 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelInteger.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (integer) 5 | Umbraco.Label 6 | Integer 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelString.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (string) 5 | Umbraco.Label 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/LabelTime.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Label (time) 5 | Umbraco.Label 6 | Date 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MediaPickerLegacy.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Media Picker (legacy) 5 | Umbraco.MediaPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MemberPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Member Picker 5 | Umbraco.MemberPicker 6 | Nvarchar 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MultiURLPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multi URL Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MultiUrlPickerSingleUrlPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [MultiUrlPicker] Single Url Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MultipleImageMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Image Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MultipleMediaPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Media Picker 5 | Umbraco.MediaPicker3 6 | Ntext 7 | 8 | 20 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/MultipleMediaPickerLegacy.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Multiple Media Picker (legacy) 5 | Umbraco.MediaPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/NestedIconList.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | [Nested] Icon List 5 | Umbraco.NestedContent 6 | Ntext 7 | 8 | 22 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Numeric.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Numeric 5 | Umbraco.Integer 6 | Integer 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Radiobox.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Radiobox 5 | Umbraco.RadioButtonList 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/RichtextEditor.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Richtext editor 5 | Umbraco.TinyMCE 6 | Ntext 7 | 8 | 38 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/SingleUrlPicker.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Single Url Picker 5 | Umbraco.MultiUrlPicker 6 | Ntext 7 | 8 | 15 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Tags.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Tags 5 | Umbraco.Tags 6 | Ntext 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Textarea.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Textarea 5 | Umbraco.TextArea 6 | Ntext 7 | 8 | 12 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/Textstring.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Textstring 5 | Umbraco.TextBox 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/TrueFalse.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | True/false 5 | Umbraco.TrueFalse 6 | Integer 7 | 8 | 14 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/UploadArticle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Article 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/UploadAudio.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Audio 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 28 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/UploadFile.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload File 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/UploadVectorGraphics.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Vector Graphics 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/DataTypes/UploadVideo.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Upload Video 5 | Umbraco.UploadField 6 | Nvarchar 7 | 8 | 24 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/article.by.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | by 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/article.on.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | on 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/article.posted.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Posted 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/articlelist.viewall.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | View all posts 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/contactform.email.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Email Address 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/contactform.message.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Message 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/contactform.name.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Name 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/contactform.send.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Send 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/footer.copyrightstatement.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Clean Starter Kit 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/footer.copyrighttitle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Copyright 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/navigation.menutitle.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Menu 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/navigation.sitename.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Clean Starter Kit 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/paging.next.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Next 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/paging.of.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | of 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/paging.page.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Page 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/paging.previous.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Prev 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/search.placeholder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Search... 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/search.results.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | <p>We found <strong>{0}</strong> results when searching for <strong>{1}</strong></p> 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Dictionary/search.searchbutton.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Search 6 | 7 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Domains/da_da.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | false 5 | da 6 | /Home 7 | 8 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Domains/en_en-us.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | false 5 | en-US 6 | /Home 7 | 8 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Domains/https-localhost-44340-da_da.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Domains/https-localhost-44340-en_en-us.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Languages/da.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | da 4 | false 5 | false 6 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Languages/en-us.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | en-US 4 | false 5 | true 6 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/24-days-people-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/daysPeopleAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:25 9 | 10 | 13 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/bluetooth-white-keyboard.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/BluetoothWhiteKeyboard 6 | false 7 | Image 8 | 2021-10-09T23:24:20 9 | 10 | 1 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/chairs-lamps.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/ChairsLamps 6 | false 7 | Image 8 | 2021-10-09T23:24:19 9 | 10 | 0 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/codegarden-keynote.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/CodegardenKeynote 6 | false 7 | Image 8 | 2021-10-09T23:24:23 9 | 10 | 8 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/community-front-row.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/CommunityFrontRow 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 4 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/desktop-notebook-glasses.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/DesktopNotebookGlasses 6 | false 7 | Image 8 | 2021-10-09T23:24:25 9 | 10 | 14 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/first-timers-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FirstTimersAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 12 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/friendly-chair.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FriendlyChair 6 | false 7 | Image 8 | 2021-10-09T23:24:23 9 | 10 | 9 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/front-row-audience-smiles.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/FrontRowAudienceSmiles 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 11 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/meetup-organizers-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/MeetupOrganizersAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:22 9 | 10 | 6 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/phone-pen-binder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/PhonePenBinder 6 | false 7 | Image 8 | 2021-10-09T23:24:20 9 | 10 | 2 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/sample-images.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | /SampleImages 6 | false 7 | Folder 8 | 2021-10-09T23:24:19 9 | 10 | 0 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/say-cheese.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/SayCheese 6 | false 7 | Image 8 | 2021-10-09T23:24:24 9 | 10 | 10 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/skrift-at-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/SkriftAtCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 5 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/triangle-table-chairs.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/TriangleTableChairs 6 | false 7 | Image 8 | 2021-10-09T23:24:21 9 | 10 | 3 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Media/umbracoffee-codegarden.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Sample Images 5 | /SampleImages/UmbracoffeeCodegarden 6 | false 7 | Image 8 | 2021-10-09T23:24:22 9 | 10 | 7 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/MediaTypes/folder.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Folder 5 | icon-folder 6 | icon-folder 7 | 8 | True 9 | False 10 | Nothing 11 | false 12 | 13 | 14 | 15 | 16 | Folder 17 | Image 18 | File 19 | umbracoMediaVideo 20 | umbracoMediaAudio 21 | umbracoMediaArticle 22 | umbracoMediaVectorGraphics 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/article.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/articlelist.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/betatemplate.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/contact.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/content.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/error.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/home.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/master.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/search.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/Templates/xmlsitemap.config: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/uSync/v9/usync.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 2021-10-09T23:29:14 4 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/wwwroot/clean-assets/css/search-images.css: -------------------------------------------------------------------------------- 1 | .post-preview.with-images { 2 | display: flex; 3 | flex-direction: row; 4 | margin: 5px; 5 | } 6 | 7 | .post-preview.with-images img{ 8 | margin:0 5px; 9 | } -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/wwwroot/clean-assets/js/scripts.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Clean Blog v6.0.7 (https://startbootstrap.com/theme/clean-blog) 3 | * Copyright 2013-2021 Start Bootstrap 4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-clean-blog/blob/master/LICENSE) 5 | */ 6 | window.addEventListener('DOMContentLoaded', () => { 7 | let scrollPos = 0; 8 | const mainNav = document.getElementById('mainNav'); 9 | const headerHeight = mainNav.clientHeight; 10 | window.addEventListener('scroll', function() { 11 | const currentTop = document.body.getBoundingClientRect().top * -1; 12 | if ( currentTop < scrollPos) { 13 | // Scrolling Up 14 | if (currentTop > 0 && mainNav.classList.contains('is-fixed')) { 15 | mainNav.classList.add('is-visible'); 16 | } else { 17 | mainNav.classList.remove('is-visible', 'is-fixed'); 18 | } 19 | } else { 20 | // Scrolling Down 21 | mainNav.classList.remove(['is-visible']); 22 | if (currentTop > headerHeight && !mainNav.classList.contains('is-fixed')) { 23 | mainNav.classList.add('is-fixed'); 24 | } 25 | } 26 | scrollPos = currentTop; 27 | }); 28 | }) 29 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/wwwroot/css/dropdownStyles.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /**umb_name:h2*/ 4 | h2 { 5 | font-size: 2.4em; 6 | } 7 | 8 | /**umb_name:h3*/ 9 | h3 { 10 | font-size: 2em; 11 | } 12 | 13 | /**umb_name:h4*/ 14 | h4 { 15 | font-size: 1.8em; 16 | } 17 | -------------------------------------------------------------------------------- /src/Site/DemoSiteV13/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matthew-Wise/feature-flagging-umbraco/03fbf1fb4d0fa48be0e0cd9175b91e667413c9e6/src/Site/DemoSiteV13/wwwroot/favicon.ico -------------------------------------------------------------------------------- /umbraco-marketplace.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://marketplace.umbraco.com/umbraco-marketplace-schema.json", 3 | "AlternatePackageNames": [], 4 | "AuthorDetails": { 5 | "Name": "Matthew Wise", 6 | "Description": "DotNet Dev and Umbraco MVP", 7 | "Url": "https://github.com/Matthew-Wise/feature-flagging-umbraco/", 8 | "ImageUrl": "https://github.com/Matthew-Wise.png", 9 | "Contributors": [ 10 | { 11 | "Name": "Lee Kelleher ", 12 | "Url": "https://github.com/leekelleher" 13 | } 14 | ] 15 | }, 16 | "Category": "Developer Tools", 17 | "DocumentationUrl": "https://github.com/Matthew-Wise/feature-flagging-umbraco", 18 | "LicenseTypes": [ 19 | "Free" 20 | ], 21 | "IssueTrackerUrl": "https://github.com/Matthew-Wise/feature-flagging-umbraco/issues", 22 | "PackageType": "Package", 23 | "Screenshots": [ 24 | { 25 | "ImageUrl": "https://raw.githubusercontent.com/Matthew-Wise/feature-flagging-umbraco/main/images/data-type-settings.png", 26 | "Caption": "Data Type prevalue settings" 27 | } 28 | ], 29 | "VideoUrl": "https://www.youtube.com/watch?v=MI8ALGLo4Mg" 30 | } 31 | --------------------------------------------------------------------------------