From 38ce036ef6b9905451bbaae283b4313931ea5425 Mon Sep 17 00:00:00 2001 From: Martin Griffiths Date: Wed, 17 Apr 2024 16:33:16 +0100 Subject: [PATCH] Added language variant/invariant support Tested with SQLite and MSSQL Added Umbraco 10 test site --- README.md | 9 +- Umbraco Tag Manager.TestSite.V10/.gitignore | 478 + .../App_Plugins/Contentment/Lang/da.xml | 41 + .../App_Plugins/Contentment/Lang/en.xml | 43 + .../App_Plugins/Contentment/Lang/es.xml | 41 + .../App_Plugins/Contentment/Lang/fr.xml | 41 + .../App_Plugins/Contentment/Lang/nl.xml | 41 + .../App_Plugins/Contentment/Lang/pt.xml | 41 + .../App_Plugins/Contentment/Lang/sv.xml | 41 + .../backoffice/contentment/index.html | 105 + .../backoffice/contentment/kilroy.svg | 10 + .../backoffice/contentment/lee-was-here.svg | 12 + .../backoffice/icons/icon-contentment.svg | 9 + .../backoffice/icons/icon-facebook.svg | 1 + .../backoffice/icons/icon-github.svg | 1 + .../backoffice/icons/icon-instagram.svg | 1 + .../backoffice/icons/icon-linkedin.svg | 1 + .../backoffice/icons/icon-mastodon.svg | 1 + .../backoffice/icons/icon-twitter.svg | 1 + .../backoffice/icons/icon-youtube.svg | 1 + .../Contentment/components/blocks-editor.html | 58 + .../Contentment/components/cards-editor.html | 57 + .../Contentment/components/list-editor.html | 29 + .../Contentment/components/stack-editor.html | 56 + .../App_Plugins/Contentment/contentment.css | 1 + .../App_Plugins/Contentment/contentment.js | 1 + .../Contentment/editors/_empty.html | 1 + .../Contentment/editors/_json-editor.html | 35 + .../Contentment/editors/buttons.html | 12 + .../editors/cascading-dropdown-list.html | 19 + .../Contentment/editors/checkbox-list.html | 40 + .../Contentment/editors/code-editor.html | 3 + .../editors/configuration-editor.html | 15 + .../editors/configuration-editor.inline.html | 17 + .../editors/configuration-editor.overlay.html | 105 + .../editors/content-blocks.blueprint.html | 20 + .../Contentment/editors/content-blocks.html | 19 + .../editors/content-blocks.overlay.html | 138 + .../Contentment/editors/content-cards.html | 19 + .../Contentment/editors/content-list.html | 19 + .../Contentment/editors/content-source.html | 74 + .../Contentment/editors/content-stack.html | 19 + .../Contentment/editors/data-list.editor.html | 48 + .../editors/data-list.preview.html | 59 + .../editors/data-source.preview.html | 50 + .../Contentment/editors/data-table.html | 41 + .../editors/dictionary-picker.html | 14 + .../Contentment/editors/dropdown-list.html | 10 + .../Contentment/editors/editor-notes.html | 7 + .../Contentment/editors/icon-picker.html | 31 + .../Contentment/editors/item-picker.html | 15 + .../editors/item-picker.overlay.html | 119 + .../Contentment/editors/macro-picker.html | 15 + .../Contentment/editors/notes.html | 1 + .../Contentment/editors/number-input.html | 13 + .../editors/radio-button-list.html | 21 + .../editors/readonly-node-preview.html | 3 + .../Contentment/editors/render-macro.html | 11 + .../Contentment/editors/social-links.html | 42 + .../editors/social-links.overlay.html | 15 + .../App_Plugins/Contentment/editors/tags.html | 26 + .../Contentment/editors/templated-list.html | 12 + .../Contentment/editors/text-input.html | 36 + .../Contentment/editors/textbox-list.html | 22 + .../App_Plugins/Contentment/package.manifest | 6 + .../render/ContentBlockPreview.cshtml | 10 + .../Contentment/render/_ViewImports.cshtml | 1 + .../App_Plugins/TagList/package.manifest | 29 + .../App_Plugins/TagList/taglist.resource.js | 8 + .../TagList/taglisteditor.controller.js | 9 + .../App_Plugins/TagList/taglisteditor.html | 11 + .../TagManagerTree/create-group.html | 19 + .../backoffice/TagManagerTree/create.html | 30 + .../backoffice/TagManagerTree/delete.html | 17 + .../backoffice/TagManagerTree/edit.html | 121 + .../backoffice/TagManagerTree/group.html | 31 + .../TagManager/backoffice/css/tagManager.css | 36 + .../backoffice/dashboards/dashboard.html | 29 + .../propertyEditor/dropdownFlexible.html | 16 + .../scripts/tagManager.create.controller.js | 108 + .../tagManager.createGroup.controller.js | 86 + .../scripts/tagManager.delete.controller.js | 98 + .../tagManager.dropdownFlexible.controller.js | 32 + .../scripts/tagManager.edit.controller.js | 332 + .../scripts/tagManager.group.controller.js | 174 + .../backoffice/scripts/tagManager.resource.js | 34 + .../App_Plugins/TagManager/lang/en-GB.xml | 10 + .../App_Plugins/TagManager/lang/en-US.xml | 10 + .../App_Plugins/TagManager/lang/en.xml | 10 + .../App_Plugins/TagManager/package.manifest | 21 + ...o.Community.TagManager.TestSite.V10.csproj | 48 + Umbraco Tag Manager.TestSite.V10/Program.cs | 19 + .../Properties/launchSettings.json | 29 + Umbraco Tag Manager.TestSite.V10/Startup.cs | 65 + .../Views/Author.cshtml | 30 + .../Views/AuthorList.cshtml | 12 + .../Views/Components/Contact/Default.cshtml | 26 + .../Components/Pagination/Default.cshtml | 48 + .../Views/Partials/authors.cshtml | 55 + .../Views/Partials/blockgrid/area.cshtml | 10 + .../Views/Partials/blockgrid/areas.cshtml | 13 + .../Views/Partials/blockgrid/default.cshtml | 11 + .../Views/Partials/blockgrid/items.cshtml | 36 + .../Components/codeSnippetRow.cshtml | 30 + .../blocklist/Components/iconLinkRow.cshtml | 15 + .../Components/imageCarouselRow.cshtml | 57 + .../blocklist/Components/imageRow.cshtml | 26 + .../Components/latestArticlesRow.cshtml | 76 + .../blocklist/Components/richTextRow.cshtml | 20 + .../blocklist/Components/videoRow.cshtml | 29 + .../Views/Partials/blocklist/default.cshtml | 13 + .../Views/Partials/footer.cshtml | 24 + .../Partials/grid/bootstrap3-fluid.cshtml | 106 + .../Views/Partials/grid/bootstrap3.cshtml | 112 + .../Views/Partials/grid/editors/base.cshtml | 27 + .../Views/Partials/grid/editors/embed.cshtml | 11 + .../Views/Partials/grid/editors/macro.cshtml | 15 + .../Views/Partials/grid/editors/media.cshtml | 64 + .../Views/Partials/grid/editors/rte.cshtml | 13 + .../Partials/grid/editors/textstring.cshtml | 22 + .../Views/Partials/mainNavigation.cshtml | 30 + .../Views/Partials/metaData.cshtml | 44 + .../Views/Partials/pageHeader.cshtml | 48 + .../Views/Partials/xmlSitemap.cshtml | 32 + .../Views/_ViewImports.cshtml | 9 + .../Views/article.cshtml | 23 + .../Views/articleList.cshtml | 23 + .../Views/contact.cshtml | 44 + .../Views/content.cshtml | 21 + .../Views/error.cshtml | 20 + .../Views/home.cshtml | 23 + .../Views/master.cshtml | 33 + .../Views/search.cshtml | 71 + .../Views/xMLSitemap.cshtml | 6 + .../appsettings.Development.json | 44 + .../appsettings.json | 27 + .../uSync/v9/Content/about.config | 122 + .../uSync/v9/Content/authors.config | 52 + .../uSync/v9/Content/blog.config | 88 + .../uSync/v9/Content/categories.config | 26 + .../uSync/v9/Content/community.config | 125 + .../v9/Content/community_fa0pue2k.config | 16 + .../uSync/v9/Content/conferences.config | 154 + .../v9/Content/conferences_dpraan01.config | 16 + .../uSync/v9/Content/contact.config | 65 + .../uSync/v9/Content/error.config | 83 + .../uSync/v9/Content/features-1.config | 2 + .../uSync/v9/Content/features-new.config | 289 + .../uSync/v9/Content/features.config | 299 + .../uSync/v9/Content/home.config | 269 + ...n-the-umbraco-community-on-mastodon.config | 100 + .../uSync/v9/Content/meetups.config | 125 + .../uSync/v9/Content/meetups_fthd5e2w.config | 16 + .../uSync/v9/Content/paul-seal.config | 85 + .../v9/Content/podcasts-and-videos.config | 222 + .../uSync/v9/Content/podcasts.config | 16 + .../uSync/v9/Content/popular-blogs.config | 125 + .../uSync/v9/Content/resources.config | 16 + .../uSync/v9/Content/search.config | 44 + .../uSync/v9/Content/test.config | 2 + .../uSync/v9/Content/test_mgebztva.config | 60 + .../uSync/v9/Content/umbraco.config | 16 + .../uSync/v9/Content/videos.config | 16 + .../uSync/v9/Content/xmlsitemap.config | 26 + .../uSync/v9/Content/youtube-tutorials.config | 180 + .../uSync/v9/ContentTypes/article.config | 35 + .../v9/ContentTypes/articlecontrols.config | 82 + .../uSync/v9/ContentTypes/articlelist.config | 36 + .../uSync/v9/ContentTypes/author.config | 33 + .../uSync/v9/ContentTypes/authorlist.config | 35 + .../uSync/v9/ContentTypes/category.config | 25 + .../uSync/v9/ContentTypes/categorylist.config | 29 + .../v9/ContentTypes/codesnippetrow.config | 66 + .../codesnippetrowsettings.config | 28 + .../uSync/v9/ContentTypes/contact.config | 33 + .../ContentTypes/contactformcontrols.config | 89 + .../uSync/v9/ContentTypes/content.config | 74 + .../v9/ContentTypes/contentcontrols.config | 50 + .../uSync/v9/ContentTypes/error.config | 33 + .../v9/ContentTypes/footercontrols.config | 50 + .../v9/ContentTypes/headercontrols.config | 66 + .../uSync/v9/ContentTypes/hideproperty.config | 50 + .../uSync/v9/ContentTypes/home.config | 42 + .../uSync/v9/ContentTypes/iconlinkrow.config | 66 + .../ContentTypes/iconlinkrowsettings.config | 27 + .../v9/ContentTypes/imagecarouselrow.config | 50 + .../imagecarouselrowsettings.config | 28 + .../uSync/v9/ContentTypes/imagerow.config | 66 + .../v9/ContentTypes/imagerowsettings.config | 28 + .../v9/ContentTypes/latestarticlesrow.config | 82 + .../latestarticlesrowsettings.config | 28 + .../v9/ContentTypes/listpagesettings.config | 50 + .../v9/ContentTypes/mainimagecontrols.config | 50 + .../uSync/v9/ContentTypes/richtextrow.config | 50 + .../ContentTypes/richtextrowsettings.config | 28 + .../uSync/v9/ContentTypes/search.config | 32 + .../uSync/v9/ContentTypes/seocontrols.config | 82 + .../v9/ContentTypes/spacingproperties.config | 169 + .../uSync/v9/ContentTypes/videorow.config | 66 + .../v9/ContentTypes/videorowsettings.config | 28 + .../v9/ContentTypes/visibilitycontrols.config | 82 + .../uSync/v9/ContentTypes/xmlsitemap.config | 29 + .../uSync/v9/DataTypes/ApprovedColor.config | 12 + .../v9/DataTypes/BlockListIconList.config | 32 + .../v9/DataTypes/BlockListMainContent.config | 92 + .../uSync/v9/DataTypes/CheckboxList.config | 11 + .../uSync/v9/DataTypes/ContentPicker.config | 13 + .../v9/DataTypes/ContentmentCodeEditor.config | 16 + .../uSync/v9/DataTypes/DataListAuthors.config | 31 + .../v9/DataTypes/DataListCategoryList.config | 27 + .../uSync/v9/DataTypes/DataListSpacing.config | 66 + .../DataTypes/DataListYesNoClearable.config | 42 + .../uSync/v9/DataTypes/DatePicker.config | 12 + .../v9/DataTypes/DatePickerWithTime.config | 12 + .../uSync/v9/DataTypes/Dropdown.config | 12 + .../v9/DataTypes/DropdownMultiple.config | 12 + .../uSync/v9/DataTypes/ImageCropper.config | 11 + .../v9/DataTypes/ImageMediaPicker.config | 20 + .../uSync/v9/DataTypes/LabelBigint.config | 11 + .../uSync/v9/DataTypes/LabelDatetime.config | 11 + .../uSync/v9/DataTypes/LabelDecimal.config | 11 + .../uSync/v9/DataTypes/LabelInteger.config | 11 + .../uSync/v9/DataTypes/LabelString.config | 11 + .../uSync/v9/DataTypes/LabelTime.config | 11 + .../uSync/v9/DataTypes/ListViewContent.config | 54 + .../uSync/v9/DataTypes/ListViewMedia.config | 54 + .../uSync/v9/DataTypes/ListViewMembers.config | 60 + .../uSync/v9/DataTypes/MediaPicker.config | 20 + .../v9/DataTypes/MediaPickerLegacy.config | 15 + .../v9/DataTypes/MediaPickerSVGImage.config | 20 + .../uSync/v9/DataTypes/MemberPicker.config | 9 + .../uSync/v9/DataTypes/MultiURLPicker.config | 15 + .../MultiUrlPickerSingleUrlPicker.config | 15 + .../DataTypes/MultipleImageMediaPicker.config | 20 + .../v9/DataTypes/MultipleMediaPicker.config | 20 + .../MultipleMediaPickerLegacy.config | 15 + .../uSync/v9/DataTypes/Numeric.config | 9 + .../uSync/v9/DataTypes/Radiobox.config | 11 + .../uSync/v9/DataTypes/RichtextEditor.config | 15 + .../uSync/v9/DataTypes/SingleUrlPicker.config | 15 + .../uSync/v9/DataTypes/SliderSpacing.config | 16 + .../uSync/v9/DataTypes/TagList.config | 11 + .../uSync/v9/DataTypes/Tags.config | 13 + .../uSync/v9/DataTypes/Tags1.config | 2 + .../uSync/v9/DataTypes/Textarea.config | 12 + .../uSync/v9/DataTypes/Textstring.config | 11 + .../uSync/v9/DataTypes/Truefalse.config | 14 + .../uSync/v9/DataTypes/UploadArticle.config | 24 + .../uSync/v9/DataTypes/UploadAudio.config | 28 + .../uSync/v9/DataTypes/UploadFile.config | 11 + .../v9/DataTypes/UploadVectorGraphics.config | 16 + .../uSync/v9/DataTypes/UploadVideo.config | 24 + .../uSync/v9/Dictionary/article.by.config | 7 + .../uSync/v9/Dictionary/article.on.config | 7 + .../uSync/v9/Dictionary/article.posted.config | 7 + .../v9/Dictionary/articlelist.viewall.config | 7 + .../v9/Dictionary/author.readmore.config | 7 + .../v9/Dictionary/contactform.email.config | 7 + .../v9/Dictionary/contactform.message.config | 7 + .../v9/Dictionary/contactform.name.config | 7 + .../v9/Dictionary/contactform.send.config | 7 + .../footer.copyrightstatement.config | 7 + .../Dictionary/footer.copyrighttitle.config | 7 + .../v9/Dictionary/navigation.menutitle.config | 7 + .../v9/Dictionary/navigation.sitename.config | 7 + .../uSync/v9/Dictionary/paging.next.config | 7 + .../uSync/v9/Dictionary/paging.of.config | 7 + .../uSync/v9/Dictionary/paging.page.config | 7 + .../v9/Dictionary/paging.previous.config | 7 + .../v9/Dictionary/search.placeholder.config | 7 + .../uSync/v9/Dictionary/search.results.config | 7 + .../v9/Dictionary/search.searchbutton.config | 7 + .../uSync/v9/Domains/1121_en-gb.config | 8 + .../Domains/localhost-44398-en_en-gb.config | 8 + .../v9/Domains/localhost-44398-fr_.config | 2 + .../Domains/localhost-44398-fr_en-gb.config | 2 + .../v9/Domains/localhost-44398-fr_fr.config | 8 + .../v9/Domains/localhost-44398_en-gb.config | 2 + .../localhost-44398_en-gb_dbrlnjf3.config | 2 + .../localhost-44398_en-gb_r1rpmviu.config | 8 + .../uSync/v9/Languages/en-gb.config | 7 + .../uSync/v9/Languages/en-us.config | 2 + .../uSync/v9/Languages/fr-fr.config | 2 + .../uSync/v9/Languages/fr.config | 8 + .../Media/24-days-people-at-codegarden.config | 20 + .../uSync/v9/Media/authors.config | 13 + .../uSync/v9/Media/authors_gknjjwq4.config | 20 + .../v9/Media/bluetooth-white-keyboard.config | 20 + .../v9/Media/candid-contributions.config | 20 + .../uSync/v9/Media/cc-paypal.config | 17 + .../uSync/v9/Media/chairs-lamps.config | 27 + .../uSync/v9/Media/codegarden-keynote.config | 20 + .../uSync/v9/Media/community-front-row.config | 20 + .../v9/Media/desktop-notebook-glasses.config | 20 + .../uSync/v9/Media/diary.config | 20 + .../uSync/v9/Media/discord.config | 17 + .../Media/first-timers-at-codegarden.config | 20 + .../uSync/v9/Media/friendly-chair.config | 20 + .../v9/Media/front-row-audience-smiles.config | 20 + .../uSync/v9/Media/github-alt.config | 17 + .../uSync/v9/Media/github.config | 17 + .../uSync/v9/Media/mastodon.config | 17 + .../uSync/v9/Media/mastodon_y5vnqpay.config | 20 + .../meetup-organizers-at-codegarden.config | 20 + .../uSync/v9/Media/package-manifest.config | 20 + .../uSync/v9/Media/paypal.config | 17 + .../uSync/v9/Media/phone-pen-binder.config | 20 + .../v9/Media/podcast-headphones-coffee.config | 20 + .../uSync/v9/Media/profile-pic-2023.config | 20 + .../uSync/v9/Media/sample-images.config | 13 + .../uSync/v9/Media/say-cheese.config | 20 + .../uSync/v9/Media/share-nodes.config | 17 + .../v9/Media/skrift-at-codegarden.config | 20 + .../uSync/v9/Media/social-icons.config | 13 + .../uSync/v9/Media/square-github.config | 17 + .../uSync/v9/Media/square-twitter.config | 17 + .../v9/Media/triangle-table-chairs.config | 20 + .../uSync/v9/Media/tutorials.config | 20 + .../uSync/v9/Media/twitter.config | 17 + .../uSync/v9/Media/umbraco.config | 17 + .../v9/Media/umbracoffee-codegarden.config | 20 + .../uSync/v9/MediaTypes/file.config | 71 + .../uSync/v9/MediaTypes/folder.config | 25 + .../uSync/v9/MediaTypes/image.config | 131 + .../v9/MediaTypes/umbracomediaarticle.config | 71 + .../v9/MediaTypes/umbracomediaaudio.config | 71 + .../umbracomediavectorgraphics.config | 71 + .../v9/MediaTypes/umbracomediavideo.config | 71 + .../uSync/v9/MemberTypes/member.config | 44 + .../uSync/v9/Templates/article.config | 5 + .../uSync/v9/Templates/articlelist.config | 5 + .../uSync/v9/Templates/author.config | 5 + .../uSync/v9/Templates/authorlist.config | 5 + .../uSync/v9/Templates/contact.config | 5 + .../uSync/v9/Templates/content.config | 5 + .../uSync/v9/Templates/error.config | 5 + .../uSync/v9/Templates/home.config | 5 + .../uSync/v9/Templates/master.config | 5 + .../uSync/v9/Templates/search.config | 5 + .../uSync/v9/Templates/xmlsitemap.config | 5 + .../uSync/v9/usync.config | 2 + .../clean-assets/css/highlightjs-copy.min.css | 1 + .../wwwroot/clean-assets/css/styles.css | 11348 ++++++++ .../clean-assets/css/swiffy-slider.min.css | 2 + .../wwwroot/clean-assets/css/vs2015.css | 112 + .../clean-assets/js/highlight.default.min.css | 9 + .../wwwroot/clean-assets/js/highlight.min.js | 1208 + .../clean-assets/js/highlightjs-copy.min.js | 1 + .../wwwroot/clean-assets/js/initHighlight.js | 2 + .../wwwroot/clean-assets/js/scripts.js | 59 + .../clean-assets/js/swiffy-slider.min.js | 2 + .../wwwroot/css/dropdownStyles.css | 16 + .../wwwroot/css/index.css | 23086 ++++++++++++++++ .../wwwroot/css/index.css.map | 1 + .../wwwroot/favicon.ico | Bin 0 -> 15406 bytes Umbraco Tag Manager.sln | 6 + .../App_Plugins/TagList/taglist.resource.js | 4 +- .../TagList/taglisteditor.controller.js | 4 +- .../backoffice/TagManagerTree/create.html | 10 + .../TagManager/backoffice/css/tagManager.css | 3 +- .../backoffice/dashboards/dashboard.html | 13 +- .../scripts/tagManager.create.controller.js | 15 +- .../tagManager.dropdownFlexible.controller.js | 8 +- .../scripts/tagManager.edit.controller.js | 1 + .../Composer/TagListComposer.cs | 64 +- .../Controllers/TagListApiController.cs | 4 +- .../Controllers/TagManagerTreeController.cs | 13 +- .../MediaWIzPackageMigrationPlan.cs | 17 - .../Migrations/TagManagerMigrationHelper.cs | 57 - Umbraco Tag Manager/Models/TagItem.cs | 9 +- Umbraco Tag Manager/Models/TaggedContent.cs | 3 + .../Our.Umbraco.Community.TagManager.csproj | 7 +- Umbraco Tag Manager/README.md | 9 +- .../Repositories/ITagListRepository.cs | 2 +- .../Implementation/TagListRepository.cs | 32 +- .../Implementation/TagManagerRepository.cs | 102 +- 376 files changed, 48289 insertions(+), 168 deletions(-) create mode 100644 Umbraco Tag Manager.TestSite.V10/.gitignore create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/da.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/en.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/es.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/fr.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/nl.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/pt.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/sv.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/index.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/kilroy.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/lee-was-here.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-contentment.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-facebook.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-github.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-instagram.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-linkedin.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-mastodon.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-twitter.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-youtube.svg create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/blocks-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/cards-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/list-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/stack-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.css create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_empty.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_json-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/buttons.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/cascading-dropdown-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/checkbox-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/code-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.inline.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.overlay.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.blueprint.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.overlay.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-cards.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-source.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-stack.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.editor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.preview.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-source.preview.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-table.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dictionary-picker.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dropdown-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/editor-notes.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/icon-picker.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.overlay.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/macro-picker.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/notes.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/number-input.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/radio-button-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/readonly-node-preview.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/render-macro.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.overlay.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/tags.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/templated-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/text-input.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/textbox-list.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/package.manifest create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/ContentBlockPreview.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/_ViewImports.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/package.manifest create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglist.resource.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create-group.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/delete.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/edit.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/group.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/css/tagManager.css create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/dashboards/dashboard.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/propertyEditor/dropdownFlexible.html create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.create.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.createGroup.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.delete.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.dropdownFlexible.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.edit.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.group.controller.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.resource.js create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-GB.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-US.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en.xml create mode 100644 Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/package.manifest create mode 100644 Umbraco Tag Manager.TestSite.V10/Our.Umbraco.Community.TagManager.TestSite.V10.csproj create mode 100644 Umbraco Tag Manager.TestSite.V10/Program.cs create mode 100644 Umbraco Tag Manager.TestSite.V10/Properties/launchSettings.json create mode 100644 Umbraco Tag Manager.TestSite.V10/Startup.cs create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Author.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/AuthorList.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Components/Contact/Default.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Components/Pagination/Default.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/authors.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/area.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/areas.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/default.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/items.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/codeSnippetRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/iconLinkRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageCarouselRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/latestArticlesRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/richTextRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/videoRow.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/default.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/footer.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3-fluid.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/base.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/embed.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/macro.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/media.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/rte.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/textstring.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/mainNavigation.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/metaData.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/pageHeader.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/Partials/xmlSitemap.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/_ViewImports.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/article.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/articleList.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/contact.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/content.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/error.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/home.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/master.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/search.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/Views/xMLSitemap.cshtml create mode 100644 Umbraco Tag Manager.TestSite.V10/appsettings.Development.json create mode 100644 Umbraco Tag Manager.TestSite.V10/appsettings.json create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/about.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/authors.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/blog.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/categories.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/community.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/community_fa0pue2k.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/conferences.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/conferences_dpraan01.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/contact.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/error.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/features-1.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/features-new.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/features.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/home.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/join-the-umbraco-community-on-mastodon.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/meetups.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/meetups_fthd5e2w.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/paul-seal.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/podcasts-and-videos.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/podcasts.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/popular-blogs.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/resources.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/search.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/test.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/test_mgebztva.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/umbraco.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/videos.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/xmlsitemap.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/youtube-tutorials.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/article.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/articlecontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/articlelist.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/author.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/authorlist.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/category.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/categorylist.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/codesnippetrow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/codesnippetrowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/contact.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/contactformcontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/content.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/contentcontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/error.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/footercontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/headercontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/hideproperty.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/home.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/iconlinkrow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/iconlinkrowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/imagecarouselrow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/imagecarouselrowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/imagerow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/imagerowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/latestarticlesrow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/latestarticlesrowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/listpagesettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/mainimagecontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/richtextrow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/richtextrowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/search.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/seocontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/spacingproperties.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/videorow.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/videorowsettings.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/visibilitycontrols.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/ContentTypes/xmlsitemap.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ApprovedColor.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/BlockListIconList.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/BlockListMainContent.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/CheckboxList.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ContentPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ContentmentCodeEditor.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DataListAuthors.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DataListCategoryList.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DataListSpacing.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DataListYesNoClearable.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DatePicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DatePickerWithTime.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Dropdown.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/DropdownMultiple.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ImageCropper.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ImageMediaPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelBigint.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelDatetime.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelDecimal.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelInteger.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelString.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/LabelTime.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ListViewContent.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ListViewMedia.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/ListViewMembers.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MediaPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MediaPickerLegacy.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MediaPickerSVGImage.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MemberPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MultiURLPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MultiUrlPickerSingleUrlPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MultipleImageMediaPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MultipleMediaPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/MultipleMediaPickerLegacy.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Numeric.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Radiobox.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/RichtextEditor.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/SingleUrlPicker.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/SliderSpacing.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/TagList.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Tags.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Tags1.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Textarea.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Textstring.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/Truefalse.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/UploadArticle.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/UploadAudio.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/UploadFile.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/UploadVectorGraphics.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/DataTypes/UploadVideo.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/article.by.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/article.on.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/article.posted.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/articlelist.viewall.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/author.readmore.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/contactform.email.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/contactform.message.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/contactform.name.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/contactform.send.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/footer.copyrightstatement.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/footer.copyrighttitle.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/navigation.menutitle.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/navigation.sitename.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/paging.next.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/paging.of.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/paging.page.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/paging.previous.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/search.placeholder.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/search.results.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Dictionary/search.searchbutton.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/1121_en-gb.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398-en_en-gb.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398-fr_.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398-fr_en-gb.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398-fr_fr.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398_en-gb.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398_en-gb_dbrlnjf3.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Domains/localhost-44398_en-gb_r1rpmviu.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Languages/en-gb.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Languages/en-us.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Languages/fr-fr.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Languages/fr.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/24-days-people-at-codegarden.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/authors.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/authors_gknjjwq4.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/bluetooth-white-keyboard.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/candid-contributions.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/cc-paypal.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/chairs-lamps.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/codegarden-keynote.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/community-front-row.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/desktop-notebook-glasses.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/diary.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/discord.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/first-timers-at-codegarden.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/friendly-chair.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/front-row-audience-smiles.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/github-alt.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/github.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/mastodon.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/mastodon_y5vnqpay.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/meetup-organizers-at-codegarden.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/package-manifest.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/paypal.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/phone-pen-binder.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/podcast-headphones-coffee.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/profile-pic-2023.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/sample-images.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/say-cheese.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/share-nodes.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/skrift-at-codegarden.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/social-icons.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/square-github.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/square-twitter.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/triangle-table-chairs.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/tutorials.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/twitter.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/umbraco.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Media/umbracoffee-codegarden.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/file.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/folder.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/image.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/umbracomediaarticle.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/umbracomediaaudio.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/umbracomediavectorgraphics.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MediaTypes/umbracomediavideo.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/MemberTypes/member.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/article.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/articlelist.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/author.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/authorlist.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/contact.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/content.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/error.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/home.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/master.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/search.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/Templates/xmlsitemap.config create mode 100644 Umbraco Tag Manager.TestSite.V10/uSync/v9/usync.config create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/css/highlightjs-copy.min.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/css/styles.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/css/swiffy-slider.min.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/css/vs2015.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/highlight.default.min.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/highlight.min.js create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/highlightjs-copy.min.js create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/initHighlight.js create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/scripts.js create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/clean-assets/js/swiffy-slider.min.js create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/css/dropdownStyles.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/css/index.css create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/css/index.css.map create mode 100644 Umbraco Tag Manager.TestSite.V10/wwwroot/favicon.ico delete mode 100644 Umbraco Tag Manager/Migrations/MediaWIzPackageMigrationPlan.cs delete mode 100644 Umbraco Tag Manager/Migrations/TagManagerMigrationHelper.cs diff --git a/README.md b/README.md index ca72405..786907d 100644 --- a/README.md +++ b/README.md @@ -12,20 +12,21 @@ Creates a tree view of all Tags that have been created by the Umbraco Tag Dataty The tree is split into separate branches for each tag Group created - useful if you run multiple blogs on your site, or have multiple Tag Groups defined in a site. 1. Create Tag Groups. -1. Ability to change Tags. -2. Ability to delete Tags, single & multiple. +1. Create and change Tags. +2. Delete Tags, single & multiple. 3. Indication of how many times the Tag is currently being used (number in brackets in Group overview). 4. Ability to merge Tags - useful in cases of spelling mistakes, cleaning up Tags, etc. 5. Links to content and media where Tag is used. +6. Language variant/invariant support. -## Tag List +## Tag List Property Editor Provides a multi select (read-only) list of all tags assigned to the group. 1. Choose one or more tags from the list 2. Works on Content and Media Doctypes. +3. Language variant/invariant support (Media is invariant only) 3. Tags are saved to the default internal and external indexes in CSV format. ## Roadmap -1. Language variant support 2. Content editors can add tags to a Tag List, enabled in a Pre-value switch. 3. Umbraco 14 support \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/.gitignore b/Umbraco Tag Manager.TestSite.V10/.gitignore new file mode 100644 index 0000000..d183720 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/.gitignore @@ -0,0 +1,478 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +## +## Umbraco CMS +## + +# JSON schema file for appsettings.json +appsettings-schema.json + +# Packages created from the backoffice (package.xml/package.zip) +/umbraco/Data/CreatedPackages/ + +# Temp folder containing Examine indexes, NuCache, MediaCache, etc. +/umbraco/Data/TEMP/ + +# SQLite database files +/umbraco/Data/*.sqlite.db +/umbraco/Data/*.sqlite.db-shm +/umbraco/Data/*.sqlite.db-wal + +# Log files +/umbraco/Logs/ + +# Media files +/wwwroot/media/ diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/da.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/da.xml new file mode 100644 index 0000000..a6a98b6 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/da.xml @@ -0,0 +1,41 @@ + + + + Chriztian Steinmeier + https://greystate.dk + + + Contentment + + + Er du sikker på, at du vil fjerne denne element? + Ja, fjern + + + Dette element er ikke længere tilgængeligt + Fjern venligst konfigurationen og vælg et andet element. + + + Vælg og konfigurer en visningstype + Vælg og konfigurer en elementtype + + Kopier alle blokke + Rediger værdi + + Kopier indholdselement + Opret indholdsskabelon... + + + Vælg og konfigurer en datakilde + Vælg og konfigurer en liste + Vælg og konfigurer en datakilde og en listeeditor, tak. + Vælg og konfigurer en datakilde, tak. + Vælg og konfigurer en liste, tak. + Datakilden returnerede ingen elementer til forhåndsvisning. + + Tjek alle + Fjern markeringen af ​​alle + + Indtast nøgleord (tryk på Enter efter hvert nøgleord)... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/en.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/en.xml new file mode 100644 index 0000000..1003bc6 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/en.xml @@ -0,0 +1,43 @@ + + + + Lee Kelleher + https://leekelleher.com + + + Contentment + + + Are you sure you want to remove this item? + Yes, remove + + + This item is no longer available + Please remove this configuration and select another item. + + + Select and configure a display mode + Select and configure an element type + + Copy all blocks + Edit raw value + + Copy content block + Create content template... + + + Data source + List editor + Select and configure a data source + Select and configure a list editor + Please select and configure a data source and list editor. + Please select and configure a data source. + Please select and configure a list editor. + The data source returned no items to preview. + + Check all + Uncheck all + + Type to select an item... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/es.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/es.xml new file mode 100644 index 0000000..84edcbf --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/es.xml @@ -0,0 +1,41 @@ + + + + Alex Freire + https://github.com/Happy-reindeer007 + + + Contentment + + + ¿Estás seguro de que quieres eliminar este elemento? + Sí, eliminar + + + Este elemento ya no está disponible + Por, favor, elimina esta configuración y selecciona otro elemento. + + + Selecciona y configura un modo de visualización + Selecciona y configura un tipo de elemento + + Copiar todos los bloques + Editar valor original + + Copiar bloque de contenido + Crear plantilla de contenido... + + + Selecciona y configura una fuente de datos + Selecciona y configura un editor de listas + Por favor, selecciona y configura una fuente de datos y un editor de listas. + Por favor, selecciona y configura una fuente de datos. + Por favor, selecciona y configura un editor de listas. + La fuente de datos no devolvió ningún elemento que previsualizar. + + Seleccionar todo + Deseleccionar todo + + Escribe para seleccionar un elemento... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/fr.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/fr.xml new file mode 100644 index 0000000..d059348 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/fr.xml @@ -0,0 +1,41 @@ + + + + Michaël Latouche + https://github.com/mikecp + + + Contentment + + + Etes-vous certain.e de vouloir supprimer cet élément? + Oui, supprimer + + + Cet élément n'est plus disponible + Veuillez supprimer cette configuration et sélectionner un autre élément. + + + Sélectionnez et configurez un mode d'affichage + Sélectionnez et configurez un type d'élément + + Copier tous les blocs + Modifier la valeur brute + + Copier le bloc de contenu + Créer un modèle de contenu... + + + Sélectionnez et configurez une source de données + Sélectionnez et configurez un éditeur de liste + Veuillez sélectionner et configurer une source de données et un éditeur de liste. + Veuillez sélectionner et configurer une source de données. + Veuillez sélectionner et configurer un éditeur de liste. + La source de données n'a retourné aucun élément à prévisualiser. + + Tout sélectionner + Tout désélectionner + + Ecrivez pour sélectionner un élément... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/nl.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/nl.xml new file mode 100644 index 0000000..d98bc3b --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/nl.xml @@ -0,0 +1,41 @@ + + + + Erik-Jan Westendorp + https://twitter.com/ewestendorp + + + Contentment + + + Weet je zeker dat je dit item wilt verwijderen? + Ja, verwijder + + + Dit item is niet langer beschikbaar + Verwijder deze configuratie en selecteer een ander item. + + + Selecteer en configureer een weergavemodus + Selecteer en configureer een elementtype + + Kopieer alle blokken + Ruwe waarde bewerken + + Inhoudsblok kopiëren + Inhoudssjabloon maken... + + + Selecteer en configureer een gegevensbron + Selecteer en configureer een lijsteditor + Selecteer en configureer een gegevensbron en lijsteditor. + Selecteer en configureer een gegevensbron. + Selecteer en configureer een lijsteditor. + De gegevensbron heeft geen items geretourneerd om te bekijken. + + Alles selecteren + Alles deselecteren + + Typ om een item te selecteren... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/pt.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/pt.xml new file mode 100644 index 0000000..0434610 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/pt.xml @@ -0,0 +1,41 @@ + + + + Renan Domingues, Leonardo Bottaro + https://github.com/RenanOD + + + Contentment + + + Tem certeza que deseja remover este item? + Sim, remover + + + Este item não está mais disponível + Por favor remova esta configuração e selecione outro item. + + + Selecionar e configurar o modo de exibição + Selecionar e configurar o tipo de elemento + + Copiar todos os blocos + Alterar o valor original + + Copiar o conteúdo do bloco + Criar modelo de conteúdo... + + + Selecionar e configurar uma origem de dados + Selecionar e configurar um editor de lista + Por favor selecione e configure uma origem de dados e um editor de lista. + Por favor selecione e configure uma origem de dados. + Por favor selecione e configure um editor de lista. + A fonte de dados não retornou nenhum item para visualização. + + Marcar todos + Desmarcar todos + + Digite para selecionar um item... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/sv.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/sv.xml new file mode 100644 index 0000000..db206fa --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/Lang/sv.xml @@ -0,0 +1,41 @@ + + + + Markus Johansson + https://twitter.com/markusjoha + + + Contentment + + + Är du säker på att du vill radera? + Ja, radera + + + Denna är inte längre tillgänglig + Vänligen radera denna konfiguration och välj en annan. + + + Välj och konfigurera visningsläge + Välj och konfigurera elementtyp + + Kopiera alla block + Redigera underliggande värde + + Kopiera innehållsblock + Skapa en innehållsmall... + + + Välj och konfigurera en data källa + Välj och konfiguera en list editor. + Vänligen välj och konfigurera en datakälla eller list editor. + Vänligen välj och konfigurera en datakälla. + Vänligen välj och konfigurera en list editor. + Datakällan returnerade inget resultat att visa. + + Markera alla + Avmarkera alla + + Skriv för att välja... + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/index.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/index.html new file mode 100644 index 0000000..38f1068 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/index.html @@ -0,0 +1,105 @@ + + +
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+ + + +
+ +
+ + + + + + + + +
+
+

Whilst Contentment is a free and open-source package, I have invested a huge amount of time and effort into its product design, development and maintenance. If you enjoy using these powerful property-editors and want to see me continue my efforts with more quality editors, please consider supporting my development with a GitHub sponsorship.

+

I'd like to say heartfelt thank you to all my existing sponsors, I appreciate your support.

+
+
+ +
+
+
+
+ + + + + + + +
+
Telemetry
+

By default, the package sends telemetry data about which property-editors are being used (from Contentment only). For more details about the data being captured and transparency on the analysis, please visit leekelleher.com/umbraco/contentment/telemetry.

+

If you would prefer to opt-out and disable the telemetry feature, you can find a code snippet on the telemetry documentation page.

+
+
+
Telemetry
+

The telemetry feature has been disabled. 🤐

+
+ +
+ +
+
Tree dashboard
+

If you would like to remove this page and tree item from the Settings section, you can find a code snippet on the tree dashboard documentation page.

+
+ +
+
+ +
+ +
+ + + + + + +
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+ +
+ +
+ +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/kilroy.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/kilroy.svg new file mode 100644 index 0000000..60b95c5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/kilroy.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/lee-was-here.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/lee-was-here.svg new file mode 100644 index 0000000..bae77c7 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/contentment/lee-was-here.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-contentment.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-contentment.svg new file mode 100644 index 0000000..9e0afbf --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-contentment.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-facebook.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-facebook.svg new file mode 100644 index 0000000..a73a432 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-github.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-github.svg new file mode 100644 index 0000000..039f217 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-instagram.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-instagram.svg new file mode 100644 index 0000000..2b58df4 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-linkedin.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-linkedin.svg new file mode 100644 index 0000000..9a52af2 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-mastodon.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-mastodon.svg new file mode 100644 index 0000000..4746752 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-twitter.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-twitter.svg new file mode 100644 index 0000000..c13d476 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-youtube.svg b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-youtube.svg new file mode 100644 index 0000000..4491540 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/backoffice/icons/icon-youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/blocks-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/blocks-editor.html new file mode 100644 index 0000000..f1392f2 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/blocks-editor.html @@ -0,0 +1,58 @@ + + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+
+
+ +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/cards-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/cards-editor.html new file mode 100644 index 0000000..943d2fe --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/cards-editor.html @@ -0,0 +1,57 @@ + + +
+
+
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/list-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/list-editor.html new file mode 100644 index 0000000..d0eea3a --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/list-editor.html @@ -0,0 +1,29 @@ + + +
+
+ + +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/stack-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/stack-editor.html new file mode 100644 index 0000000..fada08e --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/components/stack-editor.html @@ -0,0 +1,56 @@ + + +
+
+
+ +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ +
+
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.css b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.css new file mode 100644 index 0000000..ce465f9 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.css @@ -0,0 +1 @@ +.contentment.lk-buttons .umb-button{margin-bottom:5px}.contentment.lk-buttons .umb-button--selected .umb-button__button{background-color:#f5c1bc}.contentment.lk-buttons .umb-button__button{padding-left:20px;padding-right:20px}.contentment.lk-buttons .umb-button__button[disabled]{opacity:.5}.contentment.umb-checkboxlist ul.toggle-all{margin-bottom:15px}.contentment.umb-checkboxlist ul li label{margin-bottom:8px}.contentment .umb-form-check__text .icon{padding-right:2px}.contentment .umb-form-check__text small{display:block;padding-top:0}.umb-editor--small .contentment .form-horizontal .umb-control-group .control-header{float:none;width:100%}.umb-editor--small .contentment .form-horizontal .controls{margin-left:0}.umb-editor--small .contentment .form-horizontal .control-label{float:none;width:100%}.umb-editor--small .contentment .form-horizontal .umb-readonlyvalue .alert{margin-bottom:10px}.lk-content-blocks__container{max-width:845px}.lk-content-blocks__block{display:flex;flex-direction:row;flex-wrap:nowrap;margin-bottom:10px}.lk-content-blocks__block .lk-content-blocks__preview{flex:1;position:relative}.lk-content-blocks__block .lk-content-blocks__preview:after{content:"";background:rgba(225,225,225,.5);border-radius:3px;box-shadow:0 1px 1px 0 rgba(33,33,66,.2);position:absolute;top:0;bottom:0;left:0;right:0;transition:opacity .12s}.lk-content-blocks__block .lk-content-blocks__preview:hover:after{opacity:.66}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--left{background-color:#fff;border-radius:3px;display:flex;flex-direction:row;font-size:12px;padding:0 5px;position:absolute;top:5px;left:5px;z-index:20}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--left .icon{padding-top:4px;padding-right:4px}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--default{text-align:center;padding:30px 10px 15px}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--default .icon{font-size:40px}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--default h5{font-size:14px}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--markup pre.error{margin:35px 10px 10px 10px}.lk-content-blocks__block .lk-content-blocks__preview .lk-content-blocks__preview--markup pre.error code{font-size:small;white-space:pre-wrap}.lk-content-blocks__block .lk-content-blocks__actions{flex:0 0 34px;padding:10px 0 0 7px;margin:0;list-style:none}.lk-content-blocks__block .lk-content-blocks__actions .lk-content-blocks__action--item .icon{color:#1b264f;font-size:18px;padding:5px 10px}.lk-content-blocks__block .lk-content-blocks__actions .lk-content-blocks__action--item .icon:hover{color:#2152a3}.lk-content-blocks__block .lk-content-blocks__actions .lk-content-blocks__action--item>button{background:none;border:none;font-size:18px;cursor:pointer;color:#162335;margin:0;padding:7px 0}.lk-content-blocks__block .lk-content-blocks__actions .umb-property-actions{position:relative;display:inline-block;float:none;margin:3px 0 0 7px}.lk-content-blocks__block .lk-content-blocks__actions .umb-property-actions .umb-property-actions__menu,.lk-content-blocks__block .lk-content-blocks__actions .umb-property-actions .umb-property-actions__menu-open-toggle{right:0}.lk-content-blocks__block .lk-content-blocks__actions .umb-property-actions__toggle{opacity:1;background-color:transparent}.lk-content-blocks__block .lk-content-blocks__actions .umb-property-actions__toggle:hover{background-color:#f9f6f5}.lk-content-blocks .umb-node-preview-add{margin-right:45px}.contentment button.lk-content-blocks__edit{background:transparent;border:none;position:absolute;top:0;bottom:0;left:0;width:100%;z-index:25}.contentment.umb-block-list .umb-block-list__wrapper{max-width:800px}.contentment .lk-data-list-item{max-width:770px;display:flex;align-items:center;padding:10px 15px;background:#f3f3f5;margin-bottom:1px}.contentment .lk-data-list-item:last-of-type{margin-bottom:0}.contentment .lk-data-list-item .lk-data-list-item__handle{font-size:14px;color:#d8d7d9;margin-right:15px}.contentment .lk-data-list-item .lk-data-list-item__icon{margin-right:1rem}.contentment .lk-data-list-item .lk-data-list-item__icon>button{border:1px solid #d8d7d9;background:#fff;font-size:30px;padding-top:5px;width:50px;height:50px}.contentment .lk-data-list-item .lk-data-list-item__text{flex:1;margin-right:1rem}.contentment .lk-data-list-item .lk-data-list-item__remove{position:relative;cursor:pointer}.contentment .lk-data-list-item .lk-data-list-item__remove>button:focus{outline:auto}.contentment .well.well--limit-width{max-width:760px}.contentment .well.well-small.well--limit-width{max-width:780px}.contentment .well.well-large.well--limit-width{max-width:760px}.contentment.umb-readonlyvalue.editor-note .umb-icon{padding:0 20px 0 10px;height:48px;width:48px}.contentment.umb-readonlyvalue.editor-note p:last-child{margin-bottom:.25rem}.contentment.umb-readonlyvalue.editor-note.alert-info>.umb-icon .color-black,.contentment.umb-readonlyvalue.editor-note.alert-success>.umb-icon .color-black,.contentment.umb-readonlyvalue.editor-note.alert-warning>.umb-icon .color-black,.contentment.umb-readonlyvalue.editor-note.alert-error>.umb-icon .color-black{color:#fff !important}.contentment.umb-readonlyvalue.editor-note h5{color:inherit}.umb-editor--infiniteMode .contentment.umb-readonlyvalue.editor-note .umb-icon{height:32px;width:32px}.contentment .lk-icon-picker-small{border:1px dashed #d8d7d9;color:#d8d7d9;display:inline-block;height:20px;padding:5px 0;text-align:center;width:30px}.contentment .lk-icon-picker-small:focus,.contentment .lk-icon-picker-small:hover{border-color:#2152a3;color:#2152a3;text-decoration:none}.contentment .lk-icon-picker-small i.color-black{color:#000}.contentment .umb-mediapicker .umb-sortable-thumbnails__wrapper>.icon{font-size:50px}.contentment .umb-mediapicker .umb-sortable-thumbnails__wrapper>small{text-align:center}.contentment.lk-overlay .umb-panel .form-search{margin-bottom:15px}.contentment .umb-card-grid .umb-card-grid-item{padding-top:20%;padding-bottom:20%}.contentment .umb-action-link .umb-checkmark{margin-right:15px;min-width:30px}.contentment .umb-action-link .menu-label{margin-left:15px;padding-left:0;white-space:normal}.contentment.lk-overlay .umb-action.-disabled{opacity:.5}.contentment.lk-overlay .umb-action.-disabled .umb-card-grid-item,.contentment.lk-overlay .umb-action.-disabled .umb-action-link,.contentment.lk-overlay .umb-action.-disabled .umb-checkmark{cursor:not-allowed}.contentment.lk-overlay .umb-action.-disabled .umb-checkmark:hover{border-color:#bbbabf;color:#1b264f}.contentment.lk-overlay .umb-action.-disabled .umb-checkmark.icon-check:before{content:""}.contentment.lk-overlay .umb-action:not(.-disabled) .umb-checkmark:not(.umb-checkmark--checked).icon-check:before{content:none}.contentment .umb-card-grid .alert{flex:none;font-size:inherit;text-align:inherit;width:100%;max-width:100%}.contentment.umb-readonlyvalue{max-width:100%;word-break:break-word}.umb-readonlyvalue details summary{cursor:pointer}.umb-readonlyvalue details summary+*{margin-top:.5rem}.umb-readonlyvalue .well{margin-bottom:10px}.umb-readonlyvalue .well blockquote p{font-size:16px;margin-bottom:10px}.umb-readonlyvalue .well hr{border-bottom:1px solid #e0e0e5;margin:15px 0}.contentment.umb-radiobuttons ul.unstyled li{margin-bottom:5px}.contentment .umb-tags .tag{user-select:text}.contentment .umb-tags .tag .icon{color:#fff !important}.contentment .umb-tags .tag .btn-reset{line-height:14px}.contentment .umb-tags .tag .icon-trash{bottom:0}.contentment.templated-list button.btn.disabled{cursor:not-allowed !important;opacity:.5}.contentment .text-input{width:100%;max-width:800px}.contentment .text-input.input-prepend .umb-textstring,.contentment .text-input.input-append .umb-textstring{width:calc(100% - 36px)}.contentment .text-input.input-prepend.input-append .umb-textstring{width:calc(100% - 72px)}.contentment .text-input .add-on:hover{border-color:#d8d7d9;color:#1b264f}[class].icon-fa{font-family:FontAwesome;text-align:center}.umb-tree-icon.icon-fa{width:20px}.alert-form a{color:#1b264f}.contentment .umb-box-content p{line-height:1.5rem}.contentment .umb-block-card ._\5fshowcase{background-color:rgba(0,0,0,.25);background-size:cover}.contentment .umb-block-card ._\5finfo ._\5fname,.contentment .umb-block-card ._\5finfo ._\5fsubname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.contentment .umb-block-card._\5f fade{opacity:.5}.contentment .umb-block-card ._\5f actions>button{padding-top:3px}.contentment .umb-block-card ._\5finfo ._\5fsubname{margin-right:16px}.umb-group-panel--hide{all:unset;background:none;box-shadow:none !important}.umb-group-panel--hide .umb-group-panel__header{display:none}.umb-group-panel--hide .umb-group-panel__content{padding:0}.umb-group-panel--hide .umb-box-content{padding:0} \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.js new file mode 100644 index 0000000..77251c2 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/contentment.js @@ -0,0 +1 @@ +angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.Buttons.Controller",["$scope",function(n){function u(){n.model.value=n.model.value||i.defaultValue;Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]);t.multiple=Object.toBoolean(i.enableMultiple);t.multiple===!1&&n.model.value.length>0&&n.model.value.splice(1);t.hideIcon=i.labelStyle==="text";t.hideName=i.labelStyle==="icon";t.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;t.size=i.size;t.defaultIcon=i.defaultIcon;t.iconExtras=(t.hideName===!1?" mr2 ":" mr0 ")+{s:"small",m:"medium",l:"large"}[i.size];t.items=[];i.items.forEach(i=>{var r=Object.assign({},i);r.selected=n.model.value.indexOf(r.value)>-1;t.items.push(r)});t.select=e;n.umbProperty&&(t.propertyActions=[],Object.toBoolean(i.allowClear)===!0&&t.propertyActions.push({labelKey:"buttons_clearSelection",icon:"trash",method:f}),t.propertyActions.length>0&&n.umbProperty.setPropertyActions(t.propertyActions))}function f(){n.model.value=[];t.items.forEach(n=>n.selected=!1);r()}function e(i){i.selected=i.selected===!1;n.model.value=[];t.items.forEach(r=>{t.multiple===!1&&(r.selected=r.value===i.value),r.selected&&n.model.value.push(r.value)});r()}function r(){n.propertyForm&&n.propertyForm.$setDirty()}var i=Object.assign({},{allowClear:0,defaultIcon:"icon-science",defaultValue:[],items:[],enableMultiple:0,labelStyle:"both",size:"m"},n.model.config),t=this;u()}]);angular.module("umbraco.filters").filter("formatBytes",function(){return function(n,t){if(n===0||t===undefined)return"0 Bytes";const i=parseInt(t.kilo)||1024,u=parseInt(t.decimals)||0,r=Math.floor(Math.log(n)/Math.log(i));return parseFloat((n/Math.pow(i,r)).toFixed(u))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][r]}});angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.CascadingDropdownList.Controller",["$scope","$q","$http",function(n,t,i){function f(){var h,f,s,o;if(n.model.value=n.model.value||u.defaultValue,r.dropdowns=[],u.apis.length>0){for(r.loading=!0,h=[],f=0;ff&&(r.loading=!0,e=u.apis[f].replace(/{(\d+)}/g,function(t,i){return typeof n.model.value[i]!="undefined"?n.model.value[i]:t}),i({method:"GET",url:e}).then(function(n){r.dropdowns[f]={options:n.data};r.loading=!1}));o()}function o(){n.propertyForm&&n.propertyForm.$setDirty()}if(!n.model.hasOwnProperty("contentTypeId")){var u=Object.assign({},{apis:[],defaultValue:[""]},n.model.config),r=this;f()}}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.CheckboxList.Controller",["$scope","localizationService",function(n,t){function f(){n.model.value=n.model.value||r.defaultValue;Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]);i.items=[];r.items.forEach(t=>{var r=Object.assign({},t);r.checked=n.model.value.indexOf(r.value)>-1;i.items.push(r)});i.showDescriptions=Object.toBoolean(r.showDescriptions);i.showIcons=Object.toBoolean(r.showIcons);i.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;i.changed=e;i.labelCheckAll="Check all";i.labelUncheckAll="Uncheck all";t.localizeMany(["contentment_checkboxListCheckAll","contentment_checkboxListUncheckAll"]).then(function(n){i.labelCheckAll=n[0];i.labelUncheckAll=n[1]});i.toggleAll=Object.toBoolean(r.checkAll);i.toggleAll&&(i.toggle=o,i.toggleChecked=i.items.every(n=>n.checked))}function e(){i.toggleChecked=i.items.every(n=>n.checked);n.model.value=[];i.items.forEach(t=>{t.checked&&n.model.value.push(t.value)});u()}function o(){n.model.value=[];i.items.forEach(t=>{t.disabled||(t.checked=i.toggleChecked,t.checked&&n.model.value.push(t.value))});u()}function u(){n.propertyForm&&n.propertyForm.$setDirty()}var r=Object.assign({},{items:[],checkAll:0,showDescriptions:0,showIcons:0,defaultValue:[]},n.model.config),i=this;f()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.CodeEditor.Controller",["$scope",function(n){function u(){i.cssClasses=n.model.labelOnTop?[]:["umb-property-editor--limit-width"];i.readonly=Object.toBoolean(t.readonly);i.options={autoFocus:!1,showGutter:Object.toBoolean(t.showGutter),useWrapMode:Object.toBoolean(t.useWrapMode),showInvisibles:Object.toBoolean(t.showInvisibles),showIndentGuides:Object.toBoolean(t.showIndentGuides),useSoftTabs:Object.toBoolean(t.useSoftTabs),showPrintMargin:Object.toBoolean(t.showPrintMargin),disableSearch:Object.toBoolean(t.disableSearch),theme:t.theme,mode:t.mode,firstLineNumber:t.firstLineNumber,advanced:{fontSize:t.fontSize,enableSnippets:Object.toBoolean(t.enableSnippets),enableBasicAutocompletion:Object.toBoolean(t.enableBasicAutocompletion),enableLiveAutocompletion:Object.toBoolean(t.enableLiveAutocompletion),minLines:t.minLines,maxLines:t.maxLines,wrap:Object.toBoolean(t.useWrapMode)}}}var r={showGutter:1,useWrapMode:1,showInvisibles:0,showIndentGuides:0,useSoftTabs:1,showPrintMargin:0,disableSearch:0,theme:"chrome",mode:"javascript",firstLineNumber:1,fontSize:"small",enableSnippets:0,enableBasicAutocompletion:0,enableLiveAutocompletion:0,readonly:0,minLines:undefined,maxLines:undefined},t=Object.assign({},r,n.model.config),i=this;u()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.ConfigurationEditorInline.Controller",["$scope","formHelper",function(n){function r(){t.editor=Object.assign({},i.editor);n.model.value=n.model.value||{key:t.editor.key,value:t.editor.defaultValues||{}};n.model.value.key!==t.editor.key&&(n.model.value.key=t.editor.key);t.editor.fields&&t.editor.fields.length>0&&t.editor.fields.forEach(t=>{t.alias=t.key,n.model.value.value.hasOwnProperty(t.key)&&(t.value=n.model.value.value[t.key])});n.$on("formSubmitting",function(){t.editor.fields&&t.editor.fields.length>0&&t.editor.fields.forEach(t=>{n.model.value.value[t.key]=t.value})})}var i=Object.assign({},{editor:{}},n.model.config),t=this;r()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.ConfigurationEditor.Controller",["$scope","$interpolate","$timeout","editorService","eventsService","localizationService","overlayService","Umbraco.Community.Contentment.Services.DevMode",function(n,t,i,r,u,f,e,o){function v(){n.model.value=n.model.value||[];Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]);n.model.value.forEach(n=>{n.hasOwnProperty("type")&&(n.key=n.type,delete n.type)});Number.isInteger(s.maxItems)===!1&&(s.maxItems=Number.parseInt(s.maxItems)||l.maxItems);s.itemLookup={};s.allowEdit={};s.expressions={};s.missingItem={};s.items.forEach(n=>{if(s.itemLookup.hasOwnProperty(n.key)===!1&&(s.itemLookup[n.key]=n),s.allowEdit.hasOwnProperty(n.key)===!1&&(s.allowEdit[n.key]=n.fields&&n.fields.length>0),s.expressions.hasOwnProperty(n.key)===!1&&(s.expressions[n.key]={},n.nameTemplate&&(s.expressions[n.key].name=t(n.nameTemplate)),n.descriptionTemplate&&(s.expressions[n.key].description=t(n.descriptionTemplate)),n.expressions))for(let[r,i]of Object.entries(n.expressions))i&&(s.expressions[n.key][r]=t(i))});f.localizeMany(["contentment_missingItemName","contentment_missingItemDescription"]).then(n=>{s.missingItem.name=n[0],s.missingItem.description=n[1],s.missingItem.icon="icon-alert"});h.allowAdd=s.maxItems===0||n.model.value.lengths.allowEdit[n.key];h.allowRemove=Object.toBoolean(s.allowRemove);h.allowSort=Object.toBoolean(s.disableSorting)===!1&&s.maxItems!==1;h.displayMode=s.displayMode||"list";h.sortableOptions={axis:"y",containment:"parent",cursor:"move",disabled:h.allowSort===!1,opacity:.7,scroll:!0,tolerance:"pointer",stop:()=>{c()}};h.addButtonLabelKey=s.addButtonLabelKey||"general_add";h.add=y;h.edit=p;h.populate=w;h.remove=b;h.propertyActions=[];Object.toBoolean(s.enableDevMode)&&h.propertyActions.push({labelKey:"contentment_editRawValue",icon:"brackets",method:()=>o.editValue(n.model,k)});i(()=>a(),100)}function y(){var t=Object.toBoolean(s.allowDuplicates)?s.items:s.items.filter(t=>n.model.value.some(n=>t.key===n.key)===!1);r.open({view:s.overlayView,size:s.items.length===1?s.items[0].overlaySize:"small",config:{mode:"select",autoSelect:s.items.length===1,label:n.model.label,items:t,enableFilter:Object.toBoolean(s.enableFilter),orderBy:s.orderBy,help:s.help,cacheKey:n.model.alias},value:{},submit:function(t){n.model.value.push(t);s.maxItems!==0&&n.model.value.length>=s.maxItems&&(h.allowAdd=!1);c();r.close()},close:function(){r.close()}})}function p(t){var i=n.model.value[t],u=s.itemLookup[i.key];r.open({view:s.overlayView,size:u.overlaySize,config:{mode:"edit",editor:u,cacheKey:n.model.alias},value:i,submit:function(i){n.model.value[t]=i;c();r.close()},close:function(){r.close()}})}function a(){u.emit("contentment.config-editor.model",n.model)}function w(n,t,i){var f="",r,u;return s.itemLookup.hasOwnProperty(n.key)===!1&&s.missingItem?s.missingItem[i]||i:(s.expressions.hasOwnProperty(n.key)===!0&&(r=s.expressions[n.key],r.hasOwnProperty(i)===!0&&(u=r[i],u&&(n.value.$index=t+1,f=u(n.value),delete n.value.$index))),f||s.itemLookup[n.key][i])}function b(t){f.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(function(i){e.open({title:i[1],content:i[0],closeButtonLabel:i[2],submitButtonLabel:i[3],submitButtonStyle:"danger",submit:function(){n.model.value.splice(t,1);(s.maxItems===0||n.model.value.length=s.maxItems?!1:!0;c()}function c(){n.propertyForm&&n.propertyForm.$setDirty();a()}var l={addButtonLabelKey:"general_add",allowDuplicates:0,allowRemove:1,disableSorting:0,displayMode:"list",enableDevMode:0,enableFilter:0,help:null,items:[],maxItems:0,orderBy:"name",overlayView:""},s=Object.assign({},l,n.model.config),h=this;v()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.Overlays.ConfigurationEditor.Controller",["$scope","formHelper",function(n){function e(){if(t.mode=i.mode,t.mode==="select")i.autoSelect&&i.items.length===1?u(i.items[0]):(t.title="Select "+i.label.toLowerCase()+"...",t.help=i.help,t.items=i.items,t.enableFilter=i.enableFilter,t.orderBy=i.orderBy,t.select=u,t.cacheKey=i.cacheKey);else if(t.mode==="edit"&&i.editor){var f=n.model.value||{key:"",value:{}};r(i.editor,f)}t.close=o}function r(i,r){i.overlaySize&&n.model.size!==i.overlaySize&&(n.model.size=i.overlaySize);r.value||(r.value={});t.title="Configure "+i.name;t.editor=Object.assign({},i);t.editor.fields&&t.editor.fields.length>0&&t.editor.fields.forEach(n=>{n.alias=n.key,n.value=r.value[n.key]});t.save=f}function u(n){Array.isArray(n.fields)&&n.fields.length>0?(t.mode="edit",r(n,{value:n.defaultValues||{}})):f(n)}function o(){n.model.close&&n.model.close()}function f(t){n.$broadcast("formSubmitting",{scope:n});var i={key:t.key,value:{}};t.fields&&t.fields.forEach(n=>{i.value[n.key]=n.value});n.model.submit&&n.model.submit(i)}var i=Object.assign({},{mode:"select",autoSelect:!0,label:"",items:[],editor:null,enableFilter:!1,orderBy:"name",help:null,cacheKey:null},n.model.config),t=this;e()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.ContentBlocks.Controller",["$scope","$q","$http","$interpolate","clipboardService","contentResource","editorService","editorState","localizationService","notificationsService","overlayService","umbRequestHelper","Umbraco.Community.Contentment.Services.DevMode",function(n,t,i,r,u,f,e,o,s,h,c,l,a){function nt(){v.currentPage=n.node||o.getCurrent();v.currentPageId=v.currentPage.id>0?v.currentPage.id:v.currentPage.parentId;v.currentPageId||(v.currentPageId=-1);n.model.value=n.model.value||[];n.model.value===""&&(n.model.value=[]);Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]);v.elementTypeScaffoldCache={};v.elementTypeLookup={};v.nameTemplates={};v.contentBlockTypes.forEach(n=>{v.elementTypeLookup[n.key]=n,v.nameTemplates[n.key]=r(n.nameTemplate||"Item {{ $index }}")});y.addButtonLabelKey=v.addButtonLabelKey||"grid_addElement";y.displayMode=v.displayMode;y.enablePreview=Object.toBoolean(v.enablePreview);y.allowAdd=v.maxItems===0||v.maxItems==="0"||n.model.value.lengthb();y.previews=[];y.blockActions=[];for(var t=0;tp(n)}),Object.toBoolean(v.allowCreateContentTemplate)===!0&&t.push({labelKey:"contentment_createContentTemplate",icon:"blueprint",method:()=>ft(n)}),t}function tt(){e.open({config:{elementTypes:v.contentBlockTypes,enableFilter:v.enableFilter,currentPage:v.currentPage,currentPageId:v.currentPageId},size:v.contentBlockTypes.length===1?v.contentBlockTypes[0].overlaySize:"small",value:null,view:v.overlayView,submit:function(t){n.model.value.push(t);var i=n.model.value.length-1;y.blockActions.push(g(i));w(i);v.maxItems!==0&&v.maxItems!=="0"&&n.model.value.length>=v.maxItems&&(y.allowAdd=!1);d();e.close()},close:function(){e.close()}})}function p(i){var e=n.model.value[i],r=v.elementTypeLookup[e.elementType],o=k(e,i),s=v.elementTypeScaffoldCache.hasOwnProperty(r.alias)===!1?f.getScaffold(v.currentPageId,r.alias):t.when(v.elementTypeScaffoldCache[r.alias]);s.then(n=>{var i,s,f,t;if(v.elementTypeScaffoldCache.hasOwnProperty(r.alias)===!1&&(v.elementTypeScaffoldCache[r.alias]=n),n.name=o,n.variants[0].name=o,e.value)for(i=0;i{n&&n.elementKey&&n.markup&&(y.previews[n.elementKey]={loading:!1,markup:n.markup})}))}}function b(){if(y.enablePreview===!0)for(var t=0;t{c.open({title:i[1],content:i[0],closeButtonLabel:i[2],submitButtonLabel:i[3],submitButtonStyle:"danger",submit:function(){n.model.value.splice(t,1);y.blockActions.pop();b();(v.maxItems===0||v.maxItems==="0"||n.model.value.length{var r=n.model.value[t],u=k(r,t),e=v.elementTypeLookup[r.elementType];c.open({disableBackdropClick:!0,title:s.tokenReplace(i[0],[u]).replace("","'").replace("<\/em>","'"),description:i[1],blueprintName:u,view:"/App_Plugins/Contentment/editors/content-blocks.blueprint.html",closeButtonLabel:i[4],submitButtonLabel:i[5],submitButtonStyle:"action",submit:function(n){delete n.error;n.submitButtonState="busy";var t={save:!0,name:n.blueprintName,tabs:[{properties:Object.entries(r.value).map(n=>({id:0,alias:n[0],value:n[1]}))}]},o={action:"saveNew",id:0,parentId:-1,contentTypeAlias:e.alias,expireDate:null,releaseDate:null,templateAlias:null,variants:[Object.assign({},t,{save:!0})]};f.saveBlueprint(o,!0,[],!1).then(t=>{n.submitButtonState="success",h.success(i[2],s.tokenReplace(i[3],[u])),e.blueprints.push({id:t.id,name:t.variants[0].name}),c.close()},t=>{n.submitButtonState="error",n.error=t.data.ModelState.Name[0]})},close:function(){c.close()}})})}function d(){n.propertyForm&&n.propertyForm.$setDirty()}var v=Object.assign({},{addButtonLabelKey:"grid_addElement",allowCopy:1,allowCreateContentTemplate:0,allowEdit:1,allowRemove:1,contentBlockTypes:[],disableSorting:0,displayMode:"blocks",enableDevMode:0,enableFilter:0,enablePreview:0,maxItems:0,overlayView:""},n.model.config),y=this;nt()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.Overlays.ContentBlocks.Controller",["$scope","blueprintConfig","clipboardService","contentResource",function(n,t,i,r){function h(){u.submit=y;u.close=p;u.contentNodeModel=f.currentPage||{variants:[]};f.elementType&&n.model.value?s(f.elementType,n.model.value):(u.mode="select",u.items=f.elementTypes,u.selectedElementType=null,u.clipboardItems=typeof i.retrieveDataOfType=="function"?i.retrieveDataOfType("elementType",f.elementTypes.map(n=>n.alias)):i.retriveDataOfType("elementType",f.elementTypes.map(n=>n.alias)),f.elementTypes.length>1||u.clipboardItems.length>0?(u.title="Add content",u.description="Select a content type...",u.icon="icon-page-add",u.selectBlueprint=!1,u.enableFilter=Object.toBoolean(f.enableFilter),u.select=o,u.paste=v,u.clearClipboard=c,u.prompt=!1,u.showPrompt=l,u.hidePrompt=a):f.elementTypes.length===1&&o(f.elementTypes[0]))}function c(){u.clipboardItems=[];i.clearEntriesOfType("elementType",f.elementTypes.map(n=>n.alias))}function l(){u.prompt=!0}function a(){u.prompt=!1}function o(n){n.blueprints&&n.blueprints.length>0?n.blueprints.length===1&&t.skipSelect?e(n,n.blueprints[0]):(u.title="Add content",u.description="Select a content blueprint...",u.icon="icon-blueprint",u.selectBlueprint=!0,u.selectedElementType=n,u.blueprintAllowBlank=t.allowBlank,u.create=e):e(n)}function e(t,i){n.model.size=t.overlaySize;u.mode="edit";u.loading=!0;u.title="Edit content";u.description=t.name;u.icon=t.icon;u.content={elementType:t.key,key:String.CreateGuid()};var e=i&&i.id>0?r.getBlueprintScaffold(f.currentPageId,i.id):r.getScaffold(f.currentPageId,t.alias);e.then(n=>{Object.assign(u.content,n.variants[0]),u.loading=!1})}function v(t){var e=f.elementTypes.find(n=>n.alias===t.contentTypeAlias),o,i,h,r,u;if(n.model.size=e.overlaySize,o={elementType:e.key,key:String.CreateGuid(),value:{}},t.variants.length>0)for(i=0;i{var i,e,r,f;if(t.value)for(i=0;i0)for(t=0;t{u(n),r.loading=!1})):r.node=null;r.showHelp=!1;r.showSearch=!1;r.pick=e;r.remove=o;r.show=s;r.hide=h;r.help=c;r.clear=l}function e(){t.treePicker({idType:"udi",section:"content",treeAlias:"content",multiPicker:!1,submit:function(i){var r=i.selection[0];u(r);n.model.value=r.udi;t.close()},close:function(){t.close()}})}function o(){n.model.value=null;r.node=null}function s(){r.showSearch=!0}function h(){r.showSearch=!1}function c(){r.showHelp=!r.showHelp}function l(){r.showSearch=!1;n.model.value=null}function u(n){r.node=n;i.getUrl(n.id,"Document").then(n=>{r.node.path=n})}var a=Object.assign({},{},n.model.config),r=this;f()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.DataList.Editor.Controller",["$scope","editorService","localizationService","overlayService","Umbraco.Community.Contentment.Services.DevMode",function(n,t,i,r,u){function l(){n.model.value=n.model.value||[];Number.isInteger(f.maxItems)===!1&&(f.maxItems=Number.parseInt(f.maxItems)||s.maxItems);f.confirmRemoval=Object.toBoolean(f.confirmRemoval);e.allowAdd=f.maxItems===0||n.model.value.lengtho()};e.notes=f.notes;e.add=a;e.blur=v;e.edit=h;e.open=y;e.remove=p;Object.toBoolean(f.enableDevMode)===!0&&n.umbProperty&&n.umbProperty.setPropertyActions([{labelKey:"contentment_editRawValue",icon:"brackets",method:h},{labelKey:"clipboard_labelForRemoveAllEntries",icon:"trash",method:()=>{n.model.value=[]}}])}function a(){e.focusName=e.hideIcon===!0;n.model.value.push({icon:f.defaultIcon,name:"",value:"",description:""});f.maxItems!==0&&n.model.value.length>=f.maxItems&&(e.allowAdd=!1);o()}function v(n){(n.name&&n.value==null||n.value==="")&&(n.value=n.name.toCamelCase())}function h(){u.editValue(n.model,()=>{})}function y(n){var i=n.icon.split(" ");t.iconPicker({icon:i[0],color:i[1],submit:function(i){n.icon=[i.icon,i.color].filter(n=>n).join(" ");e.focusName=!0;o();t.close()},close:function(){t.close()}})}function p(n){if(f.confirmRemoval===!0)i.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(t=>{r.open({title:t[1],content:t[0],closeButtonLabel:t[2],submitButtonLabel:t[3],submitButtonStyle:"danger",submit:function(){c(n);r.close()},close:function(){r.close()}})});else c(n)}function c(t){n.model.value.splice(t,1);(f.maxItems===0||n.model.value.length{u.tabs.forEach(n=>n.active=!1),u.activeTab=n.alias,n.active=!0};u.changeTab(u.tabs[0]);var t=[];t.push(i.on("contentment.config-editor.model",(n,t)=>{f[t.alias]=t.value,o()}));n.$on("$destroy",()=>{for(var n in t)i.unsubscribe(t[n])})}function o(){_.isEmpty(f.dataSource)===!1&&_.isEmpty(f.listEditor)===!1?(u.state="loading",u.property=null,r.resourcePromise(t.post("backoffice/Contentment/DataListApi/GetPreview",f),"Failed to retrieve data list preview.").then(n=>{u.property=n,u.state=n.config.items&&n.config.items.length>0?"loaded":"noItems",u.tabs[1].label="Data source items ("+n.config.items.length+")"})):u.state=_.isEmpty(f.dataSource)===!1?"dataSourceConfigured":_.isEmpty(f.listEditor)===!1?"listEditorConfigured":"init"}var f=Object.assign({alias:n.model.alias},n.model.config),u=this;e()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.DataListSource.Preview.Controller",["$scope","$http","eventsService","umbRequestHelper",function(n,t,i,r){function e(){u.property={};u.state="loading";u.tabs=[{label:"Data source items",alias:"dataSource",active:!1},{label:"JSON",alias:"rawJson",active:!1}];u.changeTab=n=>{u.tabs.forEach(n=>n.active=!1),u.activeTab=n.alias,n.active=!0};u.changeTab(u.tabs[0]);var t=[];t.push(i.on("contentment.config-editor.model",(n,t)=>{f[t.alias]=t.value,o()}));n.$on("$destroy",()=>{for(var n in t)i.unsubscribe(t[n])})}function o(){_.isEmpty(f.dataSource)===!1?(u.state="loading",u.items=null,r.resourcePromise(t.post("backoffice/Contentment/DataListApi/GetDataSourceItems",f),"Failed to retrieve data source items.").then(n=>{u.items=n.config.items,u.state=u.items&&u.items.length>0?"loaded":"noItems",u.tabs[0].label="Data source items ("+u.items.length+")"})):u.state="init"}var f=Object.assign({},n.model.config),u=this;e()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.DataTable.Controller",["$scope","Umbraco.Community.Contentment.Services.DevMode",function(n,t){function e(){n.model.value=n.model.value||[];Number.isInteger(r.maxItems)===!1&&(r.maxItems=Number.parseInt(r.maxItems)||f.maxItems);i.headings=r.fields.map(n=>n.label);i.items=[];n.model.value.forEach((t,u)=>{var f=[];r.fields.forEach((i,r)=>{f.push(Object.assign({alias:[n.model.alias,u,r].join("_"),value:t[i.key]},i))});i.items.push(f)});i.styleTable={"max-width":Object.toBoolean(r.restrictWidth)?"800px":"100%","background-color":"#f6f4f4"};i.styleButton=Object.toBoolean(r.restrictWidth)?{}:{"max-width":"100%"};i.usePrevalueEditors=Object.toBoolean(r.usePrevalueEditors)?!0:null;i.allowAdd=r.maxItems===0||i.items.length tr",opacity:.7,scroll:!0,tolerance:"pointer",stop:()=>u()};i.showPrompt=c;i.hidePrompt=l;i.add=o;i.remove=h;n.umbProperty&&n.umbProperty.setPropertyActions([{labelKey:"contentment_editRawValue",icon:"brackets",method:function(){t.editValue(n.model,()=>{})}},{labelKey:"clipboard_labelForRemoveAllEntries",icon:"trash",method:function(){s()}}])}function o(){i.items.push(angular.copy(r.fields));r.maxItems!==0&&i.items.length>=r.maxItems&&(i.allowAdd=!1);u()}function s(){i.items=[];n.model.value=[];u()}function h(n){i.items.splice(n,1);(r.maxItems===0||i.items.length{var i={};t.forEach(n=>{i[n.key]=n.value});n.model.value.push(i)})});n.$on("$destroy",()=>a());e()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.DictionaryPicker.Controller",["$scope","entityResource","editorService",function(n,t,i){function o(){n.model.value=n.model.value||[];Number.isInteger(r.maxItems)===!1&&(r.maxItems=Number.parseInt(r.maxItems)||f.maxItems);u.addButtonLabelKey=r.addButtonLabelKey||"general_add";u.defaultIcon="icon-book-alt";u.displayMode="list";u.allowAdd=r.maxItems===0||r.maxItems==="0"||n.model.value.length=r.maxItems&&(u.allowAdd=!1);e();i.close()},close:function(){i.close()}})}function h(t){n.model.value.splice(t,1);(r.maxItems===0||n.model.value.length0&&(n.model.value=t.items[0].value);t.showEmpty=i.showEmpty===!0&&t.items.some(t=>t.value===n.model.value);t.htmlAttributes=i.htmlAttributes;t.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;t.change=u}function u(){t.showEmpty=i.showEmpty===!0&&t.items.some(t=>t.value===n.model.value)}var i=Object.assign({},{items:[],allowEmpty:1,defaultValue:"",htmlAttributes:[]},n.model.config),t=this;r()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.EditorNotes.Controller",["$scope",function(n){function r(){i.alertType=t.alertType;i.icon=t.icon;i.heading=t.heading;i.message=t.message;i.hidePropertyGroup=n.model.hasOwnProperty("contentTypeId")===!1&&Object.toBoolean(t.hidePropertyGroup)}var t=Object.assign({},{hidePropertyGroup:0},n.model.config),i=this;r()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.IconPicker.Controller",["$scope","editorService",function(n,t){function f(){n.model.value=n.model.value||r.defaultIcon;Array.isArray(r.size)===!0&&(r.size=r.size[0]);i.label=n.model.value.replace(" ","
");i.size=r.size;i.allowAdd=n.model.value==="";i.pick=e;i.remove=o}function e(){var f=n.model.value.split(" "),e={icon:f[0],color:f[1],hideColors:Object.toBoolean(r.hideColors),submit:function(r){n.model.value=[r.icon,r.color].filter(n=>n).join(" ");i.label=n.model.value.replace(" ","
");i.allowAdd=!1;u();t.close()},close:function(){t.close()}};t.iconPicker(e)}function o(){n.model.value="";i.label="";i.allowAdd=!0;u()}function u(){n.propertyForm&&n.propertyForm.$setDirty()}var r=Object.assign({},{defaultIcon:"",hideColors:0,size:"large"},n.model.config),i=this;f()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.ItemPicker.Controller",["$scope","editorService","focusService","localizationService","overlayService",function(n,t,i,r,u){function l(){if(n.model.value=n.model.value||f.defaultValue,Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]),Number.isInteger(f.maxItems)===!1&&(f.maxItems=Number.parseInt(f.maxItems)||h.maxItems),Array.isArray(f.overlaySize)===!0&&(f.overlaySize=f.overlaySize[0]),f.confirmRemoval=Object.toBoolean(f.confirmRemoval),f.enableMultiple=Object.toBoolean(f.enableMultiple)&&f.maxItems!==1,e.defaultIcon=f.defaultIcon,e.displayMode=f.displayMode||"list",e.allowAdd=f.maxItems===0||n.model.value.length{n.model.value=e.items.map(n=>n.value)},e.items=[],n.model.value.length>0&&f.items.length>0){var t=[];n.model.value.forEach(n=>{var i=f.items.find(t=>t.value===n);i?e.items.push(Object.assign({},i)):t.push(n)});t.length>0&&(n.model.value=_.difference(n.model.value,t),(f.maxItems===0||n.model.value.length0&&n.umbProperty.setPropertyActions(e.propertyActions))}function a(){i.rememberFocus();var r=Object.toBoolean(f.allowDuplicates)?f.items:f.items.filter(n=>e.items.some(t=>n.value===t.value)===!1);t.open({config:{title:"Choose...",enableFilter:Object.toBoolean(f.enableFilter),enableMultiple:f.enableMultiple,defaultIcon:f.defaultIcon,items:r,listType:f.listType,orderBy:f.overlayOrderBy,maxItems:f.maxItems===0?f.maxItems:f.maxItems-e.items.length},view:f.overlayView,size:f.overlaySize||"small",submit:function(i){i.forEach(t=>{e.items.push(angular.copy(t)),n.model.value.push(t.value)});f.maxItems!==0&&n.model.value.length>=f.maxItems&&(e.allowAdd=!1);t.close();o();s()},close:function(){t.close();s()}})}function v(){e.items=[];n.model.value=[];o()}function y(n){if(i.rememberFocus(),f.confirmRemoval===!0)r.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(t=>{u.open({title:t[1],content:t[0],closeButtonLabel:t[2],submitButtonLabel:t[3],submitButtonStyle:"danger",submit:function(){c(n);u.close()},close:function(){u.close();s()}})});else c(n)}function c(t){e.items.splice(t,1);n.model.value.splice(t,1);(f.maxItems===0||n.model.value.lengthn.selected===!0).length,t.allowSubmit=t.itemCount>0&&(i.maxItems===0||t.itemCount<=i.maxItems)):(n.model.value=u,r()))}function r(){if(n.model.submit){var i=[];t.enableMultiple===!0?t.items.forEach(n=>{n.selected&&(delete n.selected,i.push(n))}):i.push(n.model.value);n.model.submit(i)}}function e(){n.model.close&&n.model.close()}var i=Object.assign({},{title:"Select...",enableFilter:!1,enableMultiple:!1,defaultIcon:"icon-science",items:[],listType:"grid",orderBy:"name",maxItems:0},n.model.config),t=this;u()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.MacroPicker.Controller",["$scope","entityResource","editorService","localizationService","overlayService",function(n,t,i,r,u){function s(){n.model.value=n.model.value||[];e.defaultIcon="icon-settings-alt";e.displayMode="list";e.allowAdd=f.maxItems===0||f.maxItems==="0"||n.model.value.length[n.alias,n.value]))});f.maxItems!==0&&f.maxItems!=="0"&&n.model.value.length>=f.maxItems&&(e.allowAdd=!1);o();i.close()},close:function(){i.close()}})}function c(t){var r=n.model.value[t];i.macroPicker({dialogData:{richTextEditor:!1,macroData:{macroAlias:r.alias,macroParamsDictionary:r.params},allowedMacros:f.availableMacros},submit:function(r){n.model.value[t]={udi:r.selectedMacro.udi,name:r.selectedMacro.name,alias:r.selectedMacro.alias,params:_.object(_.map(r.macroParams,n=>[n.alias,n.value]))};o();i.close()},close:function(){i.close()}})}function l(t){r.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(i=>{u.open({title:i[1],content:i[0],closeButtonLabel:i[2],submitButtonLabel:i[3],submitButtonStyle:"danger",submit:function(){n.model.value.splice(t,1);(f.maxItems===0||f.maxItems==="0"||n.model.value.lengthi.editValue(n.model,e)}]);u.currentPage=n.node||t.getCurrent();u.hidePropertyGroup=n.model.hasOwnProperty("contentTypeId")===!1&&Object.toBoolean(r.hidePropertyGroup)}function e(){n.propertyForm&&n.propertyForm.$setDirty()}var r=Object.assign({},{enableDevMode:0,hidePropertyGroup:0},n.model.config),u=this;f()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.NumberInput.Controller",["$scope",function(n){function u(){n.model.value!==0&&(n.model.value=n.model.value||t.defaultValue);i.maximum=t.maximum;i.minimum=t.minimum;i.step=t.step;i.pattern=t.umbracoDataValueType==="DECIMAL"?"[-0-9]+([,.][0-9]+)?":"[-0-9]*";i.placeholderText=t.placeholderText;var u={s:"umb-property-editor-tiny",m:"umb-property-editor-small",l:"umb-property-editor--limit-width",xl:"umb-property-editor"};i.sizeClass=u[t.size]||u[r.size];i.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias}var r={placeholderText:null,defaultValue:null,maximum:null,minimum:null,size:"s",step:null,umbracoDataValueType:"INT"},t=Object.assign({},r,n.model.config),i=this;u()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.RadioButtonList.Controller",["$scope",function(n){function r(){n.model.value=n.model.value||i.defaultValue;Array.isArray(n.model.value)&&(n.model.value=n.model.value[0]);t.items=i.items.slice();t.showDescriptions=Object.toBoolean(i.showDescriptions);t.showIcons=Object.toBoolean(i.showIcons);t.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;n.umbProperty&&(t.propertyActions=[],Object.toBoolean(i.allowClear)===!0&&t.propertyActions.push({labelKey:"buttons_clearSelection",icon:"trash",method:()=>{n.model.value=i.defaultValue,setDirty()}}),t.propertyActions.length>0&&n.umbProperty.setPropertyActions(t.propertyActions))}var i=Object.assign({},{allowClear:0,items:[],showDescriptions:0,showIcons:0,defaultValue:""},n.model.config),t=this;r()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.RenderMacro.Controller",["$scope","$routeParams","macroResource",function(n,t,i){function f(){if(r.loading=!0,Array.isArray(n.model.config.macro)&&n.model.config.macro.length>0){var f=n.model.config.macro[0];Object.assign(f.params,{__propertyAlias:n.model.alias,__propertyLabel:n.model.label,__propertyCulture:n.model.culture,__propertyDataTypeKey:n.model.dataTypeKey,__propertyDescription:n.model.description,__propertyHideLabel:n.model.hideLabel});i.getMacroResultAsHtmlForEditor(f.alias,t.id,f.params).then(n=>{r.html=n,r.loading=!1},n=>{r.error={title:n.data.Message+" "+n.errorMsg,message:n.data.ExceptionMessage},r.loading=!1})}else r.error={title:"Macro not configured",message:"This data type has not been configured. Please ensure that a macro has been selected."},r.loading=!1;r.hidePropertyGroup=Object.toBoolean(u.hidePropertyGroup)}if(!n.model.hasOwnProperty("contentTypeId")){var u=Object.assign({},{hidePropertyGroup:0},n.model.config),r=this;f()}}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.SocialLinks.Controller",["$scope","editorService","localizationService","overlayService","Umbraco.Community.Contentment.Services.DevMode",function(n,t,i,r,u){function a(){n.model.value=n.model.value||[];Number.isInteger(f.maxItems)===!1&&(f.maxItems=Number.parseInt(f.maxItems)||h.maxItems);f.confirmRemoval=Object.toBoolean(f.confirmRemoval);e.allowAdd=f.maxItems===0||n.model.value.length=f.maxItems&&(e.allowAdd=!1);o()}function c(){u.editValue(n.model,function(){})}function y(n){var t=f.lookup[n];return t&&t.icon?t.icon:f.defaultIcon}function p(n){var t=f.lookup[n];return t&&t.backgroundColor&&t.iconColor?{backgroundColor:t.backgroundColor,color:t.iconColor,borderRadius:"5px",paddingTop:0}:{backgroundColor:f.defaultBackgroundColor,color:f.defaultIconColor,borderRadius:"5px",borderStyle:"dashed",paddingTop:0}}function l(t){var i=n.model.value[t];r.open({title:"Select a social network...",config:{items:f.networks},position:"center",size:"small",view:f.overlayView,value:i,hideSubmitButton:!0,submit:function(n){i.network=n.network;i.name===""&&(i.name=n.name);i.url===""&&(i.url=n.url);e.focusIdx=t;o();r.close()},close:function(){i.network===""&&s(t);r.close()}})}function w(n){if(f.confirmRemoval===!0)i.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(function(t){r.open({title:t[1],content:t[0],closeButtonLabel:t[2],submitButtonLabel:t[3],submitButtonStyle:"danger",submit:function(){s(n);r.close()},close:function(){r.close()}})});else s(n)}function s(t){n.model.value.splice(t,1);(f.maxItems===0||n.model.value.length{t.model.value.forEach(n=>{var t=s.items.find(t=>t.value===n);t&&o.items.push(Object.assign({},t))});o.loading=!1;var n=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("name","value"),queryTokenizer:Bloodhound.tokenizers.whitespace,initialize:!1,local:s.items.filter(n=>!n.disabled),identify:n=>n.value});n.initialize().then(()=>{var t={display:"name",minLength:0,source:(t,i)=>{t&&t.length>0?n.search(t,i):i(n.all())}};o.editor=i.find("input.typeahead").typeahead({hint:!0,highlight:!0,minLength:1},t).bind("typeahead:select",h).bind("typeahead:autocomplete",h)})});t.umbProperty&&(o.propertyActions=[],Object.toBoolean(s.allowClear)===!0&&o.propertyActions.push({labelKey:"buttons_clearSelection",icon:"trash",method:y}),o.propertyActions.length>0&&t.umbProperty.setPropertyActions(o.propertyActions))}function h(i,u){r.safeApply(n,function(){o.items.push(Object.assign({},u));t.model.value.push(u.value);o.editor.typeahead("val","");c()})}function y(){o.items=[];t.model.value=[];c()}function p(n){var t,i;n.keyCode==13&&(t=o.editor.data("ttTypeahead"),t&&t.menu&&t.menu.isOpen()===!0&&(i=t.menu.getActiveSelectable()||t.menu.getTopSelectable(),t.menu.trigger("selectableClicked",i),n.preventDefault()))}function w(n,t){(n.keyCode===8||n.keyCode===46)&&l(t)}function l(n){if(s.confirmRemoval===!0)f.localizeMany(["contentment_removeItemMessage","general_remove","general_cancel","contentment_removeItemButton"]).then(t=>{e.open({title:t[1],content:t[0],closeButtonLabel:t[2],submitButtonLabel:t[3],submitButtonStyle:"danger",submit:function(){a(n);e.close()},close:function(){e.close()}})});else a(n)}function a(n){o.items.splice(n,1);t.model.value.splice(n,1);c()}function c(){t.propertyForm&&t.propertyForm.$setDirty()}var s=Object.assign({},{allowClear:0,confirmRemoval:0,defaultValue:[],items:[],showIcons:0},t.model.config),o=this;v()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.TemplatedList.Controller",["$scope",function(n){function u(){n.model.value=n.model.value||i.defaultValue;Array.isArray(n.model.value)===!1&&(n.model.value=[n.model.value]);t.multiple=Object.toBoolean(i.enableMultiple);t.multiple===!1&&n.model.value.length>0&&n.model.value.splice(1);t.items=[];i.items.forEach(i=>{var r=Object.assign({},i);r.selected=n.model.value.indexOf(r.value)>-1;t.items.push(r)});t.htmlAttributes=i.htmlAttributes;t.template=i.template;t.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;t.select=e;n.umbProperty&&(t.propertyActions=[],Object.toBoolean(i.allowClear)===!0&&t.propertyActions.push({labelKey:"buttons_clearSelection",icon:"trash",method:f}),t.propertyActions.length>0&&n.umbProperty.setPropertyActions(t.propertyActions))}function f(){n.model.value=[];t.items.forEach(n=>n.selected=!1);r()}function e(i){i.selected=i.selected===!1;n.model.value=[];t.items.forEach(r=>{t.multiple===!1&&(r.selected=r.value===i.value),r.selected&&n.model.value.push(r.value)});r()}function r(){n.propertyForm&&n.propertyForm.$setDirty()}var i=Object.assign({},{allowClear:0,defaultValue:[],enableMultiple:0,items:[],template:"{{ item.name }}",htmlAttributes:[]},n.model.config),t=this;u()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.TextboxList.Controller",["$scope","Umbraco.Community.Contentment.Services.DevMode",function(n,t){function u(){n.model.value=n.model.value||{};Utilities.isObject(n.model.value)===!1&&(n.model.value={});i.keys=[];i.icons={};i.names={};i.inputTypes=["color","email","number","password","tel","text","url"];i.hideIcon=r.labelStyle==="text";i.hideName=r.labelStyle==="icon";i.defaultIcon=r.defaultIcon;r.items.forEach(t=>{i.keys.push(t.value),i.names[t.value]=t.name,i.hideIcon===!1&&(i.icons[t.value]=(t.icon||r.defaultIcon)+" medium"),n.model.value.hasOwnProperty(t.value)===!1&&(n.model.value[t.value]="")});Object.keys(n.model.value).forEach(t=>{i.keys.indexOf(t)===-1&&delete n.model.value[t]});i.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;n.umbProperty&&(i.propertyActions=[],Object.toBoolean(r.enableDevMode)===!0&&i.propertyActions.push({labelKey:"contentment_editRawValue",icon:"brackets",method:()=>t.editValue(n.model,function(){})}),i.propertyActions.length>0&&n.umbProperty.setPropertyActions(i.propertyActions))}var r=Object.assign({},{defaultIcon:"icon-science",items:[],labelStyle:"both",enableDevMode:0},n.model.config),i=this;u()}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.TextInput.Controller",["$scope",function(n){function r(){n.model.value=n.model.value||i.defaultValue;Array.isArray(n.model.value)&&(n.model.value=n.model.value.join(", "));t.inputType=i.inputType;t.autoComplete=Object.toBoolean(i.autocomplete)?"on":"off";t.spellCheck=Object.toBoolean(i.spellcheck)?"true":"false";t.placeholderText=i.placeholderText;t.maxChars=parseInt(0+i.maxChars);t.maxCharsThreshold=t.maxChars*.8;t.prepend=i.prepend;t.append=i.append;t.uniqueId=n.model.hasOwnProperty("dataTypeKey")?[n.model.alias,n.model.dataTypeKey.substring(0,8)].join("-"):n.model.alias;i.items&&i.items.length>0&&(t.dataList=i.items,t.dataListId="dl-"+t.uniqueId)}var i=Object.assign({},{items:[],inputType:"text",autocomplete:0,placeholderText:null,defaultValue:null,prepend:null,append:null,maxChars:500},n.model.config),t=this;r()}]),function(){"use strict";function n(n){return{bindings:{addButtonLabel:"@?",addButtonLabelKey:"0&&r.umbProperty.setPropertyActions(r.propertyActions);r.blockActions&&r.blockActions.length>0&&r.blockActions.forEach(function(n){n.forEach(function(n){i.localize(n.labelKey).then(function(t){n.label=t})})})}}],require:{propertyForm:"^form",umbProperty:"^"},template:"<\/ng-include>"}}angular.module("umbraco.directives").component("contentmentItemsEditor",n());angular.module("umbraco.directives").component("contentmentListEditor",n("list"));angular.module("umbraco.directives").component("contentmentStackEditor",n("stack"));angular.module("umbraco.directives").component("contentmentBlocksEditor",n("blocks"));angular.module("umbraco.directives").component("contentmentCardsEditor",n("cards"))}();angular.module("umbraco.services").factory("Umbraco.Community.Contentment.Services.DevMode",["$timeout","editorService",function(n,t){return{editValue:function(i,r){t.open({title:"Edit raw value",value:Utilities.toJson(i.value,!0),ace:{showGutter:!0,useWrapMode:!0,useSoftTabs:!0,theme:"chrome",mode:"javascript",advanced:{fontSize:"14px",wrap:!0},onLoad:function(t){n(()=>t.focus())}},view:"/App_Plugins/Contentment/editors/_json-editor.html",size:"medium",submit:function(n){i.value=Utilities.fromJson(n);r&&r();t.close()},close:function(){t.close()}})}}}]);angular.module("umbraco.directives").component("leeWasHere",{template:'Lee was here'});angular.module("umbraco.directives.html").directive("lkHtmlAttributes",[function(){return{restrict:"A",scope:{attributes:"&lkHtmlAttributes"},link:function(n,t){var i=n.attributes();Array.isArray(i)&&i.length>0&&i.forEach(n=>{n.name==="class"?t.addClass(n.value):t.attr(n.name,n.value)})}}}]);angular.module("umbraco.directives.html").directive("lkBindHtmlTemplate",["$compile",function(n){return{restrict:"A",replace:!0,link:function(t,i,r){t.$watch(function(n){return n.$eval(r.lkBindHtmlTemplate)},function(r){if(r){var u=n(r)(t);i.append(u)}})}}}]);angular.module("umbraco.directives.html").directive("lkHidePropertyGroup",[function(){return{restrict:"A",link:function(n,t,i){var u,f,r;if(i.lkHidePropertyGroup==="true"){if(u=t.closest(".umb-property-editor"),f=u.parent().closest(".umb-property-editor").length>0,f)return;r=t.closest(".umb-group-panel,.umb-box");r&&r.addClass("umb-group-panel--hide")}}}}]);angular.module("umbraco.filters").filter("lkNodeName",["$filter",function(n){return function(t){return Array.isArray(t)===!1?n("ncNodeName")(t):t.map(t=>n("ncNodeName")(t)).join(", ")}}]);angular.module("umbraco.filters").filter("lkGroupBy",[function(){return _.memoize((n,t)=>_.chain(n).sortBy(t).groupBy(t).value(),(n,t,i)=>[i,t,n.length].join("_"))}]);angular.module("umbraco").controller("Umbraco.Community.Contentment.Tree.Controller",["$scope","navigationService",function(n,t){function r(){const u="contentment";var r=Umbraco.Sys.ServerVariables.umbracoPlugins[u];i.title=r.name;i.version="v"+r.version;t.syncTree({tree:u,path:"-1"});n.$emit("$changeTitle",i.title);i.links=[{icon:"icon-fa fa-fw fa-book ",name:"Documentation",description:"How to use each of the property editors.",url:"https://github.com/leekelleher/umbraco-contentment/tree/master/docs"},{icon:"icon-fa fa-youtube",name:"Video demonstrations",description:"Demos, guides and tutorials on YouTube.",url:"https://www.youtube.com/playlist?list=PL8grlRt7-8oVULPYJpqido5QItRsJBt3M"},{icon:"icon-fa fa-fw fa-comments-o",name:"Support forum",description:"Ask for help, the community is your friend.",url:"https://our.umbraco.com/packages/backoffice-extensions/contentment/contentment-feedback/"},{icon:"icon-fa fa-fw fa-code-fork",name:"Source code",description:"See the code, all free and open-source.",url:"https://github.com/leekelleher/umbraco-contentment"},{icon:"icon-fa fa-fw fa-bug",name:"Issue tracker",description:"Found a bug? Suggest a feature? Let me know.",url:"https://github.com/leekelleher/umbraco-contentment/issues/new/choose"},{icon:"icon-fa fa-fw fa-id-card-o",name:"License",description:"Licensed under the Mozilla Public License.",url:"https://opensource.org/licenses/MPL-2.0"}];i.telemetryEnabled=r.telemetry===!0}var i=this;r()}]) \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_empty.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_empty.html new file mode 100644 index 0000000..1bfa827 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_empty.html @@ -0,0 +1 @@ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_json-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_json-editor.html new file mode 100644 index 0000000..7054ff3 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/_json-editor.html @@ -0,0 +1,35 @@ +
+ + + + + + + +
+ +
+ + + + + + + + + + +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/buttons.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/buttons.html new file mode 100644 index 0000000..3d36611 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/buttons.html @@ -0,0 +1,12 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/cascading-dropdown-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/cascading-dropdown-list.html new file mode 100644 index 0000000..4066f9f --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/cascading-dropdown-list.html @@ -0,0 +1,19 @@ +
+ +
+ +
+ +
+ + + +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/checkbox-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/checkbox-list.html new file mode 100644 index 0000000..c8a6c49 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/checkbox-list.html @@ -0,0 +1,40 @@ +
+
    +
  • + +
  • +
+
    +
  • + +
  • +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/code-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/code-editor.html new file mode 100644 index 0000000..362adee --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/code-editor.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.html new file mode 100644 index 0000000..7b9d812 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.inline.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.inline.html new file mode 100644 index 0000000..564c547 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.inline.html @@ -0,0 +1,17 @@ +
+ + +

Unable to find the editor for this configuration value.

+
+ + +

There are no fields for this item.

+
+ + + + + + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.overlay.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.overlay.html new file mode 100644 index 0000000..b9941f8 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/configuration-editor.overlay.html @@ -0,0 +1,105 @@ +
+ + + + + + + +
+ + + + + + + +
+
+
    +
  • + +
  • +
+
+ +
+ No items found for ''. +
+ +
+
+ +
+
+ +
+
+
+ + +

There are no items available to add.

+
+ +
+ +
+ + +

Unable to find the editor for this configuration value.

+
+ + +

There are no fields for this item.

+
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.blueprint.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.blueprint.html new file mode 100644 index 0000000..5909eac --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.blueprint.html @@ -0,0 +1,20 @@ +
+ +

+ +
+ +
+ + + + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.html new file mode 100644 index 0000000..2eaaf31 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.html @@ -0,0 +1,19 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.overlay.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.overlay.html new file mode 100644 index 0000000..ef8dc6c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-blocks.overlay.html @@ -0,0 +1,138 @@ +
+ + + +
+
+
+ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + +
    +
  • + +
  • +
  • + No items found for ''. +
  • +
+ +
    +
  • + +
  • +
  • + +
  • +
+ +
+
+ + + +
+ + + +
+
+ +
    +
  • + +
  • +
  • + No items found for ''. +
  • +
+
+
+ + +

There are no items available to add.

+
+ +
+ + + + + + + + + + + + + + + + + +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-cards.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-cards.html new file mode 100644 index 0000000..2eaaf31 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-cards.html @@ -0,0 +1,19 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-list.html new file mode 100644 index 0000000..2eaaf31 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-list.html @@ -0,0 +1,19 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-source.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-source.html new file mode 100644 index 0000000..752d86d --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-source.html @@ -0,0 +1,74 @@ +
+ +
+ + + +
+ +
+ +
+ + + + +
+ +
+ + + +
+ + + + +
+

Use an XPath query to set a start page. For a context-aware query, you can use one of the pre-defined placeholders.

+

Placeholders find the nearest published content ID and run the XPath query from there. For instance:

+
$site/newsListingPage
+

This query will try to get the current website page (at level 1), then find the first page of type `newsListingPage`.

+
+
Available placeholders:
+
$current - current page or closest ancestor.
+
$parent - parent page or closest ancestor.
+
$root - root page in the content tree.
+
$site - ancestor page located at level 1.
+
+
+

Please note, when using an XPath query, this data source will not work if used within a 'Nested Content' element type. This is a known issue. Please see GitHub issue #30 for details.

+
+
+
+ +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-stack.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-stack.html new file mode 100644 index 0000000..2eaaf31 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/content-stack.html @@ -0,0 +1,19 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.editor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.editor.html new file mode 100644 index 0000000..6067129 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.editor.html @@ -0,0 +1,48 @@ +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + +
+
+ +
+
+ +
+ +
+ +
+
+ + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.preview.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.preview.html new file mode 100644 index 0000000..c6e9a28 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-list.preview.html @@ -0,0 +1,59 @@ +
+
+
+ Please select and configure a data source and list editor. +
+
+ Please select and configure a list editor. +
+
+ Please select and configure a data source. +
+
+ +
+
+ The data source returned no items to preview. +
+
+ + + + +
+
+ +
+
+
+
+
+
+
Name
+
Value
+
Description
+
Enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{vm.property.config.items | json}} +
+
+
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-source.preview.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-source.preview.html new file mode 100644 index 0000000..cb81748 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-source.preview.html @@ -0,0 +1,50 @@ +
+
+
+ Please select and configure a data source. +
+
+ +
+
+ The data source returned no items to preview. +
+
+ + + + +
+
+
+
+
+
+
Name
+
Value
+
Description
+
Enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{vm.items | json}} +
+
+
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-table.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-table.html new file mode 100644 index 0000000..2aee6b5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/data-table.html @@ -0,0 +1,41 @@ +
+ + + + + + + + + + + + + + + +
{{heading}}
+ + + + +
+ + + +
+
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dictionary-picker.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dictionary-picker.html new file mode 100644 index 0000000..35a8e44 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dictionary-picker.html @@ -0,0 +1,14 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dropdown-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dropdown-list.html new file mode 100644 index 0000000..1a904a5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/dropdown-list.html @@ -0,0 +1,10 @@ +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/editor-notes.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/editor-notes.html new file mode 100644 index 0000000..1a60c9b --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/editor-notes.html @@ -0,0 +1,7 @@ +
+ +
+
+
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/icon-picker.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/icon-picker.html new file mode 100644 index 0000000..f66b424 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/icon-picker.html @@ -0,0 +1,31 @@ +
+
+
+
    +
  • + + +
    + + +
    +
  • +
  • + +
  • +
+
+
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.html new file mode 100644 index 0000000..c193c72 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.overlay.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.overlay.html new file mode 100644 index 0000000..86642bc --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/item-picker.overlay.html @@ -0,0 +1,119 @@ +
+ + + + + + + +
+ +
+ +
+ Too many items selected, please unselect {{vm.itemCount - vm.maxItems}} {{vm.itemCount - vm.maxItems === 1 ? 'item' : 'items'}}. +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ No items found for ''. +
+
+ + + +
    +
  • + +
  • +
  • + No items found for ''. +
  • +
+
+
+ + + +
    +
  • + +
  • +
  • + No items found for ''. +
  • +
+
+
+ + +

There are no items available to add.

+
+ +
+ + + + + + + + + + +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/macro-picker.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/macro-picker.html new file mode 100644 index 0000000..fd2baf8 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/macro-picker.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/notes.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/notes.html new file mode 100644 index 0000000..db66813 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/notes.html @@ -0,0 +1 @@ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/number-input.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/number-input.html new file mode 100644 index 0000000..e1168b6 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/number-input.html @@ -0,0 +1,13 @@ +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/radio-button-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/radio-button-list.html new file mode 100644 index 0000000..a57f16a --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/radio-button-list.html @@ -0,0 +1,21 @@ +
+
    +
  • + +
  • +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/readonly-node-preview.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/readonly-node-preview.html new file mode 100644 index 0000000..6eb7c63 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/readonly-node-preview.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/render-macro.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/render-macro.html new file mode 100644 index 0000000..40b92fb --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/render-macro.html @@ -0,0 +1,11 @@ +
+
+ +
+
+
+
+
+

+

+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.html new file mode 100644 index 0000000..4a89607 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.html @@ -0,0 +1,42 @@ +
+
+
+ + + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.overlay.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.overlay.html new file mode 100644 index 0000000..1ae57d8 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/social-links.overlay.html @@ -0,0 +1,15 @@ +
+
    +
  • + +
  • +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/tags.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/tags.html new file mode 100644 index 0000000..0db8bfb --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/tags.html @@ -0,0 +1,26 @@ +
+
+ +
+ + + + + + +
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/templated-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/templated-list.html new file mode 100644 index 0000000..389216c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/templated-list.html @@ -0,0 +1,12 @@ +
+
+ +
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/text-input.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/text-input.html new file mode 100644 index 0000000..a9b3178 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/text-input.html @@ -0,0 +1,36 @@ +
+
+ + + + + + + +
+
+

+ {{model.label}} + %0% characters left. +

+
+
+

+ {{model.label}} + Maximum %0% characters, %1% too many. +

+
+ + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/textbox-list.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/textbox-list.html new file mode 100644 index 0000000..f251071 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/editors/textbox-list.html @@ -0,0 +1,22 @@ +
+
+ +
+ +
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/package.manifest b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/package.manifest new file mode 100644 index 0000000..4043e81 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/package.manifest @@ -0,0 +1,6 @@ +{ + "name": "Contentment", + "version": "4.4.5", + "css": [ "~/App_Plugins/Contentment/contentment.css" ], + "javascript": [ "~/App_Plugins/Contentment/contentment.js" ] +} diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/ContentBlockPreview.cshtml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/ContentBlockPreview.cshtml new file mode 100644 index 0000000..5280753 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/ContentBlockPreview.cshtml @@ -0,0 +1,10 @@ +@* Copyright © 2019 Lee Kelleher. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. *@ +@inherits ContentBlockPreviewView +
+ +
@Model.Element.Key
+
+ diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/_ViewImports.cshtml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/_ViewImports.cshtml new file mode 100644 index 0000000..bc71ce9 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/Contentment/render/_ViewImports.cshtml @@ -0,0 +1 @@ +@using Umbraco.Cms.Web.Common.Views; diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/package.manifest b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/package.manifest new file mode 100644 index 0000000..a8da4af --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/package.manifest @@ -0,0 +1,29 @@ +{ + "propertyEditors": [ + { + "alias": "TagList", + "name": "Tag List", + "icon": "icon-list", + "group": "pickers", + "editor": { + "view": "~/App_Plugins/TagList/taglisteditor.html", + "valueType": "JSON" + }, + "prevalues": { + "fields": [ + { + "label": "Tag group name", + "description": "Enter the name of the parent tag", + "key": "group", + "view": "textstring" + } + ] + } + } + ], + // array of files we want to inject into the application on app_start + "javascript": [ + "~/App_Plugins/TagList/taglisteditor.controller.js", + "~/App_Plugins/TagList/taglist.resource.js" + ] +} diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglist.resource.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglist.resource.js new file mode 100644 index 0000000..428008a --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglist.resource.js @@ -0,0 +1,8 @@ +angular.module("umbraco.resources").factory("TagListResource", function ($http) { + return { + /* umbraco api call to get all tags by group */ + getTagsByGroup: function (group, culture) { + return $http.get("backoffice/Api/TagList/GetTagsByGroup/?group=" + group + "&culture=" + culture); + } + }; +}); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.controller.js new file mode 100644 index 0000000..78defa5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.controller.js @@ -0,0 +1,9 @@ +angular.module("umbraco").controller("TagListController", function ($scope, $routeParams, TagListResource) { + var vm = this; + vm.cmsTags = {}; + + /* get a complete list of tags for the selected "group" */ + TagListResource.getTagsByGroup($scope.model.config.group, $scope.model.culture).then(function (response) { + vm.cmsTags = response.data; + }); +}); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.html new file mode 100644 index 0000000..b718f8d --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagList/taglisteditor.html @@ -0,0 +1,11 @@ +
+ + + + + + +
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create-group.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create-group.html new file mode 100644 index 0000000..fc1c713 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create-group.html @@ -0,0 +1,19 @@ +
+ + + + + + + + + + + + + + + + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create.html new file mode 100644 index 0000000..d1b151e --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/create.html @@ -0,0 +1,30 @@ +
+ + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/delete.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/delete.html new file mode 100644 index 0000000..d305e03 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/delete.html @@ -0,0 +1,17 @@ +
+ + + + + Are you sure you want to delete this tag: {{cmsTags.tag}} ? + + + + + + + + + + +
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/edit.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/edit.html new file mode 100644 index 0000000..1cd68ea --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/edit.html @@ -0,0 +1,121 @@ +
+ + + + + + + + + + + + +
+ + +
no tags to merge
+ + + +
+
+
+
+ + +
+ + + + + + +
+
+
+ +
+
Name
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
No tagged content
+
+
+
+
+ + +
+ + + + + + +
+
+
+ +
+
Name
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
No tagged media
+
+
+
+
+
+ + + + + + +
+
+
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/group.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/group.html new file mode 100644 index 0000000..7ccfeea --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/TagManagerTree/group.html @@ -0,0 +1,31 @@ +
+ + + + + + + +
+ + {{ selectedTags.length }} of {{ tags.length }} selected + +
+
+ + + +
+
+
+ + + + + +
+
+
+
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/css/tagManager.css b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/css/tagManager.css new file mode 100644 index 0000000..1ac3888 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/css/tagManager.css @@ -0,0 +1,36 @@ +/*CSS for backoffice */ +.tag-cards-container { + display: grid; + flex-wrap: wrap; + gap: 12px; + width: 100%; + grid-template-columns: 1fr 1fr 1fr; +} + +.tag-card { + cursor: pointer !important; + margin: 0; +} + + .tag-card.selected { + outline-color: #3544b1; + outline-width: 3px; + outline-style: solid; + cursor: pointer !important; + } + +.tags-grid-container { + container-type: inline-size; +} + +@container (width < 80em) { + .tag-cards-container { + grid-template-columns: 1fr 1fr; + } +} + +@container (width < 60em) { + .tag-cards-container { + grid-template-columns: 1fr; + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/dashboards/dashboard.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/dashboards/dashboard.html new file mode 100644 index 0000000..b37d809 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/dashboards/dashboard.html @@ -0,0 +1,29 @@ + + +

Tag ALL the things!

+

Tag Manager features:

+
    +
  • Create Groups
  • +
  • Create Tags
  • +
  • Delete Tags - single and multiple
  • +
  • Rename Tags
  • +
  • Merge Tags
  • +
  • View Content and Media associations
  • +
  • Language Variant/Invariant support
  • +
+

Tag List Property Editor features:

+
    +
  • Can be used in Content and Media
  • +
  • Content editors pick from tags pre-defined in Tag Manager.
  • +
  • Tags are added to the internal and external Examine Indexes (in a simple CSV format).
  • +
  • Relationships are maintained for Content and Media and can be viewed in Tag Manager.
  • +
  • Language Variant/Invariant support in content
  • +
+

General features

+
    +
  • Umbraco 10, 12 & 13 support
  • +
  • SQLite & Microsoft SQL Server support
  • +
+
+
+ diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/propertyEditor/dropdownFlexible.html b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/propertyEditor/dropdownFlexible.html new file mode 100644 index 0000000..803ed8d --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/propertyEditor/dropdownFlexible.html @@ -0,0 +1,16 @@ +
+ + + + + + +
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.create.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.create.controller.js new file mode 100644 index 0000000..b4a4e9a --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.create.controller.js @@ -0,0 +1,108 @@ +(function () { + 'use strict'; + + function checkExistingTagName(tag, tagsFromGroup) { + var tagMatch = false; + Object.entries(tagsFromGroup).forEach(([key, value]) => { + if (tag === value.tag) { + tagMatch = true; + } + }); + return tagMatch; + } + + + + function createTag($scope, tagManagerResource, notificationsService, navigationService, appState, $location, $route, languageResource) { + + $scope.cmsTags = { + tag: "", + languages: {}, + languageId: null, + group: "" + }; + + $scope.change = function (lang) { + $scope.cmsTags.languageId = lang.id; + } + + languageResource.getAll() + .then(function (data) { + $scope.cmsTags.languages = data; + }); + + // gets node from menu state first and if null gets from tree state + var selectedMenu = appState.getMenuState("currentNode"); + + if (selectedMenu === null) { + var selectedNode = appState.getTreeState("selectedNode"); + $scope.cmsTags.group = selectedNode.name; + } + else { + $scope.cmsTags.group = selectedMenu.name; + } + + $scope.save = function (cmsTags) { + if (!cmsTags.tag) { + notificationsService.error("Error", "Tag name is required."); + return; + } + + // Fetch tags for a specific group from the server + tagManagerResource.getTagsByGroup(cmsTags.group).then(function (response) { + var existingTagName = checkExistingTagName(cmsTags.tag, response.data.tagsInGroup); + + if (existingTagName === false) { + tagManagerResource.createTag(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem saving the tag, please check the logs."); + return; + } + notificationsService.success("Success", "'" + cmsTags.tag + "' has been Created"); + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1", "tagGroup-" + cmsTags.group, response.data], forceReload: false }); + navigationService.hideMenu(); + $location.path('/TagManager/TagManagerTree/edit/' + response.data); + $route.reload(); + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + else { + notificationsService.error("Error", "A tag with name already exists"); + } + + + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + }; + + $scope.cancel = function (cmsTags) { + if ($location.path() === "/TagManager/TagManagerTree/create") { + $location.path('/TagManager/TagManagerTree/group/' + cmsTags.group); + $route.reload(); + } + else { + navigationService.hideMenu(); + } + } + } + + angular.module('umbraco').controller('tagManager.create.controller', createTag); +})(); diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.createGroup.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.createGroup.controller.js new file mode 100644 index 0000000..b183d39 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.createGroup.controller.js @@ -0,0 +1,86 @@ +(function () { + 'use strict'; + + function checkExistingGroupName(group, groups) { + var tagMatch = false; + Object.entries(groups).forEach(([key, value]) => { + if (group === value.group) { + tagMatch = true; + } + }); + return tagMatch; + } + + function createGroup($scope, tagManagerResource, notificationsService, navigationService, $location, $route) { + + var vm = this; + + $scope.cmsTags = { + group: "" + }; + + $scope.save = function (cmsTags) { + if (!cmsTags.group) { + notificationsService.error("Error", "Group name is required."); + return; + } + + tagManagerResource.getTagGroups(cmsTags.group).then(function (response) { + var existingGroupName = checkExistingGroupName(cmsTags.group, response.data); + + if (existingGroupName === false) { + tagManagerResource.createGroup(cmsTags.group).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem saving the group, please check the logs."); + return; + } + notificationsService.success("Success", "'" + cmsTags.group + "' has been created"); + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1"], forceReload: false }).then(function (syncArgs) { + navigationService.reloadNode(syncArgs.node); + }); + navigationService.hideMenu(); + $location.path('/TagManager/' + response.data); + $route.reload(); + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + else { + notificationsService.error("Error", "A group with this name already exists"); + } + + + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + + }; + $scope.cancel = function () { + if ($location.path() === "/TagManager/TagManagerTree/create-group") { + $location.path('/TagManager/'); + $route.reload(); + } + else { + navigationService.hideMenu(); + } + } + } + + angular.module('umbraco').controller('tagManager.createGroup.controller', createGroup); +})(); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.delete.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.delete.controller.js new file mode 100644 index 0000000..9d22714 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.delete.controller.js @@ -0,0 +1,98 @@ +(function () { + 'use strict'; + + function deleteTags($scope, $location, + tagManagerResource, notificationsService, navigationService, $route, treeService, appState) { + + var vm = this; + + //get the treeNode that we have selected + var selectedMenuNode = appState.getMenuState("currentNode"); + var parent = selectedMenuNode.parent(); + + tagManagerResource.getTagsById(selectedMenuNode.id).then(function (response) { + $scope.cmsTags = response.data; + $scope.selectedTag = selectedMenuNode.id; + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + + $scope.cancel = function () { + navigationService.hideMenu(); + } + + $scope.delete = function (cmsTags) { + if (cmsTags.tagsInGroup.length === 1) { + tagManagerResource.deleteTag(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tag, please check the logs."); + return; + } + //remove the node + treeService.removeNode(selectedMenuNode); + + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1"], forceReload: true }).then(function (syncArgs) { + navigationService.reloadNode(syncArgs.node); + });; + + // if the current edited item is the same one as we're deleting, we need to navigate elsewhere + $location.path('/TagManager/TagManagerTree/'); + $route.reload(); + + notificationsService.success("Success", "'" + cmsTags.tagItem.tag + "' has been deleted. All tags have been deleted, re-create the group if you need it again"); + navigationService.hideMenu(); + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + else { + tagManagerResource.deleteTag(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tag, please check the logs."); + return; + } + + //remove the node + treeService.removeNode(selectedMenuNode); + + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1", "tagGroup-" + parent.name], forceReload: true }); + + // if the current edited item is the same one as we're deleting, we need to navigate elsewhere + $location.path('/TagManager/TagManagerTree/group/' + parent.name); + $route.reload(); + + notificationsService.success("Success", "'" + cmsTags.tagItem.tag + "' has been deleted."); + navigationService.hideMenu(); + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + } + } + + angular.module('umbraco').controller('tagManager.delete.controller', deleteTags); +})(); diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.dropdownFlexible.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.dropdownFlexible.controller.js new file mode 100644 index 0000000..7e4001a --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.dropdownFlexible.controller.js @@ -0,0 +1,32 @@ +angular.module("umbraco").controller("tagManager.dropdownFlexible.controller", + function ($scope, validationMessageService, tagManagerResource, $routeParams) { + + tagManagerResource.getTagsById($routeParams.id).then(function (response) { + + var tagsByVariant = objectWithLanguageId(response.data.tagsInGroup, response.data.tagItem.languageId); + $scope.model.mergeList = removeObjectWithId(tagsByVariant, $routeParams.id); + + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + + $scope.change = function (tag) { + $scope.model.mergeTag = tag; + } + + function objectWithLanguageId(arr, id) { + return arr.filter((obj) => obj.languageId === id); + } + + function removeObjectWithId(arr, id) { + return arr.filter((obj) => obj.id !== parseInt(id)); + } + }); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.edit.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.edit.controller.js new file mode 100644 index 0000000..afb0966 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.edit.controller.js @@ -0,0 +1,332 @@ +(function () { + 'use strict'; + + function editTag($scope, $routeParams, $location, tagManagerResource, notificationsService, navigationService, + $route, treeService, appState, overlayService) { + var vm = this; + + vm.nextPageContent = nextPageContent; + vm.prevPageContent = prevPageContent; + vm.changePageContent = changePageContent; + vm.goToPageContent = goToPageContent; + vm.recordsPerPageContent = 10; + vm.recordsContent = []; + vm.paginationContent = {}; + + vm.nextPageMedia = nextPageMedia; + vm.prevPageMedia = prevPageMedia; + vm.changePageMedia = changePageMedia; + vm.goToPageMedia = goToPageMedia; + vm.recordsPerPageMedia = 10; + vm.recordsMedia = []; + vm.paginationMedia = {}; + + function nextPageContent(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageContent; + getPagedContent($routeParams.id, offset, vm.recordsPerPageContent) + } + + function prevPageContent(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageContent; + getPagedContent($routeParams.id, offset, vm.recordsPerPageContent) + } + + function changePageContent(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageContent; + getPagedContent($routeParams.id, offset, vm.recordsPerPageContent) + } + + function goToPageContent(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageContent; + getPagedContent($routeParams.id, offset, vm.recordsPerPageContent) + } + + function nextPageMedia(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageMedia; + getPagedMedia($routeParams.id, offset, vm.recordsPerPageMedia) + } + + function prevPageMedia(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageMedia; + getPagedMedia($routeParams.id, offset, vm.recordsPerPageMedia) + } + + function changePageMedia(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageMedia; + getPagedMedia($routeParams.id, offset, vm.recordsPerPageMedia) + } + + function goToPageMedia(pageNumber) { + vm.loading = true; + var offset = (pageNumber - 1) * vm.recordsPerPageMedia; + getPagedMedia($routeParams.id, offset, vm.recordsPerPageMedia) + } + + vm.filter = { + searchTermContent: "", + searchTermMedia: "" + }; + + vm.changeTab = changeTab; + + vm.tabs = [ + { + "alias": "mergeTab", + "label": "Merge Tags", + "active": true + }, + { + "alias": "contentTab", + "label": "Tagged Content" + }, + { + "alias": "mediaTab", + "label": "Tagged Media" + } + ]; + + $scope.cmsTags = { + tag: "", + languageId: null, + group: "", + alias: "mergeTags", + label: "Select Tag", + description: "The selected tag will be merged and will inherit this tags associations with content and media.", + config: { + multiple: false, + }, + mergeTag: [], + view: "/App_Plugins/tagManager/backoffice/propertyEditor/dropdownFlexible.html" + }; + + getPagedContent($routeParams.id, 0, vm.recordsPerPageContent); + getPagedMedia($routeParams.id, 0, vm.recordsPerPageMedia); + + function changeTab(selectedTab) { + vm.tabs.forEach(function (tab) { + tab.active = false; + }); + selectedTab.active = true; + }; + + function removeObjectWithId(arr, id) { + return arr.filter((obj) => obj.id !== parseInt(id)); + } + + function getPagedContent(id, offset, limit) { + vm.loading = true; + tagManagerResource.getPagedContent(id, offset, limit).then(function (response) { + console.log(response); // logging the response so we know what to do next! + + if (response.data.taggedContent.length > 0) { + vm.recordsContent = response.data.taggedContent; + } + + var totalPages = Math.ceil(response.data.totalRecords / limit); + + vm.paginationContent = { + pageNumber: (offset / vm.recordsPerPageContent) + 1, + totalPages: totalPages + }; + + vm.loading = false; + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + + function getPagedMedia(id, offset, limit) { + vm.loading = true; + tagManagerResource.getPagedMedia(id, offset, limit).then(function (response) { + console.log(response); // logging the response so we know what to do next! + + if (response.data.taggedMedia.length > 0) { + vm.recordsMedia = response.data.taggedMedia; + } + + var totalPages = Math.ceil(response.data.totalRecords / limit); + + vm.paginationMedia = { + pageNumber: (offset / vm.recordsPerPageMedia) + 1, + totalPages: totalPages + }; + + vm.loading = false; + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + + tagManagerResource.getTagsById($routeParams.id).then(function (response) { + //$scope.cmsTags = response.data; + $scope.cmsTags.mergeTag = null; + $scope.cmsTags.tagItem = response.data.tagItem; + $scope.cmsTags.tagsInGroup = response.data.tagsInGroup; + $scope.cmsTags.mergeList = removeObjectWithId($scope.cmsTags.tagsInGroup, $routeParams.id); + + navigationService.syncTree({ tree: 'TagManagerTree', path: ["-1", "tagGroup-" + $scope.cmsTags.tagItem.group, $routeParams.id], forceReload: false }); + + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + + $scope.change = function (tag) { + $scope.cmsTags.mergeTag = tag + } + + $scope.save = function (cmsTags) { + tagManagerResource.saveTag(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem saving the tag, please check the logs."); + return; + } + navigationService.syncTree({ tree: 'TagManagerTree', path: ["-1", "tagGroup-" + cmsTags.group, cmsTags.id], forceReload: true }); + notificationsService.success("Success", "'" + cmsTags.tagItem.tag + "' has been saved"); + $route.reload(); + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + }; + + $scope.openOverlay = function (cmsTags) { + + var options = { + title: 'Confirm', + content: 'Are you sure you want to delete this tag?', + disableBackdropClick: true, + disableEscKey: true, + confirmType: 'delete', + submit: function () { + if ($scope.busy) { + return false; + } + $scope.busy = true; + + if (cmsTags.tagsInGroup.length === 1) { + tagManagerResource.deleteTag(cmsTags).then(function (response) { + + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tag, please check the logs."); + return; + } + notificationsService.success("Success", "'" + cmsTags.tagItem.tag + "' has been deleted. All tags have been deleted, re-create the group if you need it again"); + + //get the treeNode that we have selected + var node = appState.getTreeState("selectedNode"); + + //remove the node + treeService.removeNode(node); + + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1"], forceReload: true }).then(function (syncArgs) { + navigationService.reloadNode(syncArgs.node); + });; + + // if the current edited item is the same one as we're deleting, we need to navigate elsewhere + $location.path('/TagManager/TagManagerTree/'); + $route.reload(); + + // return to not busy + $scope.busy = false; + + }, function (err) { + + $scope.busy = false; + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + else { + tagManagerResource.deleteTag(cmsTags).then(function (response) { + + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tag, please check the logs."); + return; + } + notificationsService.success("Success", "'" + cmsTags.tagItem.tag + "' has been deleted."); + + //get the treeNode that we have selected + var node = appState.getTreeState("selectedNode"); + + //remove the node + treeService.removeNode(node); + + // if the current edited item is the same one as we're deleting, we need to navigate elsewhere + // for if we want to use the menu to also delete as doesn't neccesarily require redirection + if ($location.path() == "/" + node.routePath) { + //set location to be parent + $location.path("/" + node.parent().routePath); + } + + // return to not busy + $scope.busy = false; + + }, function (err) { + + $scope.busy = false; + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + overlayService.close(); + } + }; + + overlayService.confirm(options); + } + } + + angular.module('umbraco').controller('tagManager.edit.controller', editTag); +})(); diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.group.controller.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.group.controller.js new file mode 100644 index 0000000..2b51e24 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.group.controller.js @@ -0,0 +1,174 @@ +(function () { + 'use strict'; + + function areAllTagsMarkedForDelete(cmsTags) { + var allTags = false; + var tagsCountForDelete = 0; + Object.entries(cmsTags).forEach(([key, value]) => { + if (value.tagSelected) { + tagsCountForDelete++; + } + }); + if (cmsTags.length === tagsCountForDelete) { + allTags = true; + } + return allTags; + } + + function manageGroup($scope, tagManagerResource, $location, $route, notificationsService, appState, overlayService, navigationService) { + var vm = this; + + vm.filter = { + searchTerm: "" + }; + + // Initialize an array to hold selected tags + $scope.selectedTags = []; + + var group = $location.path().substring($location.path().lastIndexOf('/') + 1); + $scope.title = group; + + // Fetch tags for a specific group from the server + tagManagerResource.getTagsByGroup(group).then(function (response) { + $scope.cmsTags = response.data; + navigationService.syncTree({ tree: 'TagManagerTree', path: ["-1", "tagGroup-" + $scope.title], forceReload: true }); + + }, function (err) { + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + + // Function to toggle the selection of a tag + $scope.toggleSelectTag = function (tag) { + tag.tagSelected = !tag.tagSelected; + if (tag.tagSelected) { + $scope.selectedTags.push(tag); + } else { + var indexObj = $scope.selectedTags.indexOf(tag); + if (indexObj !== -1) { + $scope.selectedTags.splice(indexObj, 1); + } + } + }; + + // Function to clear the selection of all tags + $scope.clearSelection = function () { + // Iterate through all tags and set selected to false + $scope.cmsTags.tagsInGroup.forEach(function (tag) { + tag.tagSelected = false; + }); + + // Clear the selectedTags array + $scope.selectedTags = []; + }; + + // Function to filter tags based on the search query + $scope.filterTags = function (tag) { + var result = !$scope.searchQuery || tag.name.toLowerCase().includes($scope.searchQuery.toLowerCase()); + return result; + }; + + // Function to navigate to the create tag view + $scope.navigateToCreateTag = function () { + $location.path('/TagManager/TagManagerTree/create'); + }; + + // Function to navigate to the edit tag view + $scope.navigateToEditTag = function (tagId) { + $location.path('/TagManager/TagManagerTree/edit/' + tagId); + }; + + $scope.openOverlay = function (cmsTags) { + $scope.cmsTags = cmsTags; + var options = { + title: 'Confirm', + content: 'Are you sure you want to delete the selected tag(s)?', + disableBackdropClick: true, + disableEscKey: true, + confirmType: 'delete', + submit: function () { + + if (cmsTags.length === 0) { + return; + } + if ($scope.busy) { + return false; + } + $scope.busy = true; + + var allTagsForDelete = areAllTagsMarkedForDelete(cmsTags.tagsInGroup); + if (allTagsForDelete) { + tagManagerResource.deleteTags(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tags, please check the logs."); + return; + } + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1"], forceReload: true }).then(function (syncArgs) { + navigationService.reloadNode(syncArgs.node); + }); + + $location.path('/TagManager/'); + $route.reload(); + + notificationsService.success("Success", "All tags have been deleted, re-create the group if you need it again"); + + $scope.busy = false; + }, function (err) { + $scope.busy = false; + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + else { + tagManagerResource.deleteTags(cmsTags).then(function (response) { + if (response.data === 0) { + notificationsService.error("Error", "There was a problem deleting the tags, please check the logs."); + return; + } + var node = appState.getTreeState("selectedNode"); + + navigationService.syncTree({ tree: "TagManagerTree", path: ["-1", "tagGroup-" + node.name], forceReload: true }).then(function (syncArgs) { + navigationService.reloadNode(syncArgs.node); + });; + $route.reload(); + notificationsService.success("Success", "tags have been deleted."); + + $scope.busy = false; + }, function (err) { + $scope.busy = false; + //check if response is ysod + if (err.status && err.status >= 500) { + dialogService.ysodDialog(err); + } + if (err.data && angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + + + overlayService.close(); + } + }; + + overlayService.confirm(options); + } + } + angular.module('umbraco').controller('tagManager.group.controller', manageGroup); +})(); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.resource.js b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.resource.js new file mode 100644 index 0000000..ca78d90 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/backoffice/scripts/tagManager.resource.js @@ -0,0 +1,34 @@ +angular.module("umbraco.resources").factory("tagManagerResource", function ($http) { + return { + getTagsById: function (id) { + return $http.get("backoffice/TagManager/TagManagerApi/GetTagsById?id=" + id); + }, + getTagsByGroup: function (group) { + return $http.get("backoffice/TagManager/TagManagerApi/GetTagsByGroup?group=" + group); + }, + getPagedContent: function (id, offset, limit) { + return $http.get("backoffice/TagManager/TagManagerApi/GetPagedContent?id=" + id + "&offset=" + offset + "&limit=" + limit); + }, + getPagedMedia: function (id, offset, limit) { + return $http.get("backoffice/TagManager/TagManagerApi/GetPagedMedia?id=" + id + "&offset=" + offset + "&limit=" + limit); + }, + getTagGroups: function () { + return $http.get("backoffice/TagManager/TagManagerApi/GetTagGroups"); + }, + createGroup: function (group) { + return $http.get("backoffice/TagManager/TagManagerApi/CreateGroup?group=" + group); + }, + createTag: function (cmsTags) { + return $http.post("backoffice/TagManager/TagManagerApi/CreateTag", angular.toJson(cmsTags)); + }, + saveTag: function (cmsTags) { + return $http.post("backoffice/TagManager/TagManagerApi/SaveTag", angular.toJson(cmsTags)); + }, + deleteTag: function (cmsTags) { + return $http.post("backoffice/TagManager/TagManagerApi/DeleteTag", angular.toJson(cmsTags)); + }, + deleteTags: function (cmsTags) { + return $http.post("backoffice/TagManager/TagManagerApi/DeleteTags", angular.toJson(cmsTags)); + } + }; +}); \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-GB.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-GB.xml new file mode 100644 index 0000000..fdae160 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-GB.xml @@ -0,0 +1,10 @@ + + + + Tag Manager + + + Tag Manager + Tag Manager + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-US.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-US.xml new file mode 100644 index 0000000..7678f04 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en-US.xml @@ -0,0 +1,10 @@ + + + + Tag Manager + + + Tag Manager + Tag Manager + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en.xml b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en.xml new file mode 100644 index 0000000..fdae160 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/lang/en.xml @@ -0,0 +1,10 @@ + + + + Tag Manager + + + Tag Manager + Tag Manager + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/package.manifest b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/package.manifest new file mode 100644 index 0000000..64fd6cf --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/App_Plugins/TagManager/package.manifest @@ -0,0 +1,21 @@ +{ + "dashboards": [ + { + "alias": "tagManager", + "view": "~/App_Plugins/tagManager/backoffice/dashboards/dashboard.html", + "sections": [ "TagManager" ] + } + ], + "javascript": [ + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.create.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.createGroup.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.delete.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.edit.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.group.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.dropdownFlexible.controller.js", + "~/App_Plugins/tagManager/backoffice/scripts/tagManager.resource.js" + ], + "css": [ + "~/App_Plugins/tagManager/backoffice/css/tagManager.css" + ] +} diff --git a/Umbraco Tag Manager.TestSite.V10/Our.Umbraco.Community.TagManager.TestSite.V10.csproj b/Umbraco Tag Manager.TestSite.V10/Our.Umbraco.Community.TagManager.TestSite.V10.csproj new file mode 100644 index 0000000..567ff54 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Our.Umbraco.Community.TagManager.TestSite.V10.csproj @@ -0,0 +1,48 @@ + + + net6.0 + enable + enable + Our.Umbraco.Community.TagManager.TestSite.V10 + false + + + + + + + + + + + + + + + + true + + + + + false + false + + + + + + + + + + + + + + + + + + + diff --git a/Umbraco Tag Manager.TestSite.V10/Program.cs b/Umbraco Tag Manager.TestSite.V10/Program.cs new file mode 100644 index 0000000..eb2e8f8 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Program.cs @@ -0,0 +1,19 @@ +namespace Our.Umbraco.Community.TagManager.TestSite.V10 +{ + public class Program + { + public static void Main(string[] args) + => CreateHostBuilder(args) + .Build() + .Run(); + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureUmbracoDefaults() + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStaticWebAssets(); + webBuilder.UseStartup(); + }); + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Properties/launchSettings.json b/Umbraco Tag Manager.TestSite.V10/Properties/launchSettings.json new file mode 100644 index 0000000..21b43b1 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:15293", + "sslPort": 44398 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Umbraco.Web.UI": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:44398;http://localhost:15293", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Startup.cs b/Umbraco Tag Manager.TestSite.V10/Startup.cs new file mode 100644 index 0000000..27ccfc9 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Startup.cs @@ -0,0 +1,65 @@ +namespace Our.Umbraco.Community.TagManager.TestSite.V10 +{ + public class Startup + { + private readonly IWebHostEnvironment _env; + private readonly IConfiguration _config; + + /// + /// Initializes a new instance of the class. + /// + /// The web hosting environment. + /// The configuration. + /// + /// Only a few services are possible to be injected here https://github.com/dotnet/aspnetcore/issues/9337. + /// + public Startup(IWebHostEnvironment webHostEnvironment, IConfiguration config) + { + _env = webHostEnvironment ?? throw new ArgumentNullException(nameof(webHostEnvironment)); + _config = config ?? throw new ArgumentNullException(nameof(config)); + } + + /// + /// Configures the services. + /// + /// The services. + /// + /// This method gets called by the runtime. Use this method to add services to the container. + /// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940. + /// + public void ConfigureServices(IServiceCollection services) + { + services.AddUmbraco(_env, _config) + .AddBackOffice() + .AddWebsite() + .AddComposers() + .Build(); + } + + /// + /// Configures the application. + /// + /// The application builder. + /// The web hosting environment. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseUmbraco() + .WithMiddleware(u => + { + u.UseBackOffice(); + u.UseWebsite(); + }) + .WithEndpoints(u => + { + u.UseInstallerEndpoints(); + u.UseBackOfficeEndpoints(); + u.UseWebsiteEndpoints(); + }); + } + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Author.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Author.cshtml new file mode 100644 index 0000000..41b2777 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Author.cshtml @@ -0,0 +1,30 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; + var authorListPage = Model.Parent as AuthorList; +} + + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, authorListPage.MainImage, null, null)) + +
+
+
+
+ +
+
+ @Model.Name +

@Model.Name

+
+
+ + @Html.GetBlockListHtml(Model.ContentRows) +
+
+
+
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/AuthorList.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/AuthorList.cshtml new file mode 100644 index 0000000..f0a499c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/AuthorList.cshtml @@ -0,0 +1,12 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +@await Html.PartialAsync("~/Views/Partials/authors.cshtml") \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Components/Contact/Default.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Components/Contact/Default.cshtml new file mode 100644 index 0000000..b876527 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Components/Contact/Default.cshtml @@ -0,0 +1,26 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels; + +@using (Html.BeginUmbracoForm("SubmitForm", "ContactSurface", FormMethod.Post, new { @class = "text-left" })) +{ +
+ + + +
+
+ + + +
+
+ + + +
+
+
+ +
+} \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Components/Pagination/Default.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Components/Pagination/Default.cshtml new file mode 100644 index 0000000..ac0eaf5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Components/Pagination/Default.cshtml @@ -0,0 +1,48 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels; + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/authors.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/authors.cshtml new file mode 100644 index 0000000..50f9aa4 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/authors.cshtml @@ -0,0 +1,55 @@ +@inherits UmbracoViewPage + +@using Clean.Core.Helpers +@using Clean.Core.Models.ViewModels; +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + AuthorList authorList = UmbracoContext.Content.GetAtRoot().DescendantsOrSelf().FirstOrDefault(); + int modelId = Model.Id; + var isAuthorListPage = modelId == authorList?.Id; + var fallbackPageSize = isAuthorListPage ? 10 : 3; + + var pageSize = QueryStringHelper.GetIntFromQueryString(Context.Request.Query, "size", fallbackPageSize); + var pageNumber = QueryStringHelper.GetIntFromQueryString(Context.Request.Query, "page", 1); + var allAuthors = authorList?.Children().Where(x => x.IsVisible()) ?? Enumerable.Empty(); + var pageOfAuthors = allAuthors.Skip((pageNumber - 1) * pageSize).Take(pageSize); + var totalItemCount = allAuthors.Count(); + var pageCount = totalItemCount > 0 ? Math.Ceiling((double)totalItemCount / pageSize) : 1; + +} + +
+
+
+
+
+ @foreach (var author in pageOfAuthors) + { +
+
+
+ @author.Name +
+
+
+

@author.Name

+

@author.MetaDescription

+ + @Umbraco.GetDictionaryValue("Author.ReadMore") + +
+
+
+
+ } +
+
+ + @if (isAuthorListPage) + { + @await Component.InvokeAsync("Pagination", new { totalItems = totalItemCount, url = Model.Url(), pageNumber = pageNumber, pageSize = pageSize }) + } +
+
+
diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/area.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/area.cshtml new file mode 100644 index 0000000..3614847 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/area.cshtml @@ -0,0 +1,10 @@ +@using Umbraco.Extensions +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +
+ @await Html.GetBlockGridItemsHtmlAsync(Model) +
diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/areas.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/areas.cshtml new file mode 100644 index 0000000..30f987c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/areas.cshtml @@ -0,0 +1,13 @@ +@using Umbraco.Extensions +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@{ + if (Model?.Areas.Any() != true) { return; } +} + +
+ @foreach (var area in Model.Areas) + { + @await Html.GetBlockGridItemAreaHtmlAsync(area) + } +
diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/default.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/default.cshtml new file mode 100644 index 0000000..e25839e --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/default.cshtml @@ -0,0 +1,11 @@ +@using Umbraco.Extensions +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@{ + if (Model?.Any() != true) { return; } +} + +
+ @await Html.GetBlockGridItemsHtmlAsync(Model) +
diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/items.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/items.cshtml new file mode 100644 index 0000000..2703fa5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blockgrid/items.cshtml @@ -0,0 +1,36 @@ +@using Umbraco.Cms.Core.Models.Blocks +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage> +@{ + if (Model?.Any() != true) { return; } +} + +
+ @foreach (var item in Model) + { + +
+ @{ + var partialViewName = "blockgrid/Components/" + item.Content.ContentType.Alias; + try + { + @await Html.PartialAsync(partialViewName, item) + } + catch (InvalidOperationException) + { +

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

+ } + } +
+ } +
diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/codeSnippetRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/codeSnippetRow.cshtml new file mode 100644 index 0000000..18855dc --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/codeSnippetRow.cshtml @@ -0,0 +1,30 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks + +@{ + var row = Model.Content as CodeSnippetRow; + var settings = Model.Settings as CodeSnippetRowSettings; + if (settings?.Hide ?? false) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = Clean.Core.Helpers.SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } + + SmidgeHelper.RequiresCss("~/clean-assets/css/vs2015.css"); + SmidgeHelper.RequiresCss("~/clean-assets/css/highlightjs-copy.min.css"); + SmidgeHelper.RequiresJs("~/clean-assets/js/highlight.min.js"); + SmidgeHelper.RequiresJs("~/clean-assets/js/highlightjs-copy.min.js"); + SmidgeHelper.RequiresJs("~/clean-assets/js/initHighlight.js"); +} + +
+
+
@row.Code
+ @if (!string.IsNullOrWhiteSpace(row.Title)) + { +

@row.Title

+ } +
+
\ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/iconLinkRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/iconLinkRow.cshtml new file mode 100644 index 0000000..ab34ffc --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/iconLinkRow.cshtml @@ -0,0 +1,15 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks +@addTagHelper *, Clean.Core + +@{ + var row = Model.Content as IconLinkRow; + var settings = Model.Settings as IconLinkRowSettings; + if (settings?.Hide ?? false) { return; } +} + +
  • + + + +
  • \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageCarouselRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageCarouselRow.cshtml new file mode 100644 index 0000000..d6fbe7c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageCarouselRow.cshtml @@ -0,0 +1,57 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks +@using Clean.Core.Extensions + +@{ + var row = Model.Content as ImageCarouselRow; + var settings = Model.Settings as ImageCarouselRowSettings; + if (settings?.Hide ?? false) { return; } + if (row.Images == null || !row.Images.Any()) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = Clean.Core.Helpers.SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } + + SmidgeHelper.RequiresCss("~/clean-assets/css/swiffy-slider.min.css"); + SmidgeHelper.RequiresJs("~/clean-assets/js/swiffy-slider.min.js"); +} + +
    +
    +
    +
      + @foreach (var item in row.Images) + { +
    • @item.Content.GetAltText()
    • + } +
    + + + + +
    + + @if (row.Images.Count() > 1) + { + foreach (var image in row.Images.Skip(1)) + { + + } + } +
    + +
    + + @if (row.Images.Count() > 1) + { + foreach (var image in row.Images.Skip(1)) + { + + } + } +
    +
    +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageRow.cshtml new file mode 100644 index 0000000..d207c8f --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/imageRow.cshtml @@ -0,0 +1,26 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks +@using Clean.Core.Extensions + +@{ + var row = Model.Content as ImageRow; + var settings = Model.Settings as ImageRowSettings; + if (settings?.Hide ?? false) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = Clean.Core.Helpers.SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } +} + +
    +
    + @row.Image.Content.GetAltText() + @if (!string.IsNullOrWhiteSpace(row.Caption)) + { +

    @row.Caption

    + } +
    +
    + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/latestArticlesRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/latestArticlesRow.cshtml new file mode 100644 index 0000000..c134a92 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/latestArticlesRow.cshtml @@ -0,0 +1,76 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks +@using Clean.Core.Extensions +@using Clean.Core.Helpers + +@{ + var row = Model.Content as LatestArticlesRow; + var settings = Model.Settings as LatestArticlesRowSettings; + if (settings?.Hide ?? false) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } + + var pageSize = row.PageSize; + var pageNumber = QueryStringHelper.GetIntFromQueryString(Context.Request.Query, "page", 1); + var allArticles = row.ArticleList.Children
    ().Where(x => x.IsVisible()).OrderByDescending(x => x.ArticleDate) ?? Enumerable.Empty
    (); + var pageOfArticles = allArticles.Skip((pageNumber - 1) * pageSize).Take(pageSize); + var totalItemCount = allArticles.Count(); + var pageCount = totalItemCount > 0 ? Math.Ceiling((double)totalItemCount / pageSize) : 1; +} + +
    +
    + @foreach (var article in pageOfArticles) + { + var author = article.GetAuthor(Umbraco); + bool.TryParse(article.Value("showFullArticleOnListPage", fallback: Fallback.ToAncestors), out var showFullArticleOnListPage); + +
    + +

    + @(!string.IsNullOrWhiteSpace(article.Title) ? article.Title : article.Name) +

    + @if (!string.IsNullOrWhiteSpace(article.Subtitle)) + { +

    @article.Subtitle

    + } +
    + + @if (showFullArticleOnListPage && article.Categories != null && article.Categories.Any()) + { + + @foreach (var category in article.Categories.Select(x => x.Name).OrderBy(y => y)) + { + @category + } + + } +
    + + @if (showFullArticleOnListPage) + { +
    +
    + @Html.GetBlockListHtml(article.ContentRows) +
    +
    + } + +
    + } + + @if (row.ShowPagination) + { + @await Component.InvokeAsync("Pagination", new { totalItems = totalItemCount, url = row.ArticleList.Url(), pageNumber = pageNumber, pageSize = pageSize }) + } +
    +
    + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/richTextRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/richTextRow.cshtml new file mode 100644 index 0000000..e33199c --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/richTextRow.cshtml @@ -0,0 +1,20 @@ +@inherits UmbracoViewPage +@using Umbraco.Cms.Core.Models.Blocks + +@{ + var row = Model.Content as RichTextRow; + var settings = Model.Settings as RichTextRowSettings; + if (settings?.Hide ?? false) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = Clean.Core.Helpers.SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } +} + +
    +
    + @row.Content +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/videoRow.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/videoRow.cshtml new file mode 100644 index 0000000..8d57cdb --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/Components/videoRow.cshtml @@ -0,0 +1,29 @@ +@inherits UmbracoViewPage +@using Clean.Core.Helpers +@using Umbraco.Cms.Core.Models.Blocks + +@{ + var row = Model.Content as VideoRow; + var settings = Model.Settings as VideoRowSettings; + if (settings?.Hide ?? false) { return; } + if (string.IsNullOrWhiteSpace(row.VideoUrl)) { return; } + + var spacingClasses = ""; + if (Model.Settings is ISpacingProperties spacing) + { + spacingClasses = Clean.Core.Helpers.SpacingHelper.GetSpacingClasses(spacing.PaddingTop, spacing.PaddingBottom, spacing.PaddingLeft, spacing.PaddingRight, spacing.MarginTop, spacing.MarginBottom, spacing.MarginLeft, spacing.MarginRight); + } + + var videoId = VideoUrlHelper.GetVideoId(row.VideoUrl); +} + +
    +
    +
    + @if (!string.IsNullOrWhiteSpace(row.Caption)) + { +

    @row.Caption

    + } +
    +
    + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/default.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/default.cshtml new file mode 100644 index 0000000..accca2e --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/blocklist/default.cshtml @@ -0,0 +1,13 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@{ + if (Model?.Any() != true) { return; } +} +
    + @foreach (var block in Model) + { + if (block?.ContentUdi == null) { continue; } + var data = block.Content; + + @await Html.PartialAsync("blocklist/Components/" + data.ContentType.Alias, block) + } +
    diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/footer.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/footer.cshtml new file mode 100644 index 0000000..f4d2074 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/footer.cshtml @@ -0,0 +1,24 @@ +@inherits UmbracoViewPage +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + var homePage = Model.AncestorOrSelf(); +} + + +
    +
    +
    +
    + @if (homePage.SocialIconLinks != null && homePage.SocialIconLinks.Any()) + { +
      + @Html.GetBlockListHtml(homePage.SocialIconLinks) +
    + } +

    @Umbraco.GetDictionaryValue("Footer.CopyrightTitle") © @DateTime.Now.Year @Umbraco.GetDictionaryValue("Footer.CopyrightStatement")

    +

    Theme by Start Bootstrap, implemented in Umbraco by Paul Seal from codeshare.co.uk

    +
    +
    +
    +
    diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3-fluid.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3-fluid.cshtml new file mode 100644 index 0000000..b92734e --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3-fluid.cshtml @@ -0,0 +1,106 @@ +@using System.Web +@using Microsoft.AspNetCore.Html +@using Newtonsoft.Json.Linq +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@* + Razor helpers located at the bottom of this file +*@ + +@if (Model is JObject && Model?.sections is not null) +{ + var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; + +
    + @if (oneColumn) + { + foreach (var section in Model.sections) + { +
    + @foreach (var row in section.rows) + { + renderRow(row); + } +
    + } + } + else + { +
    + @foreach (var sec in Model.sections) + { +
    +
    + @foreach (var row in sec.rows) + { + renderRow(row); + } +
    +
    + } +
    + } +
    +} + +@functions{ + + private async Task renderRow(dynamic row) + { +
    +
    + @foreach (var area in row.areas) + { +
    +
    + @foreach (var control in area.controls) + { + if (control?.editor?.view != null) + { + @await Html.PartialAsync("grid/editors/base", (object)control) + } + } +
    +
    + } +
    +
    + } +} + +@functions{ + + public static HtmlString RenderElementAttributes(dynamic contentItem) + { + var attrs = new List(); + JObject cfg = contentItem.config; + + if (cfg != null) + { + foreach (JProperty property in cfg.Properties()) + { + var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); + attrs.Add(property.Name + "=\"" + propertyValue + "\""); + } + } + + JObject style = contentItem.styles; + + if (style != null) { + var cssVals = new List(); + foreach (JProperty property in style.Properties()) + { + var propertyValue = property.Value.ToString(); + if (string.IsNullOrWhiteSpace(propertyValue) == false) + { + cssVals.Add(property.Name + ":" + propertyValue + ";"); + } + } + + if (cssVals.Any()) + attrs.Add("style='" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "'"); + } + + return new HtmlString(string.Join(" ", attrs)); + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3.cshtml new file mode 100644 index 0000000..8863788 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/bootstrap3.cshtml @@ -0,0 +1,112 @@ +@using System.Web +@using Microsoft.AspNetCore.Html +@using Newtonsoft.Json.Linq +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@if (Model is JObject && Model?.sections is not null) +{ + var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; + +
    + @if (oneColumn) + { + foreach (var section in Model.sections) + { +
    + @foreach (var row in section.rows) + { + renderRow(row, true); + } +
    + } + } + else + { +
    +
    + @foreach (var sec in Model.sections) + { +
    +
    + @foreach (var row in sec.rows) + { + renderRow(row, false); + } +
    +
    + } +
    +
    + } +
    +} + +@functions{ + + private async Task renderRow(dynamic row, bool singleColumn) + { +
    + @if (singleColumn) { + @:
    + } +
    + @foreach (var area in row.areas) + { +
    +
    + @foreach (var control in area.controls) + { + if (control?.editor?.view != null) + { + @await Html.PartialAsync("grid/editors/base", (object)control) + } + } +
    +
    + } +
    + @if (singleColumn) { + @:
    + } +
    + } + +} + +@functions{ + + public static HtmlString RenderElementAttributes(dynamic contentItem) + { + var attrs = new List(); + JObject cfg = contentItem.config; + + if (cfg != null) + { + foreach (JProperty property in cfg.Properties()) + { + var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); + attrs.Add(property.Name + "=\"" + propertyValue + "\""); + } + } + + JObject style = contentItem.styles; + + if (style != null) + { + var cssVals = new List(); + foreach (JProperty property in style.Properties()) + { + var propertyValue = property.Value.ToString(); + if (string.IsNullOrWhiteSpace(propertyValue) == false) + { + cssVals.Add(property.Name + ":" + propertyValue + ";"); + } + } + + if (cssVals.Any()) + attrs.Add("style=\"" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "\""); + } + + return new HtmlString(string.Join(" ", attrs)); + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/base.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/base.cshtml new file mode 100644 index 0000000..e40543b --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/base.cshtml @@ -0,0 +1,27 @@ +@model dynamic + +@try +{ + string editor = EditorView(Model); + @await Html.PartialAsync(editor, Model as object) +} +catch (Exception ex) +{ +
    @ex.ToString()
    +} + +@functions{ + + public static string EditorView(dynamic contentItem) + { + string view = contentItem.editor.render != null ? contentItem.editor.render.ToString() : contentItem.editor.view.ToString(); + view = view.Replace(".html", ".cshtml"); + + if (!view.Contains("/")) + { + view = "grid/editors/" + view; + } + + return view; + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/embed.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/embed.cshtml new file mode 100644 index 0000000..74c8fe2 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/embed.cshtml @@ -0,0 +1,11 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@if (Model is not null) +{ + string embedValue = Convert.ToString(Model.value); + embedValue = embedValue.DetectIsJson() ? Model.value.preview : Model.value; + +
    + @Html.Raw(embedValue) +
    +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/macro.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/macro.cshtml new file mode 100644 index 0000000..a4450d1 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/macro.cshtml @@ -0,0 +1,15 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@if (Model?.value is not null) +{ + string macroAlias = Model.value.macroAlias.ToString(); + var parameters = new Dictionary(); + foreach (var mpd in Model.value.macroParamsDictionary) + { + parameters.Add(mpd.Name, mpd.Value); + } + + + @await Umbraco.RenderMacroAsync(macroAlias, parameters) + +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/media.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/media.cshtml new file mode 100644 index 0000000..bc3b111 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/media.cshtml @@ -0,0 +1,64 @@ +@model dynamic +@using Umbraco.Cms.Core.Media +@using Umbraco.Cms.Core.PropertyEditors.ValueConverters +@inject IImageUrlGenerator ImageUrlGenerator + +@if (Model?.value is not null) +{ + var url = Model.value.image; + + if (Model.editor.config != null && Model.editor.config.size != null) + { + if (Model.value.coordinates != null) + { + url = ImageCropperTemplateCoreExtensions.GetCropUrl( + (string)url, + ImageUrlGenerator, + width: (int)Model.editor.config.size.width, + height: (int)Model.editor.config.size.height, + cropAlias: "default", + cropDataSet: new ImageCropperValue + { + Crops = new[] + { + new ImageCropperValue.ImageCropperCrop + { + Alias = "default", + Coordinates = new ImageCropperValue.ImageCropperCropCoordinates + { + X1 = (decimal)Model.value.coordinates.x1, + Y1 = (decimal)Model.value.coordinates.y1, + X2 = (decimal)Model.value.coordinates.x2, + Y2 = (decimal)Model.value.coordinates.y2 + } + } + } + }); + } + else + { + url = ImageCropperTemplateCoreExtensions.GetCropUrl( + (string)url, + ImageUrlGenerator, + width: (int)Model.editor.config.size.width, + height: (int)Model.editor.config.size.height, + cropDataSet: new ImageCropperValue + { + FocalPoint = new ImageCropperValue.ImageCropperFocalPoint + { + Top = Model.value.focalPoint == null ? 0.5m : Model.value.focalPoint.top, + Left = Model.value.focalPoint == null ? 0.5m : Model.value.focalPoint.left + } + }); + } + } + + var altText = Model.value.altText ?? Model.value.caption ?? string.Empty; + + @altText + + if (Model.value.caption != null) + { +

    @Model.value.caption

    + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/rte.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/rte.cshtml new file mode 100644 index 0000000..9445666 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/rte.cshtml @@ -0,0 +1,13 @@ +@using Umbraco.Cms.Core.Templates +@model dynamic +@inject HtmlLocalLinkParser HtmlLocalLinkParser; +@inject HtmlUrlParser HtmlUrlParser; +@inject HtmlImageSourceParser HtmlImageSourceParser; + +@{ + var value = HtmlLocalLinkParser.EnsureInternalLinks(Model?.value.ToString()); + value = HtmlUrlParser.EnsureUrls(value); + value = HtmlImageSourceParser.EnsureImageSources(value); +} + +@Html.Raw(value) diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/textstring.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/textstring.cshtml new file mode 100644 index 0000000..e6b9352 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/grid/editors/textstring.cshtml @@ -0,0 +1,22 @@ +@model dynamic + +@if (Model?.editor.config.markup is not null) +{ + string markup = Model.editor.config.markup.ToString(); + markup = markup.Replace("#value#", Html.ReplaceLineBreaks((string)Model.value.ToString()).ToString()); + + if (Model.editor.config.style != null) + { + markup = markup.Replace("#style#", Model.editor.config.style.ToString()); + } + + + @Html.Raw(markup) + +} +else +{ + +
    @Model?.value
    +
    +} diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/mainNavigation.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/mainNavigation.cshtml new file mode 100644 index 0000000..5b21600 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/mainNavigation.cshtml @@ -0,0 +1,30 @@ +@inherits UmbracoViewPage +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + var homePage = Model.AncestorOrSelf(); +} + + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/metaData.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/metaData.cshtml new file mode 100644 index 0000000..39ae981 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/metaData.cshtml @@ -0,0 +1,44 @@ +@inherits UmbracoViewPage + +@{ + var homePage = Model.AncestorOrSelf(); + string domainAddress = homePage.Url(mode:UrlMode.Absolute).TrimEnd('/'); + string canonicalLink = domainAddress + Model.Url(); + string metaName = Model.Value("metaName"); + string metaDescription = Model.Value("metaDescription"); + var metaKeywords = Model.Value>("metaKeywords"); +} + + + + + + + @string.Format("{0} | {1}", Model.Name, Umbraco.GetDictionaryValue("Navigation.SiteName")) + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/pageHeader.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/pageHeader.cshtml new file mode 100644 index 0000000..45b3520 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/pageHeader.cshtml @@ -0,0 +1,48 @@ +@inherits UmbracoViewPage + +@{ + string mainImageUrl = Model.HasBackgroundImage ? Model.BackgroundImage.GetCropUrl(1903, 628) : "/media/f01jqvmq/2.jpg"; +} + +
    +
    +
    +
    +
    +

    @(!string.IsNullOrWhiteSpace(Model.Title) ? Model.Title : Model.Name)

    + + @if (Model.IsArticle) + { + if (Model.HasSubtitle) + { +

    @Model.Subtitle

    + } + + Posted + @if (Model.HasAuthor) + { + @Umbraco.GetDictionaryValue("Article.By")@Html.Raw(" ")@Model.AuthorName + } + @Umbraco.GetDictionaryValue("Article.On")@Html.Raw(" ")@Model.ArticleDate.Value.ToString("MMMM dd, yyyy") + + @if (Model.Categories != null && Model.Categories.Any()) + { + + @foreach (var category in Model.Categories.Select(x => x.Name).OrderBy(y => y)) + { + @category + } + } + } + else + { + if (Model.HasSubtitle) + { + @(Model.Subtitle) + } + } +
    +
    +
    +
    +
    diff --git a/Umbraco Tag Manager.TestSite.V10/Views/Partials/xmlSitemap.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/Partials/xmlSitemap.cshtml new file mode 100644 index 0000000..a1c5049 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/Partials/xmlSitemap.cshtml @@ -0,0 +1,32 @@ +@model IPublishedContent +@{ + + var homePage = Model.AncestorOrSelf("home"); + void RenderChildPages(IEnumerable contentItems) + { + if (contentItems.Any()) + { + foreach (var content in contentItems.Where(x => x.IsVisible())) + { + if (!(content.HasProperty("excludeFromSitemap") && content.Value("excludeFromSitemap"))) + { +@content.Url(mode:UrlMode.Absolute)@content.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") + if (content.Children.Any(x => x.IsVisible())) + { + RenderChildPages(content.Children); + } + } + } + } + }; +} + + +@homePage.Url(mode: UrlMode.Absolute)1.0@homePage.UpdateDate.ToString("yyyy-MM-ddTHH:mm:sszzz") + @{ + RenderChildPages(homePage.Children); + } + + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/_ViewImports.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/_ViewImports.cshtml new file mode 100644 index 0000000..770a545 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/_ViewImports.cshtml @@ -0,0 +1,9 @@ +@using Umbraco.Extensions +@using Our.Umbraco.Community.TagManager.TestSite.V10 +@using Umbraco.Cms.Web.Common.PublishedModels +@using Umbraco.Cms.Web.Common.Views +@using Umbraco.Cms.Core.Models.PublishedContent +@using Microsoft.AspNetCore.Html +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Smidge +@inject Smidge.SmidgeHelper SmidgeHelper diff --git a/Umbraco Tag Manager.TestSite.V10/Views/article.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/article.cshtml new file mode 100644 index 0000000..e9abfff --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/article.cshtml @@ -0,0 +1,23 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels +@using Umbraco.Cms.Core +@using Clean.Core.Extensions + +@{ + Layout = "master.cshtml"; + var author = Model.GetAuthor(Umbraco); +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage, author.Name, Model.ArticleDate, Model.Categories)) + +
    +
    +
    +
    + @Html.GetBlockListHtml(Model.ContentRows) +
    +
    +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/articleList.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/articleList.cshtml new file mode 100644 index 0000000..09454dc --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/articleList.cshtml @@ -0,0 +1,23 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +@if (Model.ContentRows != null) +{ +
    +
    +
    +
    + @Html.GetBlockListHtml(Model.ContentRows) +
    +
    +
    +
    +} \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/contact.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/contact.cshtml new file mode 100644 index 0000000..6cc6bd2 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/contact.cshtml @@ -0,0 +1,44 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; + var submitted = false; + if (bool.TryParse(TempData["Success"]?.ToString() ?? "", out var success)) + { + submitted = true; + } +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +
    +
    +
    +
    + @if(submitted) + { + + @if (success) + { + @Model.SuccessMessage + } + else + { + @Model.ErrorMessage + } + } + else + { + @Model.InstructionMessage +
    + @await Component.InvokeAsync("Contact") +
    + + } +
    +
    +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/content.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/content.cshtml new file mode 100644 index 0000000..6094703 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/content.cshtml @@ -0,0 +1,21 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + + +@{ + Layout = "master.cshtml"; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +
    +
    +
    +
    + @Html.GetBlockListHtml(Model.ContentRows) +
    +
    +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/error.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/error.cshtml new file mode 100644 index 0000000..8385238 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/error.cshtml @@ -0,0 +1,20 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +
    +
    +
    +
    + @Html.GetBlockListHtml(Model.ContentRows) +
    +
    +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/home.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/home.cshtml new file mode 100644 index 0000000..10a4128 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/home.cshtml @@ -0,0 +1,23 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels + +@{ + Layout = "master.cshtml"; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +@if (Model.ContentRows != null) +{ +
    +
    +
    +
    + @Html.GetBlockListHtml(Model.ContentRows) +
    +
    +
    +
    +} \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/master.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/master.cshtml new file mode 100644 index 0000000..dbda0d5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/master.cshtml @@ -0,0 +1,33 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@{ + Layout = null; + + SmidgeHelper.RequiresCss("~/clean-assets/css/styles.css"); + SmidgeHelper.RequiresJs("~/clean-assets/js/scripts.js"); +} + + + + + @await Html.PartialAsync("~/Views/Partials/metaData.cshtml") + + + + + + + @await SmidgeHelper.CssHereAsync(debug: false) + + + + @await Html.CachedPartialAsync("~/Views/Partials/mainNavigation.cshtml", model: Model, cacheTimeout: TimeSpan.FromMinutes(60)) + @RenderBody() + @await Html.CachedPartialAsync("~/Views/Partials/footer.cshtml", model: Model, cacheTimeout: TimeSpan.FromMinutes(60)) + + + + + @await SmidgeHelper.JsHereAsync(debug: false) + + diff --git a/Umbraco Tag Manager.TestSite.V10/Views/search.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/search.cshtml new file mode 100644 index 0000000..2a4f987 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/search.cshtml @@ -0,0 +1,71 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage + +@using Clean.Core.Models.ViewModels +@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels +@using Umbraco.Cms.Core +@using Clean.Core.Extensions +@inject Umbraco.Cms.Core.IPublishedContentQuery publishedContentQuery + +@{ + Layout = "master.cshtml"; + var searchQuery = Context.Request.Query["q"]; + var docTypesToIgnore = new[] { Category.ModelTypeAlias, CategoryList.ModelTypeAlias, Error.ModelTypeAlias, Search.ModelTypeAlias, XMlsitemap.ModelTypeAlias }; +} + +@await Html.PartialAsync("~/Views/Partials/pageHeader.cshtml", new PageHeaderViewModel(Model.Name, Model.Title, Model.Subtitle, Model.MainImage)) + +
    + +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/Views/xMLSitemap.cshtml b/Umbraco Tag Manager.TestSite.V10/Views/xMLSitemap.cshtml new file mode 100644 index 0000000..9d3f5b1 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/Views/xMLSitemap.cshtml @@ -0,0 +1,6 @@ +@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@{ + Context.Response.ContentType = "text/xml"; + Layout = null; +} +@(await Html.CachedPartialAsync("~/Views/Partials/xmlSitemap.cshtml", Model, TimeSpan.FromMinutes(60))) diff --git a/Umbraco Tag Manager.TestSite.V10/appsettings.Development.json b/Umbraco Tag Manager.TestSite.V10/appsettings.Development.json new file mode 100644 index 0000000..39cf2ae --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/appsettings.Development.json @@ -0,0 +1,44 @@ +{ + "$schema": "./appsettings-schema.json", + "Serilog": { + "MinimumLevel": { + "Default": "Information" + }, + "WriteTo": [ + { + "Name": "Async", + "Args": { + "configure": [ + { + "Name": "Console" + } + ] + } + } + ] + }, + "ConnectionStrings": { + "umbracoDbDSN": "Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True", + "umbracoDbDSN_ProviderName": "Microsoft.Data.Sqlite" + }, + "Umbraco": { + "CMS": { + "Unattended": { + "InstallUnattended": true, + "UnattendedUserName": "Administrator", + "UnattendedUserEmail": "admin@example.com", + "UnattendedUserPassword": "1234567890" + }, + "Content": { + "MacroErrors": "Throw" + }, + "Hosting": { + "Debug": true + }, + "RuntimeMinification": { + "UseInMemoryCache": true, + "CacheBuster": "Timestamp" + } + } + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/appsettings.json b/Umbraco Tag Manager.TestSite.V10/appsettings.json new file mode 100644 index 0000000..34e1d55 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/appsettings.json @@ -0,0 +1,27 @@ +{ + "$schema": "./appsettings-schema.json", + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information", + "System": "Warning" + } + } + }, + "Umbraco": { + "CMS": { + "Global": { + "Id": "e0ce0552-0fbf-463d-9289-fb952873dd5d", + "SanitizeTinyMce": true + }, + "Content": { + "AllowEditInvariantFromNonDefault": true, + "ContentVersionCleanupPolicy": { + "EnableCleanup": true + } + } + } + } +} diff --git a/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/about.config b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/about.config new file mode 100644 index 0000000..59da7c5 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/about.config @@ -0,0 +1,122 @@ + + + + Home + /Home/About + false + content + 2024-04-07T12:26:16 + + About + + 1 + + true + + + + + + + The Clean Starter Kit for Umbraco uses the Start Bootstrap Theme Clean Blog which is built using Bootstrap 5. It has been implemented in Umbraco as a Starter Kit by Paul Seal who has the blog codeshare.co.uk and works for the Umbraco Gold Partner ClerksWell.

    \n

    The idea of this starter kit is to provide you with a clean and simple website. It is ideally aimed at people who are new to Umbraco so they can install the starter kit, get used to Umbraco and then build upon the kit with their own requirements.

    " + }, + { + "contentTypeKey": "e0df4794-063a-4450-8f4f-c615a5d902e2", + "udi": "umb://element/51df637ca0854224a60d3163fb59091a", + "image": [ + { + "key": "6041d253-db55-43e0-ad07-5e35f1bca9ea", + "mediaKey": "8ac2c7bc-0acb-488e-a4e6-24d9ea5bdff7" + } + ], + "caption": "Umbraco, the friendly CMS" + }, + { + "contentTypeKey": "dd183f78-7d69-4eda-9b4c-a25970583a28", + "udi": "umb://element/222d1acd8d1d4bd5af79d9c1fe0ded44", + "content": "

    With this starter kit you should be able to quickly and easily set up a new website and share your content with others. The aim is for you to start using Umbraco and fall in love with it like I did, as a user or as a developer, you will find out how enjoyable it is to use.

    " + } + ], + "settingsData": [ + { + "contentTypeKey": "da15dc43-43f6-45f6-bda8-1fd17a49d25c", + "udi": "umb://element/38c5ec597c9948d59582509d8c4094a6", + "hide": "0" + }, + { + "contentTypeKey": "fed88ec5-c150-42af-b444-1f9ac5a100ba", + "udi": "umb://element/5934cccecf674ab98bb4da3f413ee79c", + "hide": "0" + }, + { + "contentTypeKey": "da15dc43-43f6-45f6-bda8-1fd17a49d25c", + "udi": "umb://element/7b469d55024b4655b45d02f4b3d39f74", + "hide": "0" + } + ] +}]]>
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <Value Culture="en-gb"><![CDATA[]]></Value> + + + + +
    +
    \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/authors.config b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/authors.config new file mode 100644 index 0000000..080b613 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/authors.config @@ -0,0 +1,52 @@ + + + + Home + /Home/Authors + false + authorList + 2024-04-07T12:26:16 + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <Value><![CDATA[]]></Value> + + + + + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/blog.config b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/blog.config new file mode 100644 index 0000000..cb4ecf1 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/blog.config @@ -0,0 +1,88 @@ + + + + Home + /Home/Blog + false + articleList + 2024-04-07T12:26:16 + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <Value><![CDATA[]]></Value> + + + + + + \ No newline at end of file diff --git a/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/categories.config b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/categories.config new file mode 100644 index 0000000..29f1889 --- /dev/null +++ b/Umbraco Tag Manager.TestSite.V10/uSync/v9/Content/categories.config @@ -0,0 +1,26 @@ + + + + Home + /Home/Categories + false + categoryList + 2024-04-07T12:26:16 + + 8 + + +