├── .gitignore ├── .nuget ├── NuGet.Config ├── NuGet.exe └── NuGet.targets ├── CHANGELOG.md ├── Geta.Tags.Sample.sln ├── Geta.Tags.sln ├── LICENSE ├── README.md ├── docs ├── editor-guide.md └── images │ ├── docker-output.PNG │ ├── tags-management.PNG │ ├── tags-property.PNG │ └── tags-scheduled-job.PNG ├── samples └── Geta.Tags.Sample │ ├── .dockerignore │ ├── App_Data │ ├── DefaultSiteContent.episerverdata │ ├── EPiServerDB_dada52e0.mdf │ ├── EPiServerDB_dada52e0_log.ldf │ ├── GeoLiteCity.dat │ └── blobs │ │ ├── 094c430f2676466e90171b10a984be9d │ │ ├── ccdc110de0d64864b73fcb36c1b77a53.png │ │ └── ccdc110de0d64864b73fcb36c1b77a53_Thumbnail.png │ │ ├── 0d555ea2a6364fb29772ddcf2fb471f8 │ │ ├── eb53bd3a3bd442d98db93e8d2c3fc1af.png │ │ └── eb53bd3a3bd442d98db93e8d2c3fc1af_Thumbnail.png │ │ ├── 32f12dbaf6e1417dbf63a1f5f856e80e │ │ └── 8fbb14eb5b8948fd80cbe9b6484ad482.mp4 │ │ ├── 417e2ec5592b4323be2019a2430ff5fc │ │ └── f08006eb5ef94dcb812559722f8de4d0.jpg │ │ ├── 4a50150b3763454c8c5046d68aff054c │ │ └── 0e06c4e11a794b428ab4f881663b88e8.png │ │ ├── 4e3fac8b5eb443c2abacd7e673ba8a04 │ │ └── 92c46e048fef43d6978fb9afed9f5aaa.jpg │ │ ├── 4ec3ed058d734ad8aad3943ef66ff6f7 │ │ └── e6b6a9b869714ea485f3fd17c38b537f.png │ │ ├── 4f27f05bb95f4b8cb30f1e3719cfa9f4 │ │ └── 17183bbd93a049bb9911f4baeebeff3e.png │ │ ├── 50a2c743f390435d9750f04eb9b151a6 │ │ ├── 723817a183ac4ada82e87421f1bf4033.png │ │ └── 723817a183ac4ada82e87421f1bf4033_Thumbnail.png │ │ ├── 6732a09cb32c49b580dbbf55a6ddcabd │ │ ├── e5b75ca76f414e5a8a7b7ca19ee41841.png │ │ └── e5b75ca76f414e5a8a7b7ca19ee41841_Thumbnail.png │ │ ├── 6abfd55bb7a84e1d96f2ba44cd0f5533 │ │ ├── 7e0637ed94d34711a656619e53f487e8.png │ │ └── 7e0637ed94d34711a656619e53f487e8_Thumbnail.png │ │ ├── 6ad43b90e8c04023a609ff650dfd58a2 │ │ ├── 1a8e1607451f46508bc92399484aac6b.png │ │ └── 1a8e1607451f46508bc92399484aac6b_Thumbnail.png │ │ ├── 6f239d462300482cac0a072aef039fb8 │ │ ├── 5af56c1426724c0ca388e9c2ea6399d0.jpg │ │ └── 5af56c1426724c0ca388e9c2ea6399d0_Thumbnail.jpg │ │ ├── 76b377e3e23542b2ae704e63e792a6aa │ │ ├── 2aedf124d98949208342b1ec395f07c3.png │ │ └── 2aedf124d98949208342b1ec395f07c3_Thumbnail.png │ │ ├── 776fce7f48ac46a8ba1247d1aa627fd1 │ │ └── 0a3b3bfc98c644458cf557c98a999c1a.jpg │ │ ├── 7fe4dd02a3ff4a648fef52ee5859c413 │ │ ├── 73bc58da26334206b2fee86b6f7c0a65.png │ │ └── 73bc58da26334206b2fee86b6f7c0a65_Thumbnail.png │ │ ├── 8606aaa6289a4ce396773d595a8a7792 │ │ ├── 78e08f306fc44c03888da8bab14fee3e.png │ │ └── 78e08f306fc44c03888da8bab14fee3e_Thumbnail.png │ │ ├── 8c8ac35eda864294a169e6e613cb08a5 │ │ └── 930770cbd8c9437da02cb1c0468945c2.jpg │ │ ├── 9c2738d0ad92491b8114d8accf43f5c3 │ │ ├── 26d4468ea1a24ddcb287b129546bc9bb.png │ │ └── 26d4468ea1a24ddcb287b129546bc9bb_Thumbnail.png │ │ ├── 9fa7df2bdc9c42199f16580a9f5c756e │ │ └── 642752e9ab914dbc8bfbff7b158c1a0b.jpg │ │ ├── 9fd1cabae89147fb8577199e8f8143eb │ │ └── 36444e66f2354570b131138f502e14d4.png │ │ ├── a3fbbb6bb1dd49b08afc8c37b5ad75ec │ │ └── 364d4d07c3fa4f8db401ce9504688eec.png │ │ ├── a8e6b275490141bfb3b4080d6b20db8d │ │ └── ad15c26de9ae4961bb2684c9fc0e3a22.jpg │ │ ├── b03e1372195f48bf967b43ebdfd08568 │ │ └── 14a448bd83c44587807a4aab90d730b1.png │ │ ├── b555b79ab39746058a5cdf4c8d76d08e │ │ ├── 3654f95ce9c243b88a097eafa064ebda.png │ │ └── 3654f95ce9c243b88a097eafa064ebda_Thumbnail.png │ │ ├── b7e4a1e4a02c48a791cd73231756af9f │ │ ├── 6598d114649f403494a5e39ae0e52e12.png │ │ └── 6598d114649f403494a5e39ae0e52e12_Thumbnail.png │ │ ├── bafc176a21074847b0dc7ff64c527759 │ │ ├── c101fa5b5d844132bd6e0662c89fdd91.png │ │ └── c101fa5b5d844132bd6e0662c89fdd91_Thumbnail.png │ │ ├── bde6a70e95524eaea84b06cb4fbb211a │ │ ├── 75b9ce805d054490bca033587498917a.png │ │ └── 75b9ce805d054490bca033587498917a_Thumbnail.png │ │ ├── c510d8f3d2b84bdb833cfca23dbd2e8b │ │ └── ecc95455fbcf46dfb11d8a8515dacf79.jpg │ │ ├── cff0728d83194743a85f95555eba8423 │ │ └── 4744fa764ccc4f51876166ac614abe10.png │ │ └── f89fdb41edc14984b8d6836e19fe12bf │ │ ├── 7dba176dd85e4d898462b6f11111b163.png │ │ └── 7dba176dd85e4d898462b6f11111b163_Thumbnail.png │ ├── Business │ ├── AdministratorRegistrationPage.cs │ ├── Channels │ │ ├── DisplayResolutionBase.cs │ │ ├── DisplayResolutions.cs │ │ ├── MobileChannel.cs │ │ └── WebChannel.cs │ ├── ContentExtensions.cs │ ├── ContentLocator.cs │ ├── EditorDescriptors │ │ ├── ContactPageSelectionFactory.cs │ │ ├── ContactPageSelector.cs │ │ └── StringListEditorDescriptor.cs │ ├── IModifyLayout.cs │ ├── Initialization │ │ ├── BundleConfig.cs │ │ ├── CustomizedRenderingInitialization.cs │ │ ├── DependencyResolverInitialization.cs │ │ ├── DisplayModesInitialization.cs │ │ ├── DisplayRegistryInitialization.cs │ │ ├── ExtendedTinyMceInitialization.cs │ │ └── FilterConfig.cs │ ├── PageContextActionFilter.cs │ ├── PageTypeExtensions.cs │ ├── PageViewContextFactory.cs │ ├── Rendering │ │ ├── AlloyContentAreaRenderer.cs │ │ ├── ErrorHandlingContentRenderer.cs │ │ ├── IContainerPage.cs │ │ ├── ICustomCssInContentArea.cs │ │ ├── SiteViewEngine.cs │ │ └── TemplateCoordinator.cs │ ├── ServiceLocatorDependencyResolver.cs │ └── UIDescriptors │ │ └── ContainerPageUIDescriptor.cs │ ├── ClientResources │ ├── Images │ │ └── icons │ │ │ └── layoutIcons24x24.png │ ├── Scripts │ │ └── Editors │ │ │ └── StringList.js │ └── Styles │ │ ├── LayoutIcons.css │ │ └── Styles.css │ ├── Content │ └── PagedList.css │ ├── Controllers │ ├── ContactBlockController.cs │ ├── DefaultPageController.cs │ ├── ImageFileController.cs │ ├── PageControllerBase.cs │ ├── PageListBlockController.cs │ ├── PreviewController.cs │ ├── RegisterController.cs │ ├── StartPageController.cs │ └── VideoFileController.cs │ ├── Dockerfile │ ├── EPiServerLog.config │ ├── Geta.Tags.Sample.csproj │ ├── Global.asax │ ├── Global.asax.cs │ ├── Global.cs │ ├── Helpers │ ├── CategorizableExtensions.cs │ ├── HtmlHelpers.cs │ └── UrlHelpers.cs │ ├── Models │ ├── Blocks │ │ ├── ButtonBlock.cs │ │ ├── ContactBlock.cs │ │ ├── EditorialBlock.cs │ │ ├── JumbotronBlock.cs │ │ ├── PageListBlock.cs │ │ ├── SiteBlockData.cs │ │ ├── SiteLogotypeBlock.cs │ │ └── TeaserBlock.cs │ ├── Media │ │ ├── GenericMedia.cs │ │ ├── ImageFile.cs │ │ └── VideoFile.cs │ ├── Pages │ │ ├── ArticlePage.cs │ │ ├── ContactPage.cs │ │ ├── ContainerPage.cs │ │ ├── GetaTagsPage.cs │ │ ├── IHasRelatedContent.cs │ │ ├── ISearchPage.cs │ │ ├── LandingPage.cs │ │ ├── NewsPage.cs │ │ ├── ProductPage.cs │ │ ├── SitePageData.cs │ │ ├── StandardPage.cs │ │ └── StartPage.cs │ ├── Properties │ │ └── PropertyStringList.cs │ ├── Register │ │ └── RegisterViewModel.cs │ ├── SiteContentType.cs │ ├── SiteImageUrl.cs │ └── ViewModels │ │ ├── ContactBlockModel.cs │ │ ├── ContentRenderingErrorModel.cs │ │ ├── IPageViewModel.cs │ │ ├── ImageViewModel.cs │ │ ├── LayoutModel.cs │ │ ├── PageListModel.cs │ │ ├── PageViewModel.cs │ │ ├── PreviewModel.cs │ │ └── VideoViewModel.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── Resources │ └── LanguageFiles │ │ ├── ContentTypeNames.xml │ │ ├── Display.xml │ │ ├── EditorHints.xml │ │ ├── GroupNames.xml │ │ ├── PropertyNames.xml │ │ ├── Views.xml │ │ └── _ReadMe.txt │ ├── Startup.cs │ ├── Static │ ├── css │ │ ├── bootstrap-collapse.js │ │ ├── bootstrap-responsive.css │ │ ├── bootstrap.css │ │ ├── editmode.css │ │ ├── editor.css │ │ ├── media.css │ │ └── style.css │ ├── gfx │ │ ├── New_FDT_Press_Contact_.JPG │ │ ├── carouselbackground.png │ │ ├── contact.jpg │ │ ├── exampelspan4.png │ │ ├── experts.png │ │ ├── fallows-media-wide.jpg │ │ ├── leader.png │ │ ├── leader2.png │ │ ├── logotype.png │ │ ├── meet.jpg │ │ ├── page-type-thumbnail-article.png │ │ ├── page-type-thumbnail-contact.png │ │ ├── page-type-thumbnail-product.png │ │ ├── page-type-thumbnail-standard.png │ │ ├── page-type-thumbnail.png │ │ ├── person.png │ │ ├── plan.jpg │ │ ├── play.png │ │ ├── playInactive.png │ │ ├── productLandingv2.png │ │ ├── searchbutton.png │ │ ├── searchbuttonsmall.png │ │ └── track.jpg │ ├── html │ │ └── error.htm │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ ├── js │ │ ├── bootstrap.js │ │ └── jquery.js │ └── jwplayer │ │ ├── jwplayer.js │ │ ├── player.swf │ │ ├── preview.jpg │ │ └── video.mp4 │ ├── Views │ ├── ArticlePage │ │ └── Index.cshtml │ ├── ContactBlock │ │ └── Index.cshtml │ ├── GetaTagsPage │ │ └── Index.cshtml │ ├── ImageFile │ │ └── Index.cshtml │ ├── LandingPage │ │ └── Index.cshtml │ ├── NewsPage │ │ └── Index.cshtml │ ├── PageListBlock │ │ └── Index.cshtml │ ├── Preview │ │ └── Index.cshtml │ ├── ProductPage │ │ └── Index.cshtml │ ├── Register │ │ └── Index.cshtml │ ├── Shared │ │ ├── Blocks │ │ │ ├── ButtonBlock.cshtml │ │ │ ├── EditorialBlock.cshtml │ │ │ ├── JumbotronBlockWide.cshtml │ │ │ ├── NoRenderer.cshtml │ │ │ ├── SiteLogotypeBlock.cshtml │ │ │ ├── TeaserBlock.cshtml │ │ │ └── TeaserBlockWide.cshtml │ │ ├── Breadcrumbs.cshtml │ │ ├── DisplayTemplates │ │ │ ├── ContactPage.cshtml │ │ │ ├── DateTime.cshtml │ │ │ ├── Image.cshtml │ │ │ └── StringsCollection.cshtml │ │ ├── Footer.cshtml │ │ ├── Header.cshtml │ │ ├── Layouts │ │ │ ├── _LeftNavigation.cshtml │ │ │ ├── _Root.cshtml │ │ │ └── _TwoPlusOne.cshtml │ │ ├── PagePartials │ │ │ ├── ContactPage.cshtml │ │ │ ├── ContactPageWide.cshtml │ │ │ ├── Page.cshtml │ │ │ └── PageWide.cshtml │ │ ├── Readonly.cshtml │ │ ├── SubNavigation.cshtml │ │ ├── TemplateError.cshtml │ │ └── TemplateHint.cshtml │ ├── StandardPage │ │ └── Index.cshtml │ ├── StartPage │ │ └── Index.cshtml │ ├── VideoFile │ │ └── Index.cshtml │ ├── Web.config │ └── _viewstart.cshtml │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Web.config │ ├── docker-compose.dcproj │ ├── docker-compose.override.yml │ ├── docker-compose.yml │ ├── favicon.ico │ ├── module.config │ ├── modules │ └── _protected │ │ ├── CMS │ │ ├── CMS.zip │ │ └── web.config │ │ ├── EPiServer.Cms.TinyMce │ │ ├── EPiServer.Cms.TinyMce.zip │ │ └── web.config │ │ └── Shell │ │ ├── Shell.zip │ │ └── web.config │ └── packages.config └── src ├── Attributes └── TagsGroupKeyAttribute.cs ├── Controllers ├── GetaTagsAdminController.cs └── GetaTagsController.cs ├── EditorDescriptors ├── GetaTagsAttribute.cs └── TagsEditorDescriptor.cs ├── Geta.Tags.csproj ├── Geta.Tags.nuspec ├── Helpers └── TagsHelper.cs ├── Implementations ├── TagEngine.cs ├── TagRepository.cs └── TagService.cs ├── InitializeModule.cs ├── Interfaces ├── ITagEngine.cs ├── ITagRepository.cs └── ITagService.cs ├── Models └── Tag.cs ├── Properties └── AssemblyInfo.cs ├── TagsModule.cs ├── TagsScheduledJob.cs ├── TagsTransferModule.cs ├── Web.config.transform ├── module ├── ClientResources │ ├── TagsSelection.js │ ├── styles │ │ ├── PagedList.css │ │ ├── jquery.tagit.css │ │ ├── tagit.overrides.css │ │ └── tagit.ui-zendesk.css │ └── vendor │ │ ├── jquery-2.1.0.min.js │ │ ├── jquery-ui.min.js │ │ └── tag-it.min.js ├── Views │ ├── Admin │ │ ├── Edit.cshtml │ │ └── Index.cshtml │ ├── Shared │ │ └── _Layout.cshtml │ └── web.config └── module.config ├── msbuild └── Main.proj └── packages.config /.gitignore: -------------------------------------------------------------------------------- 1 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) 2 | [Bb]in/ 3 | [Oo]bj/ 4 | 5 | # mstest test results 6 | TestResults 7 | 8 | ## Ignore Visual Studio temporary files, build results, and 9 | ## files generated by popular Visual Studio add-ons. 10 | 11 | # User-specific files 12 | *.suo 13 | *.user 14 | *.sln.docstates 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Rr]elease/ 19 | x64/ 20 | *_i.c 21 | *_p.c 22 | *.ilk 23 | *.meta 24 | *.obj 25 | *.pch 26 | *.pdb 27 | *.pgc 28 | *.pgd 29 | *.rsp 30 | *.sbr 31 | *.tlb 32 | *.tli 33 | *.tlh 34 | *.tmp 35 | *.log 36 | *.vspscc 37 | *.vssscc 38 | .builds 39 | 40 | # Visual C++ cache files 41 | ipch/ 42 | *.aps 43 | *.ncb 44 | *.opensdf 45 | *.sdf 46 | 47 | # Visual Studio profiler 48 | *.psess 49 | *.vsp 50 | *.vspx 51 | 52 | # Guidance Automation Toolkit 53 | *.gpState 54 | 55 | # ReSharper is a .NET coding add-in 56 | _ReSharper* 57 | 58 | # NCrunch 59 | *.ncrunch* 60 | .*crunch*.local.xml 61 | 62 | # Installshield output folder 63 | [Ee]xpress 64 | 65 | # DocProject is a documentation generator add-in 66 | DocProject/buildhelp/ 67 | DocProject/Help/*.HxT 68 | DocProject/Help/*.HxC 69 | DocProject/Help/*.hhc 70 | DocProject/Help/*.hhk 71 | DocProject/Help/*.hhp 72 | DocProject/Help/Html2 73 | DocProject/Help/html 74 | 75 | # Click-Once directory 76 | publish 77 | 78 | # Publish Web Output 79 | *.Publish.xml 80 | 81 | # NuGet Packages Directory 82 | packages 83 | 84 | # Windows Azure Build Output 85 | csx 86 | *.build.csdef 87 | 88 | # Windows Store app package directory 89 | AppPackages/ 90 | 91 | # Others 92 | [Bb]in 93 | [Oo]bj 94 | sql 95 | TestResults 96 | [Tt]est[Rr]esult* 97 | *.Cache 98 | ClientBin 99 | [Ss]tyle[Cc]op.* 100 | ~$* 101 | *.dbmdl 102 | Generated_Code #added for RIA/Silverlight projects 103 | 104 | # Backup & report files from converting an old project file to a newer 105 | # Visual Studio version. Backup files are not needed, because we have git ;-) 106 | _UpgradeReport_Files/ 107 | Backup*/ 108 | UpgradeLog*.XML 109 | 110 | .vs 111 | .idea 112 | 113 | License.config -------------------------------------------------------------------------------- /.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/.nuget/NuGet.exe -------------------------------------------------------------------------------- /Geta.Tags.Sample.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.168 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Geta.Tags.Sample", "samples\Geta.Tags.Sample\Geta.Tags.Sample.csproj", "{9B5E6C7A-733C-4120-A3EA-6E087AF9C43B}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Geta.Tags", "src\Geta.Tags.csproj", "{DAC7C620-4960-4523-8ED6-352D9FBF5E17}" 9 | EndProject 10 | Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "samples\Geta.Tags.Sample\docker-compose.dcproj", "{072EFCDC-EAC4-48FF-8E5D-EFCE769492D6}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {9B5E6C7A-733C-4120-A3EA-6E087AF9C43B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {9B5E6C7A-733C-4120-A3EA-6E087AF9C43B}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {9B5E6C7A-733C-4120-A3EA-6E087AF9C43B}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {9B5E6C7A-733C-4120-A3EA-6E087AF9C43B}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {072EFCDC-EAC4-48FF-8E5D-EFCE769492D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {072EFCDC-EAC4-48FF-8E5D-EFCE769492D6}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {072EFCDC-EAC4-48FF-8E5D-EFCE769492D6}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {072EFCDC-EAC4-48FF-8E5D-EFCE769492D6}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {14AA133D-09CF-477C-9DAD-88882DE2B9FB} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /Geta.Tags.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Geta.Tags", "src\Geta.Tags.csproj", "{DAC7C620-4960-4523-8ED6-352D9FBF5E17}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {DAC7C620-4960-4523-8ED6-352D9FBF5E17}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/editor-guide.md: -------------------------------------------------------------------------------- 1 | # Editor guide 2 | 3 | ## Tags property 4 | 5 | Once the developer installed the package and defined a Tags property on a page or block the property will appear in the CMS. In the text field, a tag can be typed. After pressing enter the tag is created. By clicking the 'x' the tag is removed. 6 | 7 | ![Tags property](images/tags-property.PNG) 8 | 9 | ## Geta Tags Management 10 | 11 | In the admin mode, a new plugin is available under the 'tools' menu section. The management view provides the ability to search, modify and delete a tag. 12 | 13 | ![Tags management](images/tags-management.PNG) 14 | 15 | ## Geta Tags maintenance scheduled job 16 | 17 | - A scheduled job that verifies all content - tag relations. 18 | 19 | ![Tags management](images/tags-scheduled-job.PNG) 20 | -------------------------------------------------------------------------------- /docs/images/docker-output.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/docs/images/docker-output.PNG -------------------------------------------------------------------------------- /docs/images/tags-management.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/docs/images/tags-management.PNG -------------------------------------------------------------------------------- /docs/images/tags-property.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/docs/images/tags-property.PNG -------------------------------------------------------------------------------- /docs/images/tags-scheduled-job.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/docs/images/tags-scheduled-job.PNG -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/.dockerignore: -------------------------------------------------------------------------------- 1 | * 2 | !obj\Docker\publish\* 3 | !obj\Docker\empty\ 4 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/DefaultSiteContent.episerverdata: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/DefaultSiteContent.episerverdata -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/EPiServerDB_dada52e0.mdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/EPiServerDB_dada52e0.mdf -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/EPiServerDB_dada52e0_log.ldf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/EPiServerDB_dada52e0_log.ldf -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/GeoLiteCity.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/GeoLiteCity.dat -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/094c430f2676466e90171b10a984be9d/ccdc110de0d64864b73fcb36c1b77a53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/094c430f2676466e90171b10a984be9d/ccdc110de0d64864b73fcb36c1b77a53.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/094c430f2676466e90171b10a984be9d/ccdc110de0d64864b73fcb36c1b77a53_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/094c430f2676466e90171b10a984be9d/ccdc110de0d64864b73fcb36c1b77a53_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/0d555ea2a6364fb29772ddcf2fb471f8/eb53bd3a3bd442d98db93e8d2c3fc1af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/0d555ea2a6364fb29772ddcf2fb471f8/eb53bd3a3bd442d98db93e8d2c3fc1af.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/0d555ea2a6364fb29772ddcf2fb471f8/eb53bd3a3bd442d98db93e8d2c3fc1af_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/0d555ea2a6364fb29772ddcf2fb471f8/eb53bd3a3bd442d98db93e8d2c3fc1af_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/32f12dbaf6e1417dbf63a1f5f856e80e/8fbb14eb5b8948fd80cbe9b6484ad482.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/32f12dbaf6e1417dbf63a1f5f856e80e/8fbb14eb5b8948fd80cbe9b6484ad482.mp4 -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/417e2ec5592b4323be2019a2430ff5fc/f08006eb5ef94dcb812559722f8de4d0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/417e2ec5592b4323be2019a2430ff5fc/f08006eb5ef94dcb812559722f8de4d0.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/4a50150b3763454c8c5046d68aff054c/0e06c4e11a794b428ab4f881663b88e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/4a50150b3763454c8c5046d68aff054c/0e06c4e11a794b428ab4f881663b88e8.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/4e3fac8b5eb443c2abacd7e673ba8a04/92c46e048fef43d6978fb9afed9f5aaa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/4e3fac8b5eb443c2abacd7e673ba8a04/92c46e048fef43d6978fb9afed9f5aaa.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/4ec3ed058d734ad8aad3943ef66ff6f7/e6b6a9b869714ea485f3fd17c38b537f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/4ec3ed058d734ad8aad3943ef66ff6f7/e6b6a9b869714ea485f3fd17c38b537f.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/4f27f05bb95f4b8cb30f1e3719cfa9f4/17183bbd93a049bb9911f4baeebeff3e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/4f27f05bb95f4b8cb30f1e3719cfa9f4/17183bbd93a049bb9911f4baeebeff3e.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/50a2c743f390435d9750f04eb9b151a6/723817a183ac4ada82e87421f1bf4033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/50a2c743f390435d9750f04eb9b151a6/723817a183ac4ada82e87421f1bf4033.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/50a2c743f390435d9750f04eb9b151a6/723817a183ac4ada82e87421f1bf4033_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/50a2c743f390435d9750f04eb9b151a6/723817a183ac4ada82e87421f1bf4033_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6732a09cb32c49b580dbbf55a6ddcabd/e5b75ca76f414e5a8a7b7ca19ee41841.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6732a09cb32c49b580dbbf55a6ddcabd/e5b75ca76f414e5a8a7b7ca19ee41841.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6732a09cb32c49b580dbbf55a6ddcabd/e5b75ca76f414e5a8a7b7ca19ee41841_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6732a09cb32c49b580dbbf55a6ddcabd/e5b75ca76f414e5a8a7b7ca19ee41841_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6abfd55bb7a84e1d96f2ba44cd0f5533/7e0637ed94d34711a656619e53f487e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6abfd55bb7a84e1d96f2ba44cd0f5533/7e0637ed94d34711a656619e53f487e8.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6abfd55bb7a84e1d96f2ba44cd0f5533/7e0637ed94d34711a656619e53f487e8_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6abfd55bb7a84e1d96f2ba44cd0f5533/7e0637ed94d34711a656619e53f487e8_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6ad43b90e8c04023a609ff650dfd58a2/1a8e1607451f46508bc92399484aac6b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6ad43b90e8c04023a609ff650dfd58a2/1a8e1607451f46508bc92399484aac6b.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6ad43b90e8c04023a609ff650dfd58a2/1a8e1607451f46508bc92399484aac6b_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6ad43b90e8c04023a609ff650dfd58a2/1a8e1607451f46508bc92399484aac6b_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6f239d462300482cac0a072aef039fb8/5af56c1426724c0ca388e9c2ea6399d0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6f239d462300482cac0a072aef039fb8/5af56c1426724c0ca388e9c2ea6399d0.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/6f239d462300482cac0a072aef039fb8/5af56c1426724c0ca388e9c2ea6399d0_Thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/6f239d462300482cac0a072aef039fb8/5af56c1426724c0ca388e9c2ea6399d0_Thumbnail.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/76b377e3e23542b2ae704e63e792a6aa/2aedf124d98949208342b1ec395f07c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/76b377e3e23542b2ae704e63e792a6aa/2aedf124d98949208342b1ec395f07c3.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/76b377e3e23542b2ae704e63e792a6aa/2aedf124d98949208342b1ec395f07c3_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/76b377e3e23542b2ae704e63e792a6aa/2aedf124d98949208342b1ec395f07c3_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/776fce7f48ac46a8ba1247d1aa627fd1/0a3b3bfc98c644458cf557c98a999c1a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/776fce7f48ac46a8ba1247d1aa627fd1/0a3b3bfc98c644458cf557c98a999c1a.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/7fe4dd02a3ff4a648fef52ee5859c413/73bc58da26334206b2fee86b6f7c0a65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/7fe4dd02a3ff4a648fef52ee5859c413/73bc58da26334206b2fee86b6f7c0a65.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/7fe4dd02a3ff4a648fef52ee5859c413/73bc58da26334206b2fee86b6f7c0a65_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/7fe4dd02a3ff4a648fef52ee5859c413/73bc58da26334206b2fee86b6f7c0a65_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/8606aaa6289a4ce396773d595a8a7792/78e08f306fc44c03888da8bab14fee3e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/8606aaa6289a4ce396773d595a8a7792/78e08f306fc44c03888da8bab14fee3e.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/8606aaa6289a4ce396773d595a8a7792/78e08f306fc44c03888da8bab14fee3e_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/8606aaa6289a4ce396773d595a8a7792/78e08f306fc44c03888da8bab14fee3e_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/8c8ac35eda864294a169e6e613cb08a5/930770cbd8c9437da02cb1c0468945c2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/8c8ac35eda864294a169e6e613cb08a5/930770cbd8c9437da02cb1c0468945c2.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/9c2738d0ad92491b8114d8accf43f5c3/26d4468ea1a24ddcb287b129546bc9bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/9c2738d0ad92491b8114d8accf43f5c3/26d4468ea1a24ddcb287b129546bc9bb.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/9c2738d0ad92491b8114d8accf43f5c3/26d4468ea1a24ddcb287b129546bc9bb_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/9c2738d0ad92491b8114d8accf43f5c3/26d4468ea1a24ddcb287b129546bc9bb_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/9fa7df2bdc9c42199f16580a9f5c756e/642752e9ab914dbc8bfbff7b158c1a0b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/9fa7df2bdc9c42199f16580a9f5c756e/642752e9ab914dbc8bfbff7b158c1a0b.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/9fd1cabae89147fb8577199e8f8143eb/36444e66f2354570b131138f502e14d4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/9fd1cabae89147fb8577199e8f8143eb/36444e66f2354570b131138f502e14d4.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/a3fbbb6bb1dd49b08afc8c37b5ad75ec/364d4d07c3fa4f8db401ce9504688eec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/a3fbbb6bb1dd49b08afc8c37b5ad75ec/364d4d07c3fa4f8db401ce9504688eec.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/a8e6b275490141bfb3b4080d6b20db8d/ad15c26de9ae4961bb2684c9fc0e3a22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/a8e6b275490141bfb3b4080d6b20db8d/ad15c26de9ae4961bb2684c9fc0e3a22.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/b03e1372195f48bf967b43ebdfd08568/14a448bd83c44587807a4aab90d730b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/b03e1372195f48bf967b43ebdfd08568/14a448bd83c44587807a4aab90d730b1.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/b555b79ab39746058a5cdf4c8d76d08e/3654f95ce9c243b88a097eafa064ebda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/b555b79ab39746058a5cdf4c8d76d08e/3654f95ce9c243b88a097eafa064ebda.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/b555b79ab39746058a5cdf4c8d76d08e/3654f95ce9c243b88a097eafa064ebda_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/b555b79ab39746058a5cdf4c8d76d08e/3654f95ce9c243b88a097eafa064ebda_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/b7e4a1e4a02c48a791cd73231756af9f/6598d114649f403494a5e39ae0e52e12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/b7e4a1e4a02c48a791cd73231756af9f/6598d114649f403494a5e39ae0e52e12.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/b7e4a1e4a02c48a791cd73231756af9f/6598d114649f403494a5e39ae0e52e12_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/b7e4a1e4a02c48a791cd73231756af9f/6598d114649f403494a5e39ae0e52e12_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/bafc176a21074847b0dc7ff64c527759/c101fa5b5d844132bd6e0662c89fdd91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/bafc176a21074847b0dc7ff64c527759/c101fa5b5d844132bd6e0662c89fdd91.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/bafc176a21074847b0dc7ff64c527759/c101fa5b5d844132bd6e0662c89fdd91_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/bafc176a21074847b0dc7ff64c527759/c101fa5b5d844132bd6e0662c89fdd91_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/bde6a70e95524eaea84b06cb4fbb211a/75b9ce805d054490bca033587498917a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/bde6a70e95524eaea84b06cb4fbb211a/75b9ce805d054490bca033587498917a.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/bde6a70e95524eaea84b06cb4fbb211a/75b9ce805d054490bca033587498917a_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/bde6a70e95524eaea84b06cb4fbb211a/75b9ce805d054490bca033587498917a_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/c510d8f3d2b84bdb833cfca23dbd2e8b/ecc95455fbcf46dfb11d8a8515dacf79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/c510d8f3d2b84bdb833cfca23dbd2e8b/ecc95455fbcf46dfb11d8a8515dacf79.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/cff0728d83194743a85f95555eba8423/4744fa764ccc4f51876166ac614abe10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/cff0728d83194743a85f95555eba8423/4744fa764ccc4f51876166ac614abe10.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/f89fdb41edc14984b8d6836e19fe12bf/7dba176dd85e4d898462b6f11111b163.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/f89fdb41edc14984b8d6836e19fe12bf/7dba176dd85e4d898462b6f11111b163.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/App_Data/blobs/f89fdb41edc14984b8d6836e19fe12bf/7dba176dd85e4d898462b6f11111b163_Thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/App_Data/blobs/f89fdb41edc14984b8d6836e19fe12bf/7dba176dd85e4d898462b6f11111b163_Thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/AdministratorRegistrationPage.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.ServiceLocation; 2 | using EPiServer.Shell.Security; 3 | using Owin; 4 | using System; 5 | using System.Web; 6 | using System.Web.Mvc; 7 | using System.Web.Routing; 8 | 9 | namespace Geta.Tags.Demo 10 | { 11 | public static class AdministratorRegistrationPage 12 | { 13 | private static Func _isLocalRequest = () => false; 14 | 15 | private static Lazy _isAnyUserRegistered = new Lazy(() => false); 16 | 17 | private static bool? _isEnabled = null; 18 | 19 | public static bool IsEnabled 20 | { 21 | get 22 | { 23 | if (_isEnabled.HasValue) 24 | { 25 | return _isEnabled.Value; 26 | } 27 | 28 | var showUserRegistration = _isLocalRequest() && !_isAnyUserRegistered.Value; 29 | if (!showUserRegistration) 30 | { 31 | _isEnabled = false; 32 | } 33 | 34 | return showUserRegistration; 35 | } 36 | set 37 | { 38 | _isEnabled = value; 39 | } 40 | } 41 | 42 | public static void UseAdministratorRegistrationPage(this IAppBuilder app, Func isLocalRequest) 43 | { 44 | _isLocalRequest = isLocalRequest; 45 | _isAnyUserRegistered = new Lazy(IsAnyUserRegistered); 46 | GlobalFilters.Filters.Add(new RegistrationActionFilterAttribute()); 47 | if (isLocalRequest()) 48 | { 49 | AddRoute(); 50 | } 51 | } 52 | 53 | private static bool IsAnyUserRegistered() 54 | { 55 | var provider = ServiceLocator.Current.GetInstance(); 56 | int totalUsers = 0; 57 | var res = provider.GetAllUsers(0, 1, out totalUsers); 58 | return totalUsers > 0; 59 | } 60 | 61 | public class RegistrationActionFilterAttribute : ActionFilterAttribute 62 | { 63 | public override void OnActionExecuting(ActionExecutingContext context) 64 | { 65 | var registerUrl = VirtualPathUtility.ToAbsolute("~/Register"); 66 | if (IsEnabled && !context.RequestContext.HttpContext.Request.Path.StartsWith(registerUrl)) 67 | { 68 | context.Result = new RedirectResult(registerUrl); 69 | } 70 | } 71 | } 72 | 73 | static void AddRoute() 74 | { 75 | var routeData = new RouteValueDictionary(); 76 | routeData.Add("Controller", "Register"); 77 | routeData.Add("action", "Index"); 78 | routeData.Add("id", " UrlParameter.Optional"); 79 | RouteTable.Routes.Add("Register", new Route("{controller}/{action}/{id}", routeData, new MvcRouteHandler()) { RouteExistingFiles = false }); 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Channels/DisplayResolutionBase.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Framework.Localization; 2 | using EPiServer.ServiceLocation; 3 | using EPiServer.Web; 4 | 5 | namespace Geta.Tags.Demo.Business.Channels 6 | { 7 | /// 8 | /// Base class for all resolution definitions 9 | /// 10 | public abstract class DisplayResolutionBase : IDisplayResolution 11 | { 12 | private Injected LocalizationService { get; set; } 13 | 14 | protected DisplayResolutionBase(string name, int width, int height) 15 | { 16 | Id = GetType().FullName; 17 | Name = Translate(name); 18 | Width = width; 19 | Height = height; 20 | } 21 | 22 | /// 23 | /// Gets the unique ID for this resolution 24 | /// 25 | public string Id { get; protected set; } 26 | 27 | /// 28 | /// Gets the name of resolution 29 | /// 30 | public string Name { get; protected set; } 31 | 32 | /// 33 | /// Gets the resolution width in pixels 34 | /// 35 | public int Width { get; protected set; } 36 | 37 | /// 38 | /// Gets the resolution height in pixels 39 | /// 40 | public int Height { get; protected set; } 41 | 42 | private string Translate(string resurceKey) 43 | { 44 | string value; 45 | 46 | if(!LocalizationService.Service.TryGetString(resurceKey, out value)) 47 | { 48 | value = resurceKey; 49 | } 50 | 51 | return value; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Channels/DisplayResolutions.cs: -------------------------------------------------------------------------------- 1 | namespace Geta.Tags.Demo.Business.Channels 2 | { 3 | /// 4 | /// Defines resolution for desktop displays 5 | /// 6 | public class StandardResolution : DisplayResolutionBase 7 | { 8 | public StandardResolution() : base("/resolutions/standard", 1366, 768) 9 | { 10 | } 11 | } 12 | 13 | /// 14 | /// Defines resolution for a horizontal iPad 15 | /// 16 | public class IpadHorizontalResolution : DisplayResolutionBase 17 | { 18 | public IpadHorizontalResolution() : base("/resolutions/ipadhorizontal", 1024, 768) 19 | { 20 | } 21 | } 22 | 23 | /// 24 | /// Defines resolution for a vertical iPhone 5s 25 | /// 26 | public class IphoneVerticalResolution : DisplayResolutionBase 27 | { 28 | public IphoneVerticalResolution() : base("/resolutions/iphonevertical", 320, 568) 29 | { 30 | } 31 | } 32 | 33 | /// 34 | /// Defines resolution for a vertical Android handheld device 35 | /// 36 | public class AndroidVerticalResolution : DisplayResolutionBase 37 | { 38 | public AndroidVerticalResolution() : base("/resolutions/androidvertical", 480, 800) 39 | { 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Channels/MobileChannel.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.WebPages; 3 | using EPiServer.Web; 4 | 5 | namespace Geta.Tags.Demo.Business.Channels 6 | { 7 | // 8 | //Defines the 'Mobile' content channel 9 | // 10 | public class MobileChannel : DisplayChannel 11 | { 12 | public const string Name = "mobile"; 13 | 14 | public override string ChannelName 15 | { 16 | get 17 | { 18 | return Name; 19 | } 20 | } 21 | 22 | public override string ResolutionId 23 | { 24 | get 25 | { 26 | return typeof(IphoneVerticalResolution).FullName; 27 | } 28 | } 29 | 30 | public override bool IsActive(HttpContextBase context) 31 | { 32 | return context.GetOverriddenBrowser().IsMobileDevice; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Channels/WebChannel.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using EPiServer.Web; 3 | 4 | namespace Geta.Tags.Demo.Business.Channels 5 | { 6 | /// 7 | /// Defines the 'Web' content channel 8 | /// 9 | public class WebChannel : DisplayChannel 10 | { 11 | public override string ChannelName 12 | { 13 | get 14 | { 15 | return "web"; 16 | } 17 | } 18 | 19 | public override bool IsActive(HttpContextBase context) 20 | { 21 | return !context.Request.Browser.IsMobileDevice; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/ContentExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using EPiServer.Core; 4 | using EPiServer.Filters; 5 | using EPiServer.Framework.Web; 6 | using EPiServer.ServiceLocation; 7 | using EPiServer; 8 | 9 | namespace Geta.Tags.Demo.Business 10 | { 11 | /// 12 | /// Extension methods for content 13 | /// 14 | public static class ContentExtensions 15 | { 16 | /// 17 | /// Filters content which should not be visible to the user. 18 | /// 19 | public static IEnumerable FilterForDisplay(this IEnumerable contents, bool requirePageTemplate = false, bool requireVisibleInMenu = false) 20 | where T : IContent 21 | { 22 | var accessFilter = new FilterAccess(); 23 | var publishedFilter = new FilterPublished(); 24 | contents = contents.Where(x => !publishedFilter.ShouldFilter(x) && !accessFilter.ShouldFilter(x)); 25 | if (requirePageTemplate) 26 | { 27 | var templateFilter = ServiceLocator.Current.GetInstance(); 28 | templateFilter.TemplateTypeCategories = TemplateTypeCategories.Page; 29 | contents = contents.Where(x => !templateFilter.ShouldFilter(x)); 30 | } 31 | if (requireVisibleInMenu) 32 | { 33 | contents = contents.Where(x => VisibleInMenu(x)); 34 | } 35 | return contents; 36 | } 37 | 38 | private static bool VisibleInMenu(IContent content) 39 | { 40 | var page = content as PageData; 41 | if (page == null) 42 | { 43 | return true; 44 | } 45 | return page.VisibleInMenu; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/EditorDescriptors/ContactPageSelectionFactory.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using EPiServer.ServiceLocation; 4 | using EPiServer.Shell.ObjectEditing; 5 | 6 | namespace Geta.Tags.Demo.Business.EditorDescriptors 7 | { 8 | /// 9 | /// Provides a list of options corresponding to ContactPage pages on the site 10 | /// 11 | /// 12 | public class ContactPageSelectionFactory : ISelectionFactory 13 | { 14 | private Injected ContentLocator { get; set; } 15 | 16 | public IEnumerable GetSelections(ExtendedMetadata metadata) 17 | { 18 | var contactPages = ContentLocator.Service.GetContactPages(); 19 | 20 | return new List(contactPages.Select(c => new SelectItem {Value = c.PageLink, Text = c.Name})); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/EditorDescriptors/ContactPageSelector.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using EPiServer.Core; 4 | using EPiServer.Shell.ObjectEditing; 5 | using EPiServer.Shell.ObjectEditing.EditorDescriptors; 6 | 7 | namespace Geta.Tags.Demo.Business.EditorDescriptors 8 | { 9 | /// 10 | /// Registers an editor to select a ContactPage for a PageReference property using a dropdown 11 | /// 12 | [EditorDescriptorRegistration(TargetType = typeof(PageReference), UIHint = Global.SiteUIHints.Contact)] 13 | public class ContactPageSelector : EditorDescriptor 14 | { 15 | public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable attributes) 16 | { 17 | SelectionFactoryType = typeof(ContactPageSelectionFactory); 18 | 19 | ClientEditingClass = "epi-cms/contentediting/editors/SelectionEditor"; 20 | 21 | base.ModifyMetadata(metadata, attributes); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/EditorDescriptors/StringListEditorDescriptor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using EPiServer.Shell.ObjectEditing.EditorDescriptors; 4 | using EPiServer.Shell.ObjectEditing; 5 | 6 | namespace Geta.Tags.Demo.Business.EditorDescriptors 7 | { 8 | /// 9 | /// Register an editor for StringList properties 10 | /// 11 | [EditorDescriptorRegistration(TargetType = typeof(String[]), UIHint = Global.SiteUIHints.Strings)] 12 | public class StringListEditorDescriptor : EditorDescriptor 13 | { 14 | public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable attributes) 15 | { 16 | ClientEditingClass = "alloy/editors/StringList"; 17 | 18 | base.ModifyMetadata(metadata, attributes); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/IModifyLayout.cs: -------------------------------------------------------------------------------- 1 | using Geta.Tags.Demo.Models.ViewModels; 2 | 3 | namespace Geta.Tags.Demo.Business 4 | { 5 | /// 6 | /// Defines a method which may be invoked by PageContextActionFilter allowing controllers 7 | /// to modify common layout properties of the view model. 8 | /// 9 | interface IModifyLayout 10 | { 11 | void ModifyLayout(LayoutModel layoutModel); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/BundleConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Optimization; 2 | using EPiServer.Framework; 3 | using EPiServer.Framework.Initialization; 4 | 5 | namespace Geta.Tags.Demo.Business.Initialization 6 | { 7 | [InitializableModule] 8 | public class BundleConfig : IInitializableModule 9 | { 10 | public void Initialize(InitializationEngine context) 11 | { 12 | if (context.HostType == HostType.WebApplication) 13 | { 14 | RegisterBundles(BundleTable.Bundles); 15 | } 16 | } 17 | 18 | // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725 19 | public static void RegisterBundles(BundleCollection bundles) 20 | { 21 | bundles.Add(new ScriptBundle("~/bundles/js").Include( 22 | "~/Static/js/jquery.js", //jquery.js can be removed and linked from CDN instead, we use a local one for demo purposes without internet connectionzz 23 | "~/Static/js/bootstrap.js")); 24 | 25 | bundles.Add(new StyleBundle("~/bundles/css") 26 | .Include("~/Static/css/bootstrap.css", new CssRewriteUrlTransform()) 27 | .Include("~/Static/css/bootstrap-responsive.css") 28 | .Include("~/Static/css/media.css") 29 | .Include("~/Static/css/style.css", new CssRewriteUrlTransform()) 30 | .Include("~/Static/css/editmode.css")); 31 | } 32 | 33 | public void Uninitialize(InitializationEngine context) 34 | { 35 | } 36 | 37 | public void Preload(string[] parameters) 38 | { 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/CustomizedRenderingInitialization.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using EPiServer.Framework; 3 | using EPiServer.Framework.Initialization; 4 | using EPiServer.ServiceLocation; 5 | using Geta.Tags.Demo.Business.Rendering; 6 | using EPiServer.Web; 7 | 8 | namespace Geta.Tags.Demo.Business.Initialization 9 | { 10 | /// 11 | /// Module for customizing templates and rendering. 12 | /// 13 | [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 14 | public class CustomizedRenderingInitialization : IInitializableModule 15 | { 16 | public void Initialize(InitializationEngine context) 17 | { 18 | //Add custom view engine allowing partials to be placed in additional locations 19 | //Note that we add it first in the list to optimize view resolving when using DisplayFor/PropertyFor 20 | ViewEngines.Engines.Insert(0, new SiteViewEngine()); 21 | 22 | context.Locate.TemplateResolver() 23 | .TemplateResolved += TemplateCoordinator.OnTemplateResolved; 24 | } 25 | 26 | public void Uninitialize(InitializationEngine context) 27 | { 28 | ServiceLocator.Current.GetInstance() 29 | .TemplateResolved -= TemplateCoordinator.OnTemplateResolved; 30 | } 31 | 32 | public void Preload(string[] parameters) 33 | { 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/DependencyResolverInitialization.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using EPiServer.Framework; 3 | using EPiServer.Framework.Initialization; 4 | using EPiServer.ServiceLocation; 5 | using Geta.Tags.Demo.Business.Rendering; 6 | using EPiServer.Web.Mvc; 7 | using EPiServer.Web.Mvc.Html; 8 | 9 | namespace Geta.Tags.Demo.Business.Initialization 10 | { 11 | [InitializableModule] 12 | public class DependencyResolverInitialization : IConfigurableModule 13 | { 14 | public void ConfigureContainer(ServiceConfigurationContext context) 15 | { 16 | //Implementations for custom interfaces can be registered here. 17 | 18 | context.ConfigurationComplete += (o, e) => 19 | { 20 | //Register custom implementations that should be used in favour of the default implementations 21 | context.Services.AddTransient() 22 | .AddTransient(); 23 | }; 24 | } 25 | 26 | public void Initialize(InitializationEngine context) 27 | { 28 | DependencyResolver.SetResolver(new ServiceLocatorDependencyResolver(context.Locate.Advanced)); 29 | } 30 | 31 | public void Uninitialize(InitializationEngine context) 32 | { 33 | } 34 | 35 | public void Preload(string[] parameters) 36 | { 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/DisplayModesInitialization.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Web; 3 | using System.Web.WebPages; 4 | using EPiServer.Framework; 5 | using EPiServer.Framework.Initialization; 6 | using EPiServer.ServiceLocation; 7 | using Geta.Tags.Demo.Business.Channels; 8 | using EPiServer.Web; 9 | 10 | namespace Geta.Tags.Demo.Business.Initialization 11 | { 12 | /// 13 | /// Adds a new display mode for mobile which is active if the mobile channel is active in addition to if the request is from a mobile device (like the default one) 14 | /// 15 | /// 16 | /// It's also possible to map a display mode as a channel through the DisplayChannelService.RegisterDisplayMode() method. 17 | /// Adding channels that way does not however enable specifying ResolutionId which we want to do for the mobile channel. 18 | /// 19 | [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 20 | public class DisplayModesInitialization : IInitializableModule 21 | { 22 | public void Initialize(InitializationEngine context) 23 | { 24 | var mobileChannelDisplayMode = new DefaultDisplayMode("mobile") 25 | { 26 | ContextCondition = IsMobileDisplayModeActive 27 | }; 28 | DisplayModeProvider.Instance.Modes.Insert(0, mobileChannelDisplayMode); 29 | } 30 | 31 | private static bool IsMobileDisplayModeActive(HttpContextBase httpContext) 32 | { 33 | if (httpContext.GetOverriddenBrowser().IsMobileDevice) 34 | { 35 | return true; 36 | } 37 | var displayChannelService = ServiceLocator.Current.GetInstance(); 38 | return displayChannelService.GetActiveChannels(httpContext).Any(x => x.ChannelName == MobileChannel.Name); 39 | } 40 | 41 | public void Uninitialize(InitializationEngine context) 42 | { 43 | } 44 | 45 | public void Preload(string[] parameters) 46 | { 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/DisplayRegistryInitialization.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Framework; 2 | using EPiServer.Framework.Initialization; 3 | using EPiServer.ServiceLocation; 4 | using EPiServer.Web; 5 | using System.Collections.Generic; 6 | using System.Web.Mvc; 7 | 8 | namespace Geta.Tags.Demo.Business.Initialization 9 | { 10 | [InitializableModule] 11 | [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 12 | public class DisplayRegistryInitialization : IInitializableModule 13 | { 14 | public void Initialize(InitializationEngine context) 15 | { 16 | if (context.HostType == HostType.WebApplication) 17 | { 18 | // Register Display Options 19 | var options = ServiceLocator.Current.GetInstance(); 20 | options 21 | .Add("full", "/displayoptions/full", Global.ContentAreaTags.FullWidth, "", "epi-icon__layout--full") 22 | .Add("wide", "/displayoptions/wide", Global.ContentAreaTags.TwoThirdsWidth, "", "epi-icon__layout--two-thirds") 23 | .Add("narrow", "/displayoptions/narrow", Global.ContentAreaTags.OneThirdWidth, "", "epi-icon__layout--one-third"); 24 | 25 | AreaRegistration.RegisterAllAreas(); 26 | 27 | } 28 | } 29 | 30 | public void Preload(string[] parameters){} 31 | 32 | public void Uninitialize(InitializationEngine context){} 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/ExtendedTinyMceInitialization.cs: -------------------------------------------------------------------------------- 1 | using Geta.Tags.Demo.Models.Blocks; 2 | using Geta.Tags.Demo.Models.Pages; 3 | using EPiServer.Cms.TinyMce.Core; 4 | using EPiServer.Framework; 5 | using EPiServer.Framework.Initialization; 6 | using EPiServer.ServiceLocation; 7 | 8 | namespace Geta.Tags.Demo.Business.Initialization 9 | { 10 | [ModuleDependency(typeof(TinyMceInitialization))] 11 | public class ExtendedTinyMceInitialization : IConfigurableModule 12 | { 13 | public void Initialize(InitializationEngine context) 14 | { 15 | } 16 | 17 | public void Uninitialize(InitializationEngine context) 18 | { 19 | } 20 | 21 | public void ConfigureContainer(ServiceConfigurationContext context) 22 | { 23 | context.Services.Configure(config => 24 | { 25 | // Add content CSS to the default settings. 26 | config.Default() 27 | .ContentCss("/static/css/editor.css"); 28 | 29 | // This will clone the default settings object and extend it by 30 | // limiting the block formats for the MainBody property of an ArticlePage. 31 | config.For(t => t.MainBody) 32 | .BlockFormats("Paragraph=p;Header 1=h1;Header 2=h2;Header 3=h3"); 33 | 34 | // Passing a second argument to For<> will clone the given settings object 35 | // instead of the default one and extend it with some basic toolbar commands. 36 | config.For(t => t.MainBody, config.Empty()) 37 | .AddEpiserverSupport() 38 | .DisableMenubar() 39 | .Toolbar("bold italic underline strikethrough"); 40 | }); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Initialization/FilterConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using EPiServer.Framework; 3 | using EPiServer.Framework.Initialization; 4 | using EPiServer.ServiceLocation; 5 | 6 | namespace Geta.Tags.Demo.Business.Initialization 7 | { 8 | /// 9 | /// Module for registering filters which will be applied to controller actions. 10 | /// 11 | [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 12 | public class FilterConfig : IInitializableModule 13 | { 14 | public void Initialize(InitializationEngine context) 15 | { 16 | GlobalFilters.Filters.Add(ServiceLocator.Current.GetInstance()); 17 | } 18 | 19 | public void Uninitialize(InitializationEngine context) 20 | { 21 | } 22 | 23 | public void Preload(string[] parameters) 24 | { 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/PageContextActionFilter.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Geta.Tags.Demo.Models.Pages; 3 | using Geta.Tags.Demo.Models.ViewModels; 4 | using EPiServer.Web.Routing; 5 | 6 | namespace Geta.Tags.Demo.Business 7 | { 8 | /// 9 | /// Intercepts actions with view models of type IPageViewModel and populates the view models 10 | /// Layout and Section properties. 11 | /// 12 | /// 13 | /// This filter frees controllers for pages from having to care about common context needed by layouts 14 | /// and other page framework components allowing the controllers to focus on the specifics for the page types 15 | /// and actions that they handle. 16 | /// 17 | public class PageContextActionFilter : IResultFilter 18 | { 19 | private readonly PageViewContextFactory _contextFactory; 20 | public PageContextActionFilter(PageViewContextFactory contextFactory) 21 | { 22 | _contextFactory = contextFactory; 23 | } 24 | 25 | public void OnResultExecuting(ResultExecutingContext filterContext) 26 | { 27 | var viewModel = filterContext.Controller.ViewData.Model; 28 | 29 | var model = viewModel as IPageViewModel; 30 | if (model != null) 31 | { 32 | var currentContentLink = filterContext.RequestContext.GetContentLink(); 33 | 34 | var layoutModel = model.Layout ?? _contextFactory.CreateLayoutModel(currentContentLink, filterContext.RequestContext); 35 | 36 | var layoutController = filterContext.Controller as IModifyLayout; 37 | if(layoutController != null) 38 | { 39 | layoutController.ModifyLayout(layoutModel); 40 | } 41 | 42 | model.Layout = layoutModel; 43 | 44 | if (model.Section == null) 45 | { 46 | model.Section = _contextFactory.GetSection(currentContentLink); 47 | } 48 | } 49 | } 50 | 51 | public void OnResultExecuted(ResultExecutedContext filterContext) 52 | { 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/PageTypeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using EPiServer.DataAbstraction; 3 | using EPiServer.ServiceLocation; 4 | 5 | namespace Geta.Tags.Demo.Business 6 | { 7 | /// 8 | /// Provides extension methods for types intended to be used when working with page types 9 | /// 10 | public static class PageTypeExtensions 11 | { 12 | /// 13 | /// Returns the definition for a specific page type 14 | /// 15 | /// 16 | /// 17 | public static PageType GetPageType(this Type pageType) 18 | { 19 | var pageTypeRepository = ServiceLocator.Current.GetInstance>(); 20 | 21 | return pageTypeRepository.Load(pageType); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Rendering/AlloyContentAreaRenderer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web.Mvc; 3 | using EPiServer.Core; 4 | using EPiServer.Core.Html.StringParsing; 5 | using EPiServer.Web; 6 | using EPiServer.Web.Mvc; 7 | using EPiServer.Web.Mvc.Html; 8 | using EPiServer; 9 | 10 | namespace Geta.Tags.Demo.Business.Rendering 11 | { 12 | /// 13 | /// Extends the default to apply custom CSS classes to each . 14 | /// 15 | public class AlloyContentAreaRenderer : ContentAreaRenderer 16 | { 17 | protected override string GetContentAreaItemCssClass(HtmlHelper htmlHelper, ContentAreaItem contentAreaItem) 18 | { 19 | var baseItemClass = base.GetContentAreaItemCssClass(htmlHelper, contentAreaItem); 20 | 21 | var tag = GetContentAreaItemTemplateTag(htmlHelper, contentAreaItem); 22 | return $"block {baseItemClass} {GetTypeSpecificCssClasses(contentAreaItem, ContentRepository)} {GetCssClassForTag(tag)} {tag}"; 23 | } 24 | 25 | /// 26 | /// Gets a CSS class used for styling based on a tag name (ie a Bootstrap class name) 27 | /// 28 | /// Any tag name available, see 29 | private static string GetCssClassForTag(string tagName) 30 | { 31 | if (string.IsNullOrEmpty(tagName)) 32 | { 33 | return ""; 34 | } 35 | switch (tagName.ToLower()) 36 | { 37 | case "span12": 38 | return "full"; 39 | case "span8": 40 | return "wide"; 41 | case "span6": 42 | return "half"; 43 | default: 44 | return string.Empty; 45 | } 46 | } 47 | 48 | private static string GetTypeSpecificCssClasses(ContentAreaItem contentAreaItem, IContentRepository contentRepository) 49 | { 50 | var content = contentAreaItem.GetContent(); 51 | var cssClass = content == null ? String.Empty : content.GetOriginalType().Name.ToLowerInvariant(); 52 | 53 | var customClassContent = content as ICustomCssInContentArea; 54 | if (customClassContent != null && !string.IsNullOrWhiteSpace(customClassContent.ContentAreaCssClass)) 55 | { 56 | cssClass += string.Format(" {0}", customClassContent.ContentAreaCssClass); 57 | } 58 | 59 | return cssClass; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Rendering/IContainerPage.cs: -------------------------------------------------------------------------------- 1 | namespace Geta.Tags.Demo.Business.Rendering 2 | { 3 | /// 4 | /// Marker interface for content types which should not be handled by DefaultPageController. 5 | /// 6 | interface IContainerPage 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Rendering/ICustomCssInContentArea.cs: -------------------------------------------------------------------------------- 1 | namespace Geta.Tags.Demo.Business.Rendering 2 | { 3 | /// 4 | /// Defines a property for CSS class(es) which will be added to the class 5 | /// attribute of containing elements when rendered in a content area with a size tag. 6 | /// 7 | interface ICustomCssInContentArea 8 | { 9 | string ContentAreaCssClass { get; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/Rendering/SiteViewEngine.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Web.Mvc; 3 | 4 | namespace Geta.Tags.Demo.Business.Rendering 5 | { 6 | /// 7 | /// Extends the Razor view engine to include the folders ~/Views/Shared/Blocks/ and ~/Views/Shared/PagePartials/ 8 | /// when looking for partial views. 9 | /// 10 | public class SiteViewEngine : RazorViewEngine 11 | { 12 | private static readonly string[] AdditionalPartialViewFormats = new[] 13 | { 14 | TemplateCoordinator.BlockFolder + "{0}.cshtml", 15 | TemplateCoordinator.PagePartialsFolder + "{0}.cshtml" 16 | }; 17 | 18 | public SiteViewEngine() 19 | { 20 | PartialViewLocationFormats = PartialViewLocationFormats.Union(AdditionalPartialViewFormats).ToArray(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/ServiceLocatorDependencyResolver.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web.Mvc; 5 | using EPiServer.ServiceLocation; 6 | 7 | namespace Geta.Tags.Demo.Business 8 | { 9 | public class ServiceLocatorDependencyResolver : IDependencyResolver 10 | { 11 | readonly IServiceLocator _serviceLocator; 12 | 13 | public ServiceLocatorDependencyResolver(IServiceLocator serviceLocator) 14 | { 15 | _serviceLocator = serviceLocator; 16 | } 17 | 18 | public object GetService(Type serviceType) 19 | { 20 | if (serviceType.IsInterface || serviceType.IsAbstract) 21 | { 22 | return GetInterfaceService(serviceType); 23 | } 24 | return GetConcreteService(serviceType); 25 | } 26 | 27 | private object GetConcreteService(Type serviceType) 28 | { 29 | try 30 | { 31 | // Can't use TryGetInstance here because it won’t create concrete types 32 | return _serviceLocator.GetInstance(serviceType); 33 | } 34 | catch (ActivationException) 35 | { 36 | return null; 37 | } 38 | } 39 | 40 | private object GetInterfaceService(Type serviceType) 41 | { 42 | object instance; 43 | return _serviceLocator.TryGetExistingInstance(serviceType, out instance) ? instance : null; 44 | } 45 | 46 | public IEnumerable GetServices(Type serviceType) 47 | { 48 | return _serviceLocator.GetAllInstances(serviceType).Cast(); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Business/UIDescriptors/ContainerPageUIDescriptor.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Editor; 2 | using EPiServer.Shell; 3 | using Geta.Tags.Demo.Models.Pages; 4 | 5 | namespace Geta.Tags.Demo.Business.UIDescriptors 6 | { 7 | /// 8 | /// Describes how the UI should appear for content. 9 | /// 10 | [UIDescriptorRegistration] 11 | public class ContainerPageUIDescriptor : UIDescriptor 12 | { 13 | public ContainerPageUIDescriptor() 14 | : base(ContentTypeCssClassNames.Container) 15 | { 16 | DefaultView = CmsViewNames.AllPropertiesView; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/ClientResources/Images/icons/layoutIcons24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/ClientResources/Images/icons/layoutIcons24x24.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/ClientResources/Styles/LayoutIcons.css: -------------------------------------------------------------------------------- 1 | .Sleek .epi-icon__layout--full { 2 | background: url('../Images/Icons/layoutIcons24x24.png') 0px -24px no-repeat; 3 | height: 24px; 4 | width: 24px; 5 | } 6 | .Sleek .epi-icon__layout--half { 7 | background: url('../Images/Icons/layoutIcons24x24.png') 0px -48px no-repeat; 8 | height: 24px; 9 | width: 24px; 10 | } 11 | .Sleek .epi-icon__layout--two-thirds { 12 | background: url('../Images/Icons/layoutIcons24x24.png') 0px -72px no-repeat; 13 | height: 24px; 14 | width: 24px; 15 | } 16 | .Sleek .epi-icon__layout--one-third { 17 | background: url('../Images/Icons/layoutIcons24x24.png') 0px -96px no-repeat; 18 | height: 24px; 19 | width: 24px; 20 | } 21 | .Sleek .epi-icon__layout--one-quarter { 22 | background: url('../Images/Icons/layoutIcons24x24.png') 0px -120px no-repeat; 23 | height: 24px; 24 | width: 24px; 25 | } 26 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/ClientResources/Styles/Styles.css: -------------------------------------------------------------------------------- 1 | @import url("LayoutIcons.css"); 2 | 3 | .epiStringList .dijitTextArea { 4 | width: 250px; 5 | } 6 | 7 | .epiStringList .epiStringListError .dijitTextArea { 8 | border: solid 1px #d46464; 9 | } 10 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Controllers/DefaultPageController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web.Mvc; 3 | using EPiServer; 4 | using EPiServer.Framework.DataAnnotations; 5 | using Geta.Tags.Demo.Models.Pages; 6 | using Geta.Tags.Demo.Models.ViewModels; 7 | 8 | namespace Geta.Tags.Demo.Controllers 9 | { 10 | /// 11 | /// Concrete controller that handles all page types that don't have their own specific controllers. 12 | /// 13 | /// 14 | /// Note that as the view file name is hard coded it won't work with DisplayModes (ie Index.mobile.cshtml). 15 | /// For page types requiring such views add specific controllers for them. Alterntively the Index action 16 | /// could be modified to set ControllerContext.RouteData.Values["controller"] to type name of the currentPage 17 | /// argument. That may however have side effects. 18 | /// 19 | [TemplateDescriptor(Inherited = true)] 20 | public class DefaultPageController : PageControllerBase 21 | { 22 | public ViewResult Index(SitePageData currentPage) 23 | { 24 | var model = CreateModel(currentPage); 25 | return View(string.Format("~/Views/{0}/Index.cshtml", currentPage.GetOriginalType().Name), model); 26 | } 27 | 28 | /// 29 | /// Creates a PageViewModel where the type parameter is the type of the page. 30 | /// 31 | /// 32 | /// Used to create models of a specific type without the calling method having to know that type. 33 | /// 34 | private static IPageViewModel CreateModel(SitePageData page) 35 | { 36 | var type = typeof(PageViewModel<>).MakeGenericType(page.GetOriginalType()); 37 | return Activator.CreateInstance(type, page) as IPageViewModel; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Controllers/ImageFileController.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Geta.Tags.Demo.Models.Media; 3 | using Geta.Tags.Demo.Models.ViewModels; 4 | using EPiServer.Web.Mvc; 5 | using EPiServer.Web.Routing; 6 | 7 | namespace Geta.Tags.Demo.Controllers 8 | { 9 | /// 10 | /// Controller for the image file. 11 | /// 12 | public class ImageFileController : PartialContentController 13 | { 14 | private readonly UrlResolver _urlResolver; 15 | 16 | public ImageFileController(UrlResolver urlResolver) 17 | { 18 | _urlResolver = urlResolver; 19 | } 20 | 21 | /// 22 | /// The index action for the image file. Creates the view model and renders the view. 23 | /// 24 | /// The current image file. 25 | public override ActionResult Index(ImageFile currentContent) 26 | { 27 | var model = new ImageViewModel 28 | { 29 | Url = _urlResolver.GetUrl(currentContent.ContentLink), 30 | Name = currentContent.Name, 31 | Copyright = currentContent.Copyright 32 | }; 33 | 34 | return PartialView(model); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Controllers/PageControllerBase.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Geta.Tags.Demo.Business; 3 | using Geta.Tags.Demo.Models.Pages; 4 | using Geta.Tags.Demo.Models.ViewModels; 5 | using EPiServer.Web.Mvc; 6 | using EPiServer.Shell.Security; 7 | 8 | namespace Geta.Tags.Demo.Controllers 9 | { 10 | /// 11 | /// All controllers that renders pages should inherit from this class so that we can 12 | /// apply action filters, such as for output caching site wide, should we want to. 13 | /// 14 | public abstract class PageControllerBase : PageController, IModifyLayout 15 | where T : SitePageData 16 | { 17 | 18 | protected EPiServer.ServiceLocation.Injected UISignInManager; 19 | 20 | /// 21 | /// Signs out the current user and redirects to the Index action of the same controller. 22 | /// 23 | /// 24 | /// There's a log out link in the footer which should redirect the user to the same page. 25 | /// As we don't have a specific user/account/login controller but rely on the login URL for 26 | /// forms authentication for login functionality we add an action for logging out to all 27 | /// controllers inheriting from this class. 28 | /// 29 | public ActionResult Logout() 30 | { 31 | UISignInManager.Service.SignOut(); 32 | return RedirectToAction("Index"); 33 | } 34 | 35 | public virtual void ModifyLayout(LayoutModel layoutModel) 36 | { 37 | var page = PageContext.Page as SitePageData; 38 | if(page != null) 39 | { 40 | layoutModel.HideHeader = page.HideSiteHeader; 41 | layoutModel.HideFooter = page.HideSiteFooter; 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Controllers/StartPageController.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Geta.Tags.Demo.Models.Pages; 3 | using Geta.Tags.Demo.Models.ViewModels; 4 | using EPiServer.Web; 5 | using EPiServer.Web.Mvc; 6 | 7 | namespace Geta.Tags.Demo.Controllers 8 | { 9 | public class StartPageController : PageControllerBase 10 | { 11 | public ActionResult Index(StartPage currentPage) 12 | { 13 | var model = PageViewModel.Create(currentPage); 14 | 15 | if (SiteDefinition.Current.StartPage.CompareToIgnoreWorkID(currentPage.ContentLink)) // Check if it is the StartPage or just a page of the StartPage type. 16 | { 17 | //Connect the view models logotype property to the start page's to make it editable 18 | var editHints = ViewData.GetEditHints, StartPage>(); 19 | editHints.AddConnection(m => m.Layout.Logotype, p => p.SiteLogotype); 20 | editHints.AddConnection(m => m.Layout.ProductPages, p => p.ProductPageLinks); 21 | editHints.AddConnection(m => m.Layout.CompanyInformationPages, p => p.CompanyInformationPageLinks); 22 | editHints.AddConnection(m => m.Layout.NewsPages, p => p.NewsPageLinks); 23 | editHints.AddConnection(m => m.Layout.CustomerZonePages, p => p.CustomerZonePageLinks); 24 | } 25 | 26 | return View(model); 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Controllers/VideoFileController.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Geta.Tags.Demo.Models.Media; 3 | using Geta.Tags.Demo.Models.ViewModels; 4 | using EPiServer.Web.Mvc; 5 | using EPiServer.Web.Routing; 6 | using System; 7 | using EPiServer.Core; 8 | 9 | namespace Geta.Tags.Demo.Controllers 10 | { 11 | /// 12 | /// Controller for the video file. 13 | /// 14 | public class VideoFileController : PartialContentController 15 | { 16 | private readonly UrlResolver _urlResolver; 17 | 18 | public VideoFileController(UrlResolver urlResolver) 19 | { 20 | _urlResolver = urlResolver; 21 | } 22 | 23 | /// 24 | /// The index action for the video file. Creates the view model and renders the view. 25 | /// 26 | /// The current video file. 27 | public override ActionResult Index(VideoFile currentContent) 28 | { 29 | var model = new VideoViewModel 30 | { 31 | Url = _urlResolver.GetUrl(currentContent.ContentLink), 32 | PreviewImageUrl = ContentReference.IsNullOrEmpty(currentContent.PreviewImage) ? String.Empty : _urlResolver.GetUrl(currentContent.PreviewImage), 33 | }; 34 | 35 | return PartialView(model); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Dockerfile: -------------------------------------------------------------------------------- 1 | #Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. 2 | #For more information, please see http://aka.ms/containercompat 3 | 4 | FROM microsoft/aspnet:4.7.2-windowsservercore-1803 5 | 6 | RUN Add-WindowsFeature Web-WebSockets 7 | 8 | 9 | ARG source 10 | WORKDIR /inetpub/wwwroot 11 | COPY ${source:-obj/Docker/publish} . 12 | WORKDIR / 13 | RUN MKDIR data 14 | WORKDIR data 15 | RUN MKDIR ClientResources 16 | RUN MKDIR Views 17 | WORKDIR /inetpub/wwwroot 18 | 19 | RUN New-WebVirtualDirectory -Site 'Default Web Site' -Name 'Episerver/Geta.Tags/' -PhysicalPath c:\data\ -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/EPiServerLog.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Language="C#" Inherits="Geta.Tags.Demo.EPiServerApplication" %> -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Global.asax.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web.Mvc; 3 | 4 | namespace Geta.Tags.Demo 5 | { 6 | public class EPiServerApplication : EPiServer.Global 7 | { 8 | protected void Application_Start() 9 | { 10 | AreaRegistration.RegisterAllAreas(); 11 | 12 | //Tip: Want to call the EPiServer API on startup? Add an initialization module instead (Add -> New Item.. -> EPiServer -> Initialization Module) 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Helpers/CategorizableExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using EPiServer; 4 | using EPiServer.Core; 5 | using EPiServer.DataAbstraction; 6 | using EPiServer.ServiceLocation; 7 | 8 | namespace Geta.Tags.Demo.Helpers 9 | { 10 | /// 11 | /// Provides extension methods for categorizable content 12 | /// 13 | /// ICategorizable content includes for example pages and blocks. 14 | public static class CategorizableExtensions 15 | { 16 | /// 17 | /// Returns the CSS classes (if any) associated with the theme(s) of the content, as decided by its categories 18 | /// 19 | /// 20 | /// CSS classes associated with the content's theme(s), or an empty string array if no theme is applicable 21 | /// Content's categorization may map to more than one theme. This method assumes there are website categories called "Meet", "Track", and "Plan" 22 | public static string[] GetThemeCssClassNames(this ICategorizable content) 23 | { 24 | if (content.Category == null) 25 | { 26 | return new string[0]; 27 | } 28 | 29 | var cssClasses = new HashSet(); // Although with some overhead, a HashSet allows us to ensure we never add a CSS class more than once 30 | var categoryRepository = ServiceLocator.Current.GetInstance(); 31 | 32 | foreach (var categoryName in content.Category.Select(category => categoryRepository.Get(category).Name.ToLower())) 33 | { 34 | switch (categoryName) 35 | { 36 | case "meet": 37 | cssClasses.Add("theme1"); 38 | break; 39 | case "track": 40 | cssClasses.Add("theme2"); 41 | break; 42 | case "plan": 43 | cssClasses.Add("theme3"); 44 | break; 45 | } 46 | } 47 | 48 | return cssClasses.ToArray(); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Helpers/UrlHelpers.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using System.Web.Routing; 4 | using EPiServer.Core; 5 | using EPiServer.Globalization; 6 | using EPiServer.ServiceLocation; 7 | using EPiServer.Web.Routing; 8 | using EPiServer; 9 | 10 | namespace Geta.Tags.Demo.Helpers 11 | { 12 | public static class UrlHelpers 13 | { 14 | /// 15 | /// Returns the target URL for a ContentReference. Respects the page's shortcut setting 16 | /// so if the page is set as a shortcut to another page or an external URL that URL 17 | /// will be returned. 18 | /// 19 | public static IHtmlString PageLinkUrl(this UrlHelper urlHelper, ContentReference contentLink) 20 | { 21 | if(ContentReference.IsNullOrEmpty(contentLink)) 22 | { 23 | return MvcHtmlString.Empty; 24 | } 25 | 26 | var contentLoader = ServiceLocator.Current.GetInstance(); 27 | var page = contentLoader.Get(contentLink); 28 | 29 | return PageLinkUrl(urlHelper, page); 30 | } 31 | 32 | /// 33 | /// Returns the target URL for a page. Respects the page's shortcut setting 34 | /// so if the page is set as a shortcut to another page or an external URL that URL 35 | /// will be returned. 36 | /// 37 | public static IHtmlString PageLinkUrl(this UrlHelper urlHelper, PageData page) 38 | { 39 | var urlResolver = ServiceLocator.Current.GetInstance(); 40 | switch (page.LinkType) 41 | { 42 | case PageShortcutType.Normal: 43 | case PageShortcutType.FetchData: 44 | return new MvcHtmlString(urlResolver.GetUrl(page.ContentLink)); 45 | 46 | case PageShortcutType.Shortcut: 47 | var shortcutProperty = page.Property["PageShortcutLink"] as PropertyPageReference; 48 | if (shortcutProperty != null && !ContentReference.IsNullOrEmpty(shortcutProperty.ContentLink)) 49 | { 50 | return urlHelper.PageLinkUrl(shortcutProperty.ContentLink); 51 | } 52 | break; 53 | 54 | case PageShortcutType.External: 55 | return new MvcHtmlString(page.LinkURL); 56 | } 57 | return MvcHtmlString.Empty; 58 | } 59 | 60 | public static RouteValueDictionary GetPageRoute(this RequestContext requestContext, ContentReference contentLink) 61 | { 62 | var values = new RouteValueDictionary(); 63 | values[RoutingConstants.NodeKey] = contentLink; 64 | values[RoutingConstants.LanguageKey] = ContentLanguage.PreferredCulture.Name; 65 | return values; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/ButtonBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.DataAbstraction; 3 | using EPiServer; 4 | 5 | namespace Geta.Tags.Demo.Models.Blocks 6 | { 7 | /// 8 | /// Used to insert a link which is styled as a button 9 | /// 10 | [SiteContentType(GUID = "426CF12F-1F01-4EA0-922F-0778314DDAF0")] 11 | [SiteImageUrl] 12 | public class ButtonBlock : SiteBlockData 13 | { 14 | [Display(Order = 1, GroupName = SystemTabNames.Content)] 15 | [Required] 16 | public virtual string ButtonText { get; set; } 17 | 18 | [Display(Order = 2, GroupName = SystemTabNames.Content)] 19 | [Required] 20 | public virtual Url ButtonLink { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/ContactBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAbstraction; 4 | using EPiServer.DataAnnotations; 5 | using EPiServer.Web; 6 | using EPiServer; 7 | 8 | namespace Geta.Tags.Demo.Models.Blocks 9 | { 10 | /// 11 | /// Used to present contact information with a call-to-action link 12 | /// 13 | /// Actual contact details are retrieved from a contact page specified using the ContactPageLink property 14 | [SiteContentType(GUID = "7E932EAF-6BC2-4753-902A-8670EDC5F363")] 15 | [SiteImageUrl] 16 | public class ContactBlock : SiteBlockData 17 | { 18 | [Display( 19 | GroupName = SystemTabNames.Content, 20 | Order = 1)] 21 | [CultureSpecific] 22 | [UIHint(UIHint.Image)] 23 | public virtual ContentReference Image { get; set; } 24 | 25 | [Display( 26 | GroupName = SystemTabNames.Content, 27 | Order = 2)] 28 | [CultureSpecific] 29 | public virtual string Heading { get; set; } 30 | 31 | /// 32 | /// Gets or sets the contact page from which contact information should be retrieved 33 | /// 34 | [Display( 35 | GroupName = SystemTabNames.Content, 36 | Order = 3)] 37 | [UIHint(Global.SiteUIHints.Contact)] 38 | public virtual PageReference ContactPageLink { get; set; } 39 | 40 | [Display( 41 | GroupName = SystemTabNames.Content, 42 | Order = 4)] 43 | [CultureSpecific] 44 | public virtual string LinkText { get; set; } 45 | 46 | [Display( 47 | GroupName = SystemTabNames.Content, 48 | Order = 5)] 49 | [CultureSpecific] 50 | public virtual Url LinkUrl { get; set; } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/EditorialBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAbstraction; 4 | using EPiServer.DataAnnotations; 5 | 6 | namespace Geta.Tags.Demo.Models.Blocks 7 | { 8 | /// 9 | /// Used to insert editorial content edited using a rich-text editor 10 | /// 11 | [SiteContentType( 12 | GUID = "67F617A4-2175-4360-975E-75EDF2B924A7", 13 | GroupName = SystemTabNames.Content)] 14 | [SiteImageUrl] 15 | public class EditorialBlock : SiteBlockData 16 | { 17 | [Display(GroupName = SystemTabNames.Content)] 18 | [CultureSpecific] 19 | public virtual XhtmlString MainBody { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/JumbotronBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.DataAbstraction; 3 | using EPiServer.DataAnnotations; 4 | using EPiServer.Web; 5 | using EPiServer.Core; 6 | using EPiServer; 7 | 8 | namespace Geta.Tags.Demo.Models.Blocks 9 | { 10 | /// 11 | /// Used for a primary message on a page, commonly used on start pages and landing pages 12 | /// 13 | [SiteContentType( 14 | GroupName = Global.GroupNames.Specialized, 15 | GUID = "9FD1C860-7183-4122-8CD4-FF4C55E096F9")] 16 | [SiteImageUrl] 17 | public class JumbotronBlock : SiteBlockData 18 | { 19 | [Display( 20 | GroupName = SystemTabNames.Content, 21 | Order = 1 22 | )] 23 | [CultureSpecific] 24 | [UIHint(UIHint.Image)] 25 | public virtual ContentReference Image { get; set; } 26 | 27 | /// 28 | /// Gets or sets a description for the image, for example used as the alt text for the image when rendered 29 | /// 30 | [Display( 31 | GroupName = SystemTabNames.Content, 32 | Order = 1 33 | )] 34 | [CultureSpecific] 35 | [UIHint(UIHint.Textarea)] 36 | public virtual string ImageDescription 37 | { 38 | get 39 | { 40 | var propertyValue = this["ImageDescription"] as string; 41 | 42 | // Return image description with fall back to the heading if no description has been specified 43 | return string.IsNullOrWhiteSpace(propertyValue) ? Heading : propertyValue; 44 | } 45 | set { this["ImageDescription"] = value; } 46 | } 47 | 48 | [Display( 49 | GroupName = SystemTabNames.Content, 50 | Order = 1 51 | )] 52 | [CultureSpecific] 53 | public virtual string Heading { get; set; } 54 | 55 | [Display( 56 | GroupName = SystemTabNames.Content, 57 | Order = 2 58 | )] 59 | [CultureSpecific] 60 | [UIHint(UIHint.Textarea)] 61 | public virtual string SubHeading { get; set; } 62 | 63 | [Display( 64 | GroupName = SystemTabNames.Content, 65 | Order = 3 66 | )] 67 | [CultureSpecific] 68 | [Required] 69 | public virtual string ButtonText { get; set; } 70 | 71 | //The link must be required as an anchor tag requires an href in order to be valid and focusable 72 | [Display( 73 | GroupName = SystemTabNames.Content, 74 | Order = 4 75 | )] 76 | [CultureSpecific] 77 | [Required] 78 | public virtual Url ButtonLink { get; set; } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/SiteBlockData.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Geta.Tags.Demo.Models.Blocks 3 | { 4 | /// 5 | /// Base class for all block types on the site 6 | /// 7 | public abstract class SiteBlockData : EPiServer.Core.BlockData 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/SiteLogotypeBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAnnotations; 4 | using EPiServer.Shell.ObjectEditing; 5 | using EPiServer.Web; 6 | using EPiServer; 7 | 8 | namespace Geta.Tags.Demo.Models.Blocks 9 | { 10 | /// 11 | /// Used to provide a composite property on the start page to set site logotype settings 12 | /// 13 | [SiteContentType( 14 | GUID = "09854019-91A5-4B93-8623-17F038346001", 15 | AvailableInEditMode = false)] // Should not be created and added to content areas by editors, the SiteLogotypeBlock is only used as a property type 16 | [SiteImageUrl] 17 | public class SiteLogotypeBlock : SiteBlockData 18 | { 19 | /// 20 | /// Gets the site logotype URL 21 | /// 22 | /// If not specified a default logotype will be used 23 | [DefaultDragAndDropTarget] 24 | [UIHint(UIHint.Image)] 25 | public virtual Url Url 26 | { 27 | get 28 | { 29 | var url = this.GetPropertyValue(b => b.Url); 30 | 31 | return url == null || url.IsEmpty() 32 | ? new Url("/Static/gfx/logotype.png") 33 | : url; 34 | } 35 | set 36 | { 37 | this.SetPropertyValue(b => b.Url, value); 38 | } 39 | } 40 | 41 | [CultureSpecific] 42 | public virtual string Title { get; set; } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Blocks/TeaserBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAbstraction; 4 | using EPiServer.DataAnnotations; 5 | using EPiServer.Web; 6 | 7 | namespace Geta.Tags.Demo.Models.Blocks 8 | { 9 | /// 10 | /// Used to provide a stylized entry point to a page on the site 11 | /// 12 | [SiteContentType(GUID = "EB67A99A-E239-41B8-9C59-20EAA5936047")] // BEST PRACTICE TIP: Always assign a GUID explicitly when creating a new block type 13 | [SiteImageUrl] // Use site's default thumbnail 14 | public class TeaserBlock : SiteBlockData 15 | { 16 | [CultureSpecific] 17 | [Required(AllowEmptyStrings = false)] 18 | [Display( 19 | GroupName = SystemTabNames.Content, 20 | Order = 1)] 21 | public virtual string Heading { get; set; } 22 | 23 | [CultureSpecific] 24 | [Required(AllowEmptyStrings = false)] 25 | [Display( 26 | GroupName = SystemTabNames.Content, 27 | Order = 2)] 28 | [UIHint(UIHint.Textarea)] 29 | public virtual string Text { get; set; } 30 | 31 | [CultureSpecific] 32 | [Required(AllowEmptyStrings = false)] 33 | [UIHint(UIHint.Image)] 34 | [Display( 35 | GroupName = SystemTabNames.Content, 36 | Order = 3)] 37 | public virtual ContentReference Image { get; set; } 38 | 39 | [Display( 40 | GroupName = SystemTabNames.Content, 41 | Order = 4)] 42 | public virtual PageReference Link { get; set; } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Media/GenericMedia.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Core; 2 | using EPiServer.DataAnnotations; 3 | using System; 4 | 5 | namespace Geta.Tags.Demo.Models.Media 6 | { 7 | [ContentType(GUID = "EE3BD195-7CB0-4756-AB5F-E5E223CD9820")] 8 | public class GenericMedia : MediaData 9 | { 10 | /// 11 | /// Gets or sets the description. 12 | /// 13 | public virtual String Description { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Media/ImageFile.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Core; 2 | using EPiServer.DataAnnotations; 3 | using EPiServer.Framework.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations; 5 | 6 | namespace Geta.Tags.Demo.Models.Media 7 | { 8 | [ContentType(GUID = "0A89E464-56D4-449F-AEA8-2BF774AB8730")] 9 | [MediaDescriptor(ExtensionString = "jpg,jpeg,jpe,ico,gif,bmp,png")] 10 | public class ImageFile : ImageData 11 | { 12 | /// 13 | /// Gets or sets the copyright. 14 | /// 15 | /// 16 | /// The copyright. 17 | /// 18 | public virtual string Copyright { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Media/VideoFile.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAnnotations; 4 | using EPiServer.Framework.DataAnnotations; 5 | using EPiServer.Web; 6 | 7 | namespace Geta.Tags.Demo.Models.Media 8 | { 9 | [ContentType(GUID = "85468104-E06F-47E5-A317-FC9B83D3CBA6")] 10 | [MediaDescriptor(ExtensionString = "flv,mp4,webm")] 11 | public class VideoFile : VideoData 12 | { 13 | /// 14 | /// Gets or sets the copyright. 15 | /// 16 | public virtual string Copyright { get; set; } 17 | 18 | /// 19 | /// Gets or sets the URL to the preview image. 20 | /// 21 | [UIHint(UIHint.Image)] 22 | public virtual ContentReference PreviewImage { get; set; } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/ArticlePage.cs: -------------------------------------------------------------------------------- 1 | namespace Geta.Tags.Demo.Models.Pages 2 | { 3 | /// 4 | /// Used primarily for publishing news articles on the website 5 | /// 6 | [SiteContentType( 7 | GroupName = Global.GroupNames.News, 8 | GUID = "AEECADF2-3E89-4117-ADEB-F8D43565D2F4")] 9 | [SiteImageUrl(Global.StaticGraphicsFolderPath + "page-type-thumbnail-article.png")] 10 | public class ArticlePage : StandardPage 11 | { 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/ContactPage.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using Geta.Tags.Demo.Business.Rendering; 3 | using EPiServer.Web; 4 | using EPiServer.Core; 5 | 6 | namespace Geta.Tags.Demo.Models.Pages 7 | { 8 | /// 9 | /// Represents contact details for a contact person 10 | /// 11 | [SiteContentType( 12 | GUID = "F8D47655-7B50-4319-8646-3369BA9AF05B", 13 | GroupName = Global.GroupNames.Specialized)] 14 | [SiteImageUrl(Global.StaticGraphicsFolderPath + "page-type-thumbnail-contact.png")] 15 | public class ContactPage : SitePageData, IContainerPage 16 | { 17 | [Display(GroupName = Global.GroupNames.Contact)] 18 | [UIHint(UIHint.Image)] 19 | public virtual ContentReference Image { get; set; } 20 | 21 | [Display(GroupName = Global.GroupNames.Contact)] 22 | public virtual string Phone { get; set; } 23 | 24 | [Display(GroupName = Global.GroupNames.Contact)] 25 | [EmailAddress] 26 | public virtual string Email { get; set; } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/ContainerPage.cs: -------------------------------------------------------------------------------- 1 | using Geta.Tags.Demo.Business.Rendering; 2 | 3 | namespace Geta.Tags.Demo.Models.Pages 4 | { 5 | /// 6 | /// Used to logically group pages in the page tree 7 | /// 8 | [SiteContentType( 9 | GUID = "D178950C-D20E-4A46-90BD-5338B2424745", 10 | GroupName = Global.GroupNames.Specialized)] 11 | [SiteImageUrl] 12 | public class ContainerPage : SitePageData, IContainerPage 13 | { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/GetaTagsPage.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.DataAnnotations; 3 | using Geta.Tags.Attributes; 4 | 5 | namespace Geta.Tags.Demo.Models.Pages 6 | { 7 | /// 8 | /// Used primarily for publishing news articles on the website 9 | /// 10 | [SiteContentType( 11 | GroupName = Global.GroupNames.News, 12 | GUID = "E92AEE69-F771-40FE-B105-895BD1A9A9E8")] 13 | [SiteImageUrl(Global.StaticGraphicsFolderPath + "page-type-thumbnail-article.png")] 14 | public class GetaTagsPage : SitePageData 15 | { 16 | [UIHint("Tags")] 17 | public virtual string Tags1 { get; set; } 18 | 19 | [TagsGroupKey("mykey")] 20 | [UIHint("Tags")] 21 | public virtual string Tags2 { get; set; } 22 | 23 | [CultureSpecific] 24 | [UIHint("Tags")] 25 | public virtual string Tags3 { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/IHasRelatedContent.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Core; 2 | 3 | namespace Geta.Tags.Demo.Models.Pages 4 | { 5 | public interface IHasRelatedContent 6 | { 7 | ContentArea RelatedContentArea { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/ISearchPage.cs: -------------------------------------------------------------------------------- 1 | namespace Geta.Tags.Demo.Models.Pages 2 | { 3 | /// 4 | /// Marker interface for search implementation 5 | /// 6 | public interface ISearchPage 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/LandingPage.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAbstraction; 4 | using EPiServer.DataAnnotations; 5 | 6 | namespace Geta.Tags.Demo.Models.Pages 7 | { 8 | /// 9 | /// Used for campaign or landing pages, commonly used for pages linked in online advertising such as AdWords 10 | /// 11 | [SiteContentType( 12 | GUID = "DBED4258-8213-48DB-A11F-99C034172A54", 13 | GroupName = Global.GroupNames.Specialized)] 14 | [SiteImageUrl] 15 | public class LandingPage : SitePageData 16 | { 17 | [Display( 18 | GroupName = SystemTabNames.Content, 19 | Order=310)] 20 | [CultureSpecific] 21 | public virtual ContentArea MainContentArea { get; set; } 22 | 23 | public override void SetDefaultValues(ContentType contentType) 24 | { 25 | base.SetDefaultValues(contentType); 26 | 27 | HideSiteFooter = true; 28 | HideSiteHeader = true; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/NewsPage.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.DataAbstraction; 3 | using EPiServer.Filters; 4 | using EPiServer.Framework.Localization; 5 | using EPiServer.ServiceLocation; 6 | using Geta.Tags.Demo.Business; 7 | using Geta.Tags.Demo.Models.Blocks; 8 | 9 | namespace Geta.Tags.Demo.Models.Pages 10 | { 11 | /// 12 | /// Presents a news section including a list of the most recent articles on the site 13 | /// 14 | [SiteContentType(GUID = "638D8271-5CA3-4C72-BABC-3E8779233263")] 15 | [SiteImageUrl] 16 | public class NewsPage : StandardPage 17 | { 18 | [Display( 19 | GroupName = SystemTabNames.Content, 20 | Order = 305)] 21 | public virtual PageListBlock NewsList { get; set; } 22 | 23 | public override void SetDefaultValues(ContentType contentType) 24 | { 25 | base.SetDefaultValues(contentType); 26 | 27 | NewsList.Count = 20; 28 | NewsList.Heading = ServiceLocator.Current.GetInstance().GetString("/newspagetemplate/latestnews"); 29 | NewsList.IncludeIntroduction = true; 30 | NewsList.IncludePublishDate = true; 31 | NewsList.Recursive = true; 32 | NewsList.PageTypeFilter = typeof(ArticlePage).GetPageType(); 33 | NewsList.SortOrder = FilterSortOrder.PublishedDescending; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/ProductPage.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.ComponentModel.DataAnnotations; 3 | using Geta.Tags.Demo.Models.Blocks; 4 | using EPiServer.Core; 5 | using EPiServer.DataAbstraction; 6 | using EPiServer.DataAnnotations; 7 | using Geta.Tags.Demo.Models.Properties; 8 | 9 | namespace Geta.Tags.Demo.Models.Pages 10 | { 11 | /// 12 | /// Used to present a single product 13 | /// 14 | [SiteContentType( 15 | GUID = "17583DCD-3C11-49DD-A66D-0DEF0DD601FC", 16 | GroupName = Global.GroupNames.Products)] 17 | [SiteImageUrl(Global.StaticGraphicsFolderPath + "page-type-thumbnail-product.png")] 18 | [AvailableContentTypes( 19 | Availability = Availability.Specific, 20 | IncludeOn = new[] { typeof(StartPage) })] 21 | public class ProductPage : StandardPage, IHasRelatedContent 22 | { 23 | [Required] 24 | [Display(Order = 305)] 25 | [UIHint(Global.SiteUIHints.StringsCollection)] 26 | [CultureSpecific] 27 | public virtual IList UniqueSellingPoints { get; set; } 28 | 29 | [Display( 30 | GroupName = SystemTabNames.Content, 31 | Order = 330)] 32 | [CultureSpecific] 33 | [AllowedTypes(new[] { typeof(IContentData) },new[] { typeof(JumbotronBlock) })] 34 | public virtual ContentArea RelatedContentArea { get; set; } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/StandardPage.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Core; 2 | using EPiServer.DataAbstraction; 3 | using EPiServer.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations; 5 | 6 | namespace Geta.Tags.Demo.Models.Pages 7 | { 8 | /// 9 | /// Used for the pages mainly consisting of manually created content such as text, images, and blocks 10 | /// 11 | [SiteContentType(GUID = "9CCC8A41-5C8C-4BE0-8E73-520FF3DE8267")] 12 | [SiteImageUrl(Global.StaticGraphicsFolderPath + "page-type-thumbnail-standard.png")] 13 | public class StandardPage : SitePageData 14 | { 15 | [Display( 16 | GroupName = SystemTabNames.Content, 17 | Order = 310)] 18 | [CultureSpecific] 19 | public virtual XhtmlString MainBody { get; set; } 20 | 21 | [Display( 22 | GroupName = SystemTabNames.Content, 23 | Order = 320)] 24 | public virtual ContentArea MainContentArea { get; set; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Pages/StartPage.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using EPiServer.Core; 3 | using EPiServer.DataAbstraction; 4 | using EPiServer.DataAnnotations; 5 | using EPiServer.SpecializedProperties; 6 | using Geta.Tags.Demo.Models.Blocks; 7 | 8 | namespace Geta.Tags.Demo.Models.Pages 9 | { 10 | /// 11 | /// Used for the site's start page and also acts as a container for site settings 12 | /// 13 | [ContentType( 14 | GUID = "19671657-B684-4D95-A61F-8DD4FE60D559", 15 | GroupName = Global.GroupNames.Specialized)] 16 | [SiteImageUrl] 17 | [AvailableContentTypes( 18 | Availability.Specific, 19 | Include = new[] { typeof(ContainerPage), typeof(ProductPage), typeof(StandardPage), typeof(ISearchPage), typeof(LandingPage), typeof(ContentFolder), typeof(GetaTagsPage) }, // Pages we can create under the start page... 20 | ExcludeOn = new[] { typeof(ContainerPage), typeof(ProductPage), typeof(StandardPage), typeof(ISearchPage), typeof(LandingPage) })] // ...and underneath those we can't create additional start pages 21 | public class StartPage : SitePageData 22 | { 23 | [Display( 24 | GroupName = SystemTabNames.Content, 25 | Order = 320)] 26 | [CultureSpecific] 27 | public virtual ContentArea MainContentArea { get; set; } 28 | 29 | [Display(GroupName = Global.GroupNames.SiteSettings, Order = 300)] 30 | public virtual LinkItemCollection ProductPageLinks { get; set; } 31 | 32 | [Display(GroupName = Global.GroupNames.SiteSettings, Order = 350)] 33 | public virtual LinkItemCollection CompanyInformationPageLinks { get; set; } 34 | 35 | [Display(GroupName = Global.GroupNames.SiteSettings, Order = 400)] 36 | public virtual LinkItemCollection NewsPageLinks { get; set; } 37 | 38 | [Display(GroupName = Global.GroupNames.SiteSettings, Order = 450)] 39 | public virtual LinkItemCollection CustomerZonePageLinks { get; set; } 40 | 41 | [Display(GroupName = Global.GroupNames.SiteSettings)] 42 | public virtual PageReference GlobalNewsPageLink { get; set; } 43 | 44 | [Display(GroupName = Global.GroupNames.SiteSettings)] 45 | public virtual PageReference ContactsPageLink { get; set; } 46 | 47 | [Display(GroupName = Global.GroupNames.SiteSettings)] 48 | public virtual PageReference SearchPageLink { get; set; } 49 | 50 | [Display(GroupName = Global.GroupNames.SiteSettings)] 51 | public virtual SiteLogotypeBlock SiteLogotype { get; set; } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Properties/PropertyStringList.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using EPiServer.Core; 3 | using EPiServer.Framework.DataAnnotations; 4 | using EPiServer.PlugIn; 5 | 6 | namespace Geta.Tags.Demo.Models.Properties 7 | { 8 | /// 9 | /// Property type for storing a list of strings 10 | /// 11 | /// For an example, see where this property type is used for the MetaKeywords property 12 | [EditorHint(Global.SiteUIHints.Strings)] 13 | [PropertyDefinitionTypePlugIn(Description = "A property for list of strings", DisplayName = "String List")] 14 | public class PropertyStringList : PropertyLongString 15 | { 16 | protected String Separator = "\n"; 17 | 18 | public String[] List 19 | { 20 | get 21 | { 22 | return (String[])Value; 23 | } 24 | } 25 | 26 | public override Type PropertyValueType 27 | { 28 | get 29 | { 30 | return typeof(String[]); 31 | } 32 | } 33 | 34 | public override object SaveData(PropertyDataCollection properties) 35 | { 36 | return LongString; 37 | } 38 | 39 | public override object Value 40 | { 41 | get 42 | { 43 | var value = base.Value as string; 44 | 45 | if (value == null) 46 | { 47 | return null; 48 | } 49 | 50 | return value.Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 51 | } 52 | set 53 | { 54 | if (value is String[]) 55 | { 56 | var s = String.Join(Separator, value as String[]); 57 | base.Value = s; 58 | } 59 | else 60 | { 61 | base.Value = value; 62 | } 63 | 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/Register/RegisterViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.Web.Mvc; 3 | 4 | namespace Geta.Tags.Demo.Models 5 | { 6 | public class RegisterViewModel 7 | { 8 | [Required] 9 | [Display(Name = "Username")] 10 | [RegularExpression(@"^[a-zA-Z0-9_-]+$", ErrorMessage = "Username can only contain letters a-z, numbers, underscores and hyphens.")] 11 | [StringLength(20, ErrorMessage ="The {0} field can not be more than {1} characters long.")] 12 | public string Username { get; set; } 13 | 14 | [Required] 15 | [EmailAddress] 16 | [Display(Name = "Email")] 17 | public string Email { get; set; } 18 | 19 | [Required] 20 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 21 | [DataType(DataType.Password)] 22 | [Display(Name = "Password")] 23 | [AllowHtml] 24 | public string Password { get; set; } 25 | 26 | [DataType(DataType.Password)] 27 | [Display(Name = "Confirm password")] 28 | [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 29 | [AllowHtml] 30 | public string ConfirmPassword { get; set; } 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/SiteContentType.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.DataAnnotations; 2 | 3 | namespace Geta.Tags.Demo.Models 4 | { 5 | /// 6 | /// Attribute used for site content types to set default attribute values 7 | /// 8 | public class SiteContentType : ContentTypeAttribute 9 | { 10 | public SiteContentType() 11 | { 12 | GroupName = Global.GroupNames.Default; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/SiteImageUrl.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.DataAnnotations; 2 | 3 | namespace Geta.Tags.Demo.Models 4 | { 5 | /// 6 | /// Attribute to set the default thumbnail for site page and block types 7 | /// 8 | public class SiteImageUrl : ImageUrlAttribute 9 | { 10 | /// 11 | /// The parameterless constructor will initialize a SiteImageUrl attribute with a default thumbnail 12 | /// 13 | public SiteImageUrl() : base("~/Static/gfx/page-type-thumbnail.png") 14 | { 15 | 16 | } 17 | 18 | public SiteImageUrl(string path) : base(path) 19 | { 20 | 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/ContactBlockModel.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.ComponentModel.DataAnnotations; 3 | using Geta.Tags.Demo.Models.Pages; 4 | using EPiServer.Web; 5 | using EPiServer.Core; 6 | 7 | namespace Geta.Tags.Demo.Models.ViewModels 8 | { 9 | public class ContactBlockModel 10 | { 11 | [UIHint(UIHint.Image)] 12 | public ContentReference Image { get; set; } 13 | public string Heading { get; set; } 14 | public string LinkText { get; set; } 15 | public IHtmlString LinkUrl { get; set; } 16 | public bool ShowLink { get; set; } 17 | public ContactPage ContactPage { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/ContentRenderingErrorModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using EPiServer; 3 | using EPiServer.Core; 4 | 5 | namespace Geta.Tags.Demo.Models.ViewModels 6 | { 7 | public class ContentRenderingErrorModel 8 | { 9 | public ContentRenderingErrorModel(IContentData contentData, Exception exception) 10 | { 11 | var content = contentData as IContent; 12 | if(content != null) 13 | { 14 | ContentName = content.Name; 15 | } 16 | else 17 | { 18 | ContentName = string.Empty; 19 | } 20 | 21 | ContentTypeName = contentData.GetOriginalType().Name; 22 | 23 | Exception = exception; 24 | } 25 | 26 | public string ContentName { get; set; } 27 | public string ContentTypeName { get; set; } 28 | public Exception Exception { get; set; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/IPageViewModel.cs: -------------------------------------------------------------------------------- 1 | using EPiServer.Core; 2 | using Geta.Tags.Demo.Models.Pages; 3 | 4 | namespace Geta.Tags.Demo.Models.ViewModels 5 | { 6 | /// 7 | /// Defines common characteristics for view models for pages, including properties used by layout files. 8 | /// 9 | /// 10 | /// Views which should handle several page types (T) can use this interface as model type rather than the 11 | /// concrete PageViewModel class, utilizing the that this interface is covariant. 12 | /// 13 | public interface IPageViewModel where T : SitePageData 14 | { 15 | T CurrentPage { get; } 16 | LayoutModel Layout { get; set; } 17 | IContent Section { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/ImageViewModel.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Geta.Tags.Demo.Models.ViewModels 3 | { 4 | /// 5 | /// View model for the image file 6 | /// 7 | public class ImageViewModel 8 | { 9 | /// 10 | /// Gets or sets the URL to the image. 11 | /// 12 | public string Url { get; set; } 13 | 14 | /// 15 | /// Gets or sets the name of the image. 16 | /// 17 | public string Name { get; set; } 18 | 19 | /// 20 | /// Gets or sets the copyright information of the image. 21 | /// 22 | public string Copyright { get; set; } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/LayoutModel.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using EPiServer.SpecializedProperties; 4 | using Geta.Tags.Demo.Models.Blocks; 5 | 6 | namespace Geta.Tags.Demo.Models.ViewModels 7 | { 8 | public class LayoutModel 9 | { 10 | public SiteLogotypeBlock Logotype { get; set; } 11 | public IHtmlString LogotypeLinkUrl { get; set; } 12 | public bool HideHeader { get; set; } 13 | public bool HideFooter { get; set; } 14 | public LinkItemCollection ProductPages { get; set; } 15 | public LinkItemCollection CompanyInformationPages { get; set; } 16 | public LinkItemCollection NewsPages { get; set; } 17 | public LinkItemCollection CustomerZonePages { get; set; } 18 | public bool LoggedIn { get; set; } 19 | public MvcHtmlString LoginUrl { get; set; } 20 | public MvcHtmlString LogOutUrl { get; set; } 21 | public MvcHtmlString SearchActionUrl { get; set; } 22 | 23 | public bool IsInReadonlyMode {get;set;} 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/PageListModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EPiServer.Core; 3 | using Geta.Tags.Demo.Models.Blocks; 4 | 5 | namespace Geta.Tags.Demo.Models.ViewModels 6 | { 7 | public class PageListModel 8 | { 9 | public PageListModel(PageListBlock block) 10 | { 11 | Heading = block.Heading; 12 | ShowIntroduction = block.IncludeIntroduction; 13 | ShowPublishDate = block.IncludePublishDate; 14 | } 15 | public string Heading { get; set; } 16 | public IEnumerable Pages { get; set; } 17 | public bool ShowIntroduction { get; set; } 18 | public bool ShowPublishDate { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/PageViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using EPiServer.Core; 3 | using Geta.Tags.Demo.Models.Pages; 4 | 5 | namespace Geta.Tags.Demo.Models.ViewModels 6 | { 7 | public class PageViewModel : IPageViewModel where T : SitePageData 8 | { 9 | public PageViewModel(T currentPage) 10 | { 11 | CurrentPage = currentPage; 12 | } 13 | 14 | public T CurrentPage { get; private set; } 15 | public LayoutModel Layout { get; set; } 16 | public IContent Section { get; set; } 17 | } 18 | 19 | public static class PageViewModel 20 | { 21 | /// 22 | /// Returns a PageViewModel of type . 23 | /// 24 | /// 25 | /// Convenience method for creating PageViewModels without having to specify the type as methods can use type inference while constructors cannot. 26 | /// 27 | public static PageViewModel Create(T page) where T : SitePageData 28 | { 29 | return new PageViewModel(page); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/PreviewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using EPiServer.Core; 3 | using Geta.Tags.Demo.Models.Pages; 4 | 5 | namespace Geta.Tags.Demo.Models.ViewModels 6 | { 7 | public class PreviewModel : PageViewModel 8 | { 9 | public PreviewModel(SitePageData currentPage, IContent previewContent) 10 | : base(currentPage) 11 | { 12 | PreviewContent = previewContent; 13 | Areas = new List(); 14 | } 15 | 16 | public IContent PreviewContent { get; set; } 17 | public List Areas { get; set; } 18 | 19 | public class PreviewArea 20 | { 21 | public bool Supported { get; set; } 22 | public string AreaName { get; set; } 23 | public string AreaTag { get; set; } 24 | public ContentArea ContentArea { get; set; } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Models/ViewModels/VideoViewModel.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Geta.Tags.Demo.Models.ViewModels 3 | { 4 | /// 5 | /// View model for the video file 6 | /// 7 | public class VideoViewModel 8 | { 9 | /// 10 | /// Gets or sets the URL to the video. 11 | /// 12 | public string Url { get; set; } 13 | 14 | /// 15 | /// Gets or sets the URL to a preview image for the video. 16 | /// 17 | public string PreviewImageUrl { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Geta.Tags.Demo")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Geta.Tags.Demo")] 13 | [assembly: AssemblyCopyright("Copyright © 2019")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("85ba468d-9e6c-44a4-9112-1862d869e7ef")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Resources/LanguageFiles/Display.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Mobile 7 | 8 | 9 | Web 10 | 11 | 12 | 13 | Full 14 | Wide 15 | Narrow 16 | 17 | 18 | Standard (1366x768) 19 | iPad horizontal (1024x768) 20 | iPhone vertical (320x568) 21 | Android vertical (480x800) 22 | 23 | 24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Resources/LanguageFiles/EditorHints.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Button Text 11 | 12 | 13 | 14 | 15 | 16 | This block type does not have a renderer for this type of content area. 17 | 18 | 19 | 20 | 21 | 22 | Error while rendering {0} {1} 23 | 24 | 25 | 26 | The block '{0}' when displayed as {1} 27 | The block '{0}' cannot be displayed as {1} 28 | No renderer found for '{0}' 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Resources/LanguageFiles/GroupNames.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Default 9 | 10 | 11 | News 12 | 13 | 14 | Products 15 | 16 | 17 | SEO 18 | 19 | 20 | Site settings 21 | 22 | 23 | Specialized 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Resources/LanguageFiles/Views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | E-mail 8 | Phone 9 | No contact selected 10 | 11 | 12 |
13 | The Company 14 | Customer Zone 15 | Log in 16 | Log out 17 | News & Events 18 | Products 19 |
20 | 21 | 22 | Search 23 | 24 | 25 | 26 | Latest news 27 | News list will be empty since no list root has been set 28 | 29 | 30 | 31 | no 32 | Search result 33 | Search 34 | Your search for 35 | resulted in 36 | hits 37 | EPiServer Search is not configured or is not active for this website. 38 | 39 | 40 |
41 | 42 |
43 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Resources/LanguageFiles/_ReadMe.txt: -------------------------------------------------------------------------------- 1 | All language files in this folder are included in the LocalizationService. 2 | 3 | The path to this folder is configured in EPiServerFramework.config: 4 | 5 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web; 3 | using EPiServer.Cms.UI.AspNetIdentity; 4 | using Microsoft.AspNet.Identity; 5 | using Microsoft.AspNet.Identity.Owin; 6 | using Microsoft.Owin; 7 | using Microsoft.Owin.Security.Cookies; 8 | using Owin; 9 | 10 | [assembly: OwinStartup(typeof(Geta.Tags.Demo.Startup))] 11 | 12 | namespace Geta.Tags.Demo 13 | { 14 | public class Startup 15 | { 16 | 17 | public void Configuration(IAppBuilder app) 18 | { 19 | 20 | // Add CMS integration for ASP.NET Identity 21 | app.AddCmsAspNetIdentity(); 22 | 23 | // Remove to block registration of administrators 24 | app.UseAdministratorRegistrationPage(() => HttpContext.Current.Request.IsLocal); 25 | 26 | // Use cookie authentication 27 | app.UseCookieAuthentication(new CookieAuthenticationOptions 28 | { 29 | AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 30 | LoginPath = new PathString(Global.LoginPath), 31 | Provider = new CookieAuthenticationProvider 32 | { 33 | // If the "/util/login.aspx" has been used for login otherwise you don't need it you can remove OnApplyRedirect. 34 | OnApplyRedirect = cookieApplyRedirectContext => 35 | { 36 | app.CmsOnCookieApplyRedirect(cookieApplyRedirectContext, cookieApplyRedirectContext.OwinContext.Get>()); 37 | }, 38 | 39 | // Enables the application to validate the security stamp when the user logs in. 40 | // This is a security feature which is used when you change a password or add an external login to your account. 41 | OnValidateIdentity = SecurityStampValidator.OnValidateIdentity, ApplicationUser>( 42 | validateInterval: TimeSpan.FromMinutes(30), 43 | regenerateIdentity: (manager, user) => manager.GenerateUserIdentityAsync(user)) 44 | } 45 | }); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/css/editmode.css: -------------------------------------------------------------------------------- 1 | /* CSS specific to edit mode, such as help content displayed to the editor */ 2 | 3 | .alert-info 4 | { 5 | border-color: #B8C0C5; 6 | color: black; 7 | font-family: Verdana; 8 | font-size: 1em; 9 | font-style: italic; 10 | background-color: #B8C0C5; 11 | box-shadow: 3px 3px 5px #CCC; 12 | text-align: center; 13 | } 14 | 15 | .alert-error p { 16 | text-align: left; 17 | } 18 | 19 | .alert-error .heading { 20 | font-weight: bold; 21 | color: #ff0000; 22 | } 23 | 24 | .alert-error .details { 25 | font-size: 0.8em; 26 | max-height: 100px; 27 | overflow: scroll; 28 | } 29 | 30 | .header.dim { 31 | margin: 2% 0; 32 | opacity: 0.3; 33 | } -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/css/editor.css: -------------------------------------------------------------------------------- 1 | @import "bootstrap.css"; 2 | @import "style.css"; 3 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/css/media.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | /* CSS Document */ 3 | 4 | 5 | 6 | @media (max-width: 979px) { 7 | .span12, .span8, .span6, .span4 { 8 | float: none; 9 | width: auto !important; 10 | } 11 | 12 | .span4 h2, .span6 h2 13 | { 14 | clear:both; 15 | } 16 | 17 | .teaserblock.full h2, .teaserblock.wide h2 { 18 | font-size: 2.5em; 19 | } 20 | 21 | .subHeader 22 | { 23 | width:100% !important; 24 | font-weight:normal !important; 25 | } 26 | 27 | .jumbotronblock .span4 28 | { 29 | display:none; 30 | } 31 | 32 | .media .mediaImg img 33 | { 34 | width:75%;} 35 | 36 | 37 | .hideMyTracks {display:none;} 38 | 39 | } 40 | 41 | 42 | 43 | @media (max-width: 834px) { 44 | 45 | .teaserblock.full h2, .teaserblock.wide h2 { 46 | clear:both; 47 | } 48 | 49 | .teaserblock.full h2, .teaserblock.wide h2, .teaserblock.full p, .teaserblock.wide p { 50 | text-align:center; 51 | } 52 | 53 | .teaserblock.full img, .teaserblock.wide img { 54 | width:75%; 55 | } 56 | 57 | #header .span2 58 | { 59 | float:left; 60 | width:20% !important; 61 | } 62 | 63 | #header .span10 64 | { 65 | float:right; 66 | } 67 | 68 | .span12 .media .mediaText, .span8 .media .mediaText 69 | { 70 | clear:both; 71 | margin:0 2% 5px; 72 | } 73 | 74 | } 75 | 76 | @media (max-width: 767px) { 77 | 78 | h1 79 | { 80 | font-size:35px !important; 81 | } 82 | 83 | h2 84 | { 85 | font-size:20px !important; 86 | } 87 | 88 | .introduction { 89 | font-size:1.2em !important; 90 | margin:2% 0 4% 0; 91 | } 92 | 93 | .alloyMenu .navbar .nav>li>a { 94 | color:#323335; 95 | padding-bottom:12px; 96 | line-height:23px; 97 | text-shadow:none !important; 98 | outline:none; 99 | } 100 | 101 | .alloyMenu .navbar .nav>li>ul>li a:hover { 102 | outline:1px solid; 103 | background:#2980bd; 104 | } 105 | 106 | 107 | .span3 { 108 | width:100% !important; 109 | 110 | } 111 | 112 | .teaserblock img { 113 | width:75%; 114 | } 115 | 116 | .btn-blue { 117 | margin-right:1%; 118 | float:left; 119 | clear:none; 120 | } 121 | 122 | .searchButton { 123 | float:right; 124 | margin-top:7px !important; 125 | } 126 | 127 | .alloyMenu .navbar-search .search-query 128 | { 129 | max-width:70%; 130 | } 131 | 132 | 133 | #header .span2 134 | { 135 | float:left; 136 | width:20% !important; 137 | } 138 | 139 | #header .span10 140 | { 141 | float:right; 142 | } 143 | 144 | } 145 | 146 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/New_FDT_Press_Contact_.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/New_FDT_Press_Contact_.JPG -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/carouselbackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/carouselbackground.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/contact.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/contact.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/exampelspan4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/exampelspan4.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/experts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/experts.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/fallows-media-wide.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/fallows-media-wide.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/leader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/leader.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/leader2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/leader2.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/logotype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/logotype.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/meet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/meet.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-article.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-contact.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-product.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-standard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail-standard.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/page-type-thumbnail.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/person.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/plan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/plan.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/play.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/playInactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/playInactive.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/productLandingv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/productLandingv2.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/searchbutton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/searchbutton.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/searchbuttonsmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/searchbuttonsmall.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/gfx/track.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/gfx/track.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/html/error.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | An error occured 4 | 5 | 6 | 9 | Logotype 10 |

When things go wrong...

11 |

This error message can be modified by editing the /Static/html/error.htm file.

12 | 13 | 14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/jwplayer/player.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/jwplayer/player.swf -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/jwplayer/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/jwplayer/preview.jpg -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Static/jwplayer/video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/Static/jwplayer/video.mp4 -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/ArticlePage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 | 4 | @{ Layout = "~/Views/Shared/Layouts/_LeftNavigation.cshtml"; } 5 | 6 |

x.CurrentPage.PageName)>@Model.CurrentPage.PageName

7 |

x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription

8 |
9 |
x.CurrentPage.MainBody)> 10 | @Html.DisplayFor(m => m.CurrentPage.MainBody) 11 |
12 |
13 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.TwoThirdsWidth }) 14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/ContactBlock/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model ContactBlockModel 2 | 3 |
4 | @Html.PropertyFor(x => x.Image) 5 |

x.Heading)>@Model.Heading

6 | @Html.PropertyFor(x => x.ContactPage) 7 | @if(Model.ShowLink) 8 | { 9 | x.LinkText)> 10 | @Model.LinkText 11 | 12 | } 13 |
14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/GetaTagsPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model PageViewModel 2 | 3 | @{ Layout = "~/Views/Shared/Layouts/_LeftNavigation.cshtml"; } 4 | 5 |

x.CurrentPage.PageName)>@Model.CurrentPage.PageName

6 |

x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription

7 |
8 |
    9 |
  • @Model.CurrentPage.Tags1
  • 10 |
  • @Model.CurrentPage.Tags2
  • 11 |
  • @Model.CurrentPage.Tags3
  • 12 |
13 |
-------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/ImageFile/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model ImageViewModel 2 | 3 | @Model.Name 4 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/LandingPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 |
4 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row equal-height", tag = Global.ContentAreaTags.FullWidth }) 5 |
6 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/NewsPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 | 4 | @{ Layout = "~/Views/Shared/Layouts/_LeftNavigation.cshtml"; } 5 | 6 |

x.CurrentPage.PageName)>@Model.CurrentPage.PageName

7 |

x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription

8 |
9 |
x.CurrentPage.MainBody)> 10 | @Html.DisplayFor(m => m.CurrentPage.MainBody) 11 |
12 |
13 | @Html.PropertyFor(x => x.CurrentPage.NewsList) 14 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.TwoThirdsWidth }) 15 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/PageListBlock/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model PageListModel 2 | @Html.FullRefreshPropertiesMetaData(new[] { "IncludePublishDate", "IncludeIntroduction", "Count", "SortOrder", "Root", "PageTypeFilter", "CategoryFilter", "Recursive" }) 3 |

x.Heading)>@Model.Heading

4 |
5 | 6 | @foreach(var page in Model.Pages) 7 | { 8 |
9 |

10 | @Html.PageLink(page) 11 |

12 | @if(Model.ShowPublishDate && page.StartPublish.HasValue) 13 | { 14 |

@Html.DisplayFor(x => page.StartPublish)

15 | } 16 | @if(Model.ShowIntroduction && page is SitePageData) 17 | { 18 | var withTeaserText = (SitePageData) page; 19 |

@withTeaserText.TeaserText

20 | } 21 |
22 |
23 | } 24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Preview/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model PreviewModel 2 | 3 | @foreach(var area in Model.Areas) 4 | { 5 | if(area.Supported) 6 | { 7 | @Html.Partial("TemplateHint", string.Format(@Html.Translate("/preview/heading"), Model.PreviewContent.Name, @Html.Translate(area.AreaName))) 8 |
9 | @Html.DisplayFor(x => area.ContentArea, new {Tag = area.AreaTag}) 10 |
11 | } 12 | else 13 | { 14 | @Html.Partial("TemplateHint", string.Format(@Html.Translate("/preview/norenderer"), Model.PreviewContent.Name, @Html.Translate(area.AreaName))) 15 | } 16 | } 17 | 18 | @if(!Model.Areas.Any()) 19 | { 20 | @Html.Partial("TemplateHint", string.Format(@Html.Translate("/preview/norendereratall"), Model.PreviewContent.Name)) 21 | } 22 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/ProductPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 | 4 | @{ Layout = "~/Views/Shared/Layouts/_TwoPlusOne.cshtml"; } 5 | 6 |

x.CurrentPage.PageName)>@Model.CurrentPage.PageName

7 |

x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription

8 |
9 |
x.CurrentPage.MainBody)> 10 | @Html.DisplayFor(m => m.CurrentPage.MainBody) 11 |
12 |
13 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.TwoThirdsWidth }) 14 | 15 | @section RelatedContent 16 | { 17 |
x.CurrentPage.PageImage)> 18 | 19 |
20 | 21 |
22 |

x.CurrentPage.PageName)>@Model.CurrentPage.PageName

23 | @Html.PropertyFor(x => x.CurrentPage.UniqueSellingPoints) 24 |
25 | 26 | @Html.PropertyFor(x => x.CurrentPage.RelatedContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.OneThirdWidth }) 27 | } 28 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Register/Index.cshtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @using System.Web.Optimization 4 | @using Geta.Tags.Demo.Controllers 5 | @model Geta.Tags.Demo.Models.RegisterViewModel 6 | @{ 7 | Layout = ""; 8 | } 9 | 10 | 11 | 12 | Create Administrator Account 13 | @Styles.Render("~/bundles/css") 14 | @Scripts.Render("~/bundles/js") 15 | 16 | 17 | 18 |
19 |
20 |
21 | 22 |

Create Administrator Account

23 | 24 | @using (Html.BeginForm("/", "Register", FormMethod.Post)) 25 | { 26 | @Html.AntiForgeryToken() 27 |
28 | @Html.LabelFor(m => m.Username) 29 | @Html.TextBoxFor(m => m.Username) 30 | @Html.ValidationMessageFor(m => m.Username) 31 |
32 |
33 | @Html.LabelFor(m => m.Email) 34 | @Html.TextBoxFor(m => m.Email) 35 | @Html.ValidationMessageFor(m => m.Email) 36 |
37 |
38 | @Html.LabelFor(m => m.Password) 39 | @Html.PasswordFor(m => m.Password) 40 | @Html.ValidationMessageFor(m => m.Password) 41 |
42 |
43 | @Html.LabelFor(m => m.ConfirmPassword) 44 | @Html.PasswordFor(m => m.ConfirmPassword) 45 | @Html.ValidationMessageFor(m => m.ConfirmPassword) 46 |
47 |
48 | @Html.ValidationMessage(RegisterController.ErrorKey) 49 |
50 |
51 | 52 |
53 | } 54 |
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/ButtonBlock.cshtml: -------------------------------------------------------------------------------- 1 | @model ButtonBlock 2 | 3 | m.ButtonText)> 4 | @{ 5 | var buttonText = string.IsNullOrWhiteSpace(Model.ButtonText) 6 | ? Html.Translate("/blocks/buttonblockcontrol/buttondefaulttext") 7 | : Model.ButtonText; 8 | } 9 | @buttonText 10 | 11 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/EditorialBlock.cshtml: -------------------------------------------------------------------------------- 1 | @model EditorialBlock 2 | 3 |
x.MainBody)> 4 | @Html.DisplayFor(x => Model.MainBody) 5 |
6 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/JumbotronBlockWide.cshtml: -------------------------------------------------------------------------------- 1 | @model JumbotronBlock 2 | 3 |
4 |
5 | @Html.PropertyFor(m=>m.Image) 6 |
7 | 8 |
9 |

m.Heading)>@Model.Heading

10 |

m.SubHeading)>@Model.SubHeading

11 | m.ButtonText)>@Model.ButtonText 12 |
13 |
14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/NoRenderer.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Shell.Web.Mvc.Html 2 | @Html.Partial("TemplateHint", @Html.Translate("/blocks/norenderer/message")) 3 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/SiteLogotypeBlock.cshtml: -------------------------------------------------------------------------------- 1 | @model SiteLogotypeBlock 2 | 3 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/TeaserBlock.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Core 2 | @using Geta.Tags.Demo.Controllers 3 | @model TeaserBlock 4 |
5 | @*Link the teaser block only if a link has been set and not displayed in preview*@ 6 | @using(Html.BeginConditionalLink( 7 | !ContentReference.IsNullOrEmpty(Model.Link) && !(ViewContext.Controller is PreviewController), 8 | Url.PageLinkUrl(Model.Link), 9 | Model.Heading)) 10 | { 11 |

x.Heading)>@Model.Heading

12 |

x.Text)>@Model.Text

13 |
x.Image)>
14 | } 15 | 16 |
17 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Blocks/TeaserBlockWide.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Core 2 | @using Geta.Tags.Demo.Controllers 3 | @model TeaserBlock 4 | 5 |
6 | @*Link the teaser block only if a link has been set and not displayed in preview*@ 7 | @using(Html.BeginConditionalLink( 8 | !ContentReference.IsNullOrEmpty(Model.Link) && !(ViewContext.Controller is PreviewController), 9 | Url.PageLinkUrl(Model.Link), 10 | Model.Heading)) 11 | { 12 |
13 |
x.Image)> 14 | 15 |
16 |
17 |

x.Heading)>@Model.Heading

18 |

x.Text)>@Model.Text

19 |
20 |
21 | } 22 |
23 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Breadcrumbs.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Core 2 | @using EPiServer.Web 3 | @*Helper used as template for a page in the bread crumb, recursively triggering the rendering of the next page*@ 4 | @helper ItemTemplate(HtmlHelpers.MenuItem breadCrumbItem) { 5 | if (breadCrumbItem.Selected) 6 | { 7 | if (breadCrumbItem.Page.HasTemplate() && !breadCrumbItem.Page.ContentLink.CompareToIgnoreWorkID(Model.CurrentPage.ContentLink)) 8 | { 9 | @Html.PageLink(breadCrumbItem.Page) 10 | } 11 | else 12 | { 13 | @breadCrumbItem.Page.PageName 14 | } 15 | if (!breadCrumbItem.Page.ContentLink.CompareToIgnoreWorkID(Model.CurrentPage.ContentLink)) 16 | { 17 | / 18 | @Html.MenuList(breadCrumbItem.Page.ContentLink, ItemTemplate) 19 | } 20 | } 21 | } 22 | 23 |
24 |
25 |
    26 | @Html.ContentLink(SiteDefinition.Current.StartPage) 27 | / 28 | @Html.MenuList(SiteDefinition.Current.StartPage, ItemTemplate, requireVisibleInMenu: false, requirePageTemplate: false) 29 |
30 |
31 |
32 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/DisplayTemplates/ContactPage.cshtml: -------------------------------------------------------------------------------- 1 | @model ContactPage 2 | 3 |

4 | @if(Model != null) 5 | { 6 | @Model.PageName
7 | @Html.Translate("/contact/phone")@: : @Model.Phone
8 | @Html.Translate("/contact/email")@: : @Html.DisplayFor(m => m.Email) 9 | } 10 | else 11 | { 12 | @Html.Translate("/contact/noneselected") 13 | } 14 |

15 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/DisplayTemplates/DateTime.cshtml: -------------------------------------------------------------------------------- 1 | @model DateTime 2 | @Model.ToString("d MMMM yyyy") 3 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/DisplayTemplates/Image.cshtml: -------------------------------------------------------------------------------- 1 | @model EPiServer.Core.ContentReference 2 | @if (Model != null) 3 | { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/DisplayTemplates/StringsCollection.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @if(Model != null && Model.Any()) 3 | { 4 |
    5 | @foreach(var stringValue in Model) 6 | { 7 |
  • @stringValue
  • 8 | } 9 |
10 | } 11 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Footer.cshtml: -------------------------------------------------------------------------------- 1 | @model IPageViewModel 2 |
3 | 40 |
41 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Header.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Editor 2 | @using EPiServer.Core 3 | @using EPiServer.Web 4 | @model IPageViewModel 5 |
6 | 51 |
52 | 53 |
54 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Layouts/_LeftNavigation.cshtml: -------------------------------------------------------------------------------- 1 | @model IPageViewModel 2 | 3 | @{ Layout = "~/Views/Shared/Layouts/_Root.cshtml"; } 4 | 5 | @{Html.RenderPartial("Breadcrumbs", Model);} 6 | 7 |
8 |
9 |
10 |
11 | @{Html.RenderPartial("SubNavigation", Model);} 12 | @RenderSection("RelatedContent", false) 13 |
14 |
15 |
16 | 17 |
18 | @RenderBody() 19 |
20 |
21 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Layouts/_Root.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web.Optimization 2 | @using EPiServer.Framework.Web.Mvc.Html 3 | @using Geta.Tags.Demo.Business 4 | @model IPageViewModel 5 | 6 | 7 | 8 | 9 | 10 | 11 | @Model.CurrentPage.MetaTitle 12 | @if (Model.CurrentPage.MetaKeywords != null && Model.CurrentPage.MetaKeywords.Length > 0) 13 | { 14 | 15 | } 16 | @if (!string.IsNullOrWhiteSpace(Model.CurrentPage.MetaDescription)) 17 | { 18 | 19 | } 20 | 21 | @Html.CanonicalLink() 22 | @Html.AlternateLinks() 23 | @Styles.Render("~/bundles/css") 24 | @Scripts.Render("~/bundles/js") 25 | @Html.RequiredClientResources("Header") @*Enable components to require resources. For an example, see the view for VideoBlock.*@ 26 | 27 | 28 | 29 | @if (Model.Layout.IsInReadonlyMode) 30 | { 31 | Html.RenderPartial("Readonly", Model); 32 | } 33 | 34 | @Html.RenderEPiServerQuickNavigator() 35 | @Html.FullRefreshPropertiesMetaData() 36 |
37 | @if(!Model.Layout.HideHeader) 38 | { 39 | Html.RenderPartial("Header", Model); 40 | } 41 | @RenderBody() 42 | @if(!Model.Layout.HideFooter) 43 | { 44 | Html.RenderPartial("Footer", Model); 45 | } 46 |
47 | @Html.RequiredClientResources("Footer") 48 | 49 | 50 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Layouts/_TwoPlusOne.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model IPageViewModel 3 | @{ Layout = "~/Views/Shared/Layouts/_Root.cshtml"; } 4 | 5 | @{Html.RenderPartial("Breadcrumbs");} 6 | 7 |
8 | 9 |
10 | @RenderBody() 11 |
12 | 13 |
14 | @if (IsSectionDefined("RelatedContent")) 15 | { 16 | @RenderSection("RelatedContent") 17 | } 18 | else if (Model.CurrentPage is IHasRelatedContent) 19 | { 20 | @Html.PropertyFor(x => ((IHasRelatedContent)x.CurrentPage).RelatedContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.OneThirdWidth }) 21 | } 22 |
23 |
24 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/PagePartials/ContactPage.cshtml: -------------------------------------------------------------------------------- 1 | @model ContactPage 2 | 3 |
4 | 5 |

@Model.PageName

6 |

@Model.TeaserText

7 |

8 | @Html.Translate("/contact/email"): @Html.DisplayFor(x => x.Email)
9 | @Html.Translate("/contact/phone"): @Model.Phone 10 |

11 |
12 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/PagePartials/ContactPageWide.cshtml: -------------------------------------------------------------------------------- 1 | @model ContactPage 2 |
3 |
4 |
5 | 6 |
7 |

@Model.PageName

8 |

@Model.TeaserText

9 |

10 | @Html.Translate("/contact/email"): @Html.DisplayFor(x => x.Email)
11 | @Html.Translate("/contact/phone"): @Model.Phone 12 |

13 |
14 |
15 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/PagePartials/Page.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Core 2 | @model SitePageData 3 | 4 |
5 | @using(Html.BeginConditionalLink(Model.HasTemplate(), Url.PageLinkUrl(Model), Model.PageName)) 6 | { 7 |

@Model.PageName

8 |

@Model.TeaserText

9 | @Html.DisplayFor(m => m.PageImage) 10 | } 11 |
12 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/PagePartials/PageWide.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Core 2 | @model SitePageData 3 |
4 | @using(Html.BeginConditionalLink(Model.HasTemplate(), Url.PageLinkUrl(Model), Model.PageName)) 5 | { 6 |
7 |
8 | @Html.DisplayFor(m => m.PageImage) 9 |
10 |

@Model.PageName

11 |

@Model.TeaserText

12 |
13 | } 14 |
15 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/Readonly.cshtml: -------------------------------------------------------------------------------- 1 | @model IPageViewModel 2 | 3 |
4 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/SubNavigation.cshtml: -------------------------------------------------------------------------------- 1 | @model IPageViewModel 2 | 3 | @helper ItemTemplate(HtmlHelpers.MenuItem firstLevelItem) { 4 | 10 |
11 |
    12 | @Html.MenuList(firstLevelItem.Page.ContentLink, SubLevelItemTemplate) 13 |
14 |
15 | } 16 | 17 | @helper SubLevelItemTemplate(HtmlHelpers.MenuItem subLevelItem) { 18 |
  • 19 | @Html.PageLink(subLevelItem.Page) 20 | @*To show more levels call Html.MenuList recursively here if subLevelItem.Selected == true*@ 21 |
  • 22 | } 23 | 24 |
    25 |
    26 | @if(Model.Section != null) { 27 | @Html.MenuList(Model.Section.ContentLink, ItemTemplate) 28 | } 29 |
    30 |
    31 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/TemplateError.cshtml: -------------------------------------------------------------------------------- 1 | @model ContentRenderingErrorModel 2 |
    3 |

    @string.Format(Html.Translate("/renderingerror/heading"), Model.ContentTypeName, Model.ContentName)

    4 |

    5 | @Model.Exception.Message
    6 | @Model.Exception.StackTrace 7 |

    8 |
    9 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/Shared/TemplateHint.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 |

    @Model

    3 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/StandardPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 | 4 | @{ Layout = "~/Views/Shared/Layouts/_LeftNavigation.cshtml"; } 5 | 6 |

    x.CurrentPage.PageName)>@Model.CurrentPage.PageName

    7 |

    x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription

    8 |
    9 |
    x.CurrentPage.MainBody)> 10 | @Html.DisplayFor(m => m.CurrentPage.MainBody) 11 |
    12 |
    13 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row", Tag = Global.ContentAreaTags.TwoThirdsWidth }) 14 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/StartPage/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using Geta.Tags.Demo 2 | @model PageViewModel 3 | 4 | @Html.PropertyFor(x => x.CurrentPage.MainContentArea, new { CssClass = "row equal-height", tag = Global.ContentAreaTags.FullWidth }) 5 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/VideoFile/Index.cshtml: -------------------------------------------------------------------------------- 1 | @using EPiServer.Framework.Web.Resources 2 | @model VideoViewModel 3 | @{ 4 | ClientResources.RequireScript(Href("~/static/jwplayer/jwplayer.js")); 5 | 6 | //The video element's ID needs to be unique in order for several video blocks and possible the same video block, to work on the same page 7 | var containerId = "video-container-" + Guid.NewGuid().GetHashCode(); 8 | } 9 | @Html.FullRefreshPropertiesMetaData(new []{"Url"}) 10 |
    m.Url)> 11 |
    12 |
    13 |
    14 | 15 | 30 |
    31 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Views/_viewstart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "~/Views/Shared/Layouts/_Root.cshtml"; 3 | } 4 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/docker-compose.dcproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2.1 5 | Windows 6 | 072efcdc-eac4-48ff-8e5d-efce769492d6 7 | LaunchBrowser 8 | http://tags.getalocaltest.me 9 | geta-tags-sample-web 10 | 11 | 12 | 13 | docker-compose.yml 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/docker-compose.override.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | 3 | services: 4 | geta-tags-sample-web: 5 | ports: 6 | - "80" 7 | networks: 8 | default: 9 | external: 10 | name: nat 11 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | 3 | services: 4 | geta-tags-sample-web: 5 | image: ${DOCKER_REGISTRY-}geta-tags-sample-web 6 | build: 7 | context: . 8 | dockerfile: Dockerfile 9 | networks: 10 | geta-tags-network: 11 | ipv4_address: 172.16.238.71 12 | depends_on: 13 | - geta-tags-sample-db 14 | volumes: 15 | - ../../src/module/:C:/data/ 16 | mac_address: 84-69-95-6C-7F-85 17 | geta-tags-sample-db: 18 | image: microsoft/mssql-server-windows-developer:1709 19 | environment: 20 | - ACCEPT_EULA=Y 21 | - sa_password=T@gs19 22 | - attach_dbs=[{'dbName':'EPiServerDB_dada52e0','dbFiles':['C:\\data\\EPiServerDB_dada52e0.mdf','C:\\data\\EPiServerDB_dada52e0_log.ldf']}] 23 | volumes: 24 | - ../Geta.Tags.Sample/App_Data:C:/data/ 25 | networks: 26 | geta-tags-network: 27 | ipv4_address: 172.16.238.72 28 | networks: 29 | geta-tags-network: 30 | ipam: 31 | driver: default 32 | config: 33 | - subnet: '172.16.238.0/24' 34 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/favicon.ico: -------------------------------------------------------------------------------- 1 | h( ...>>>Ɋ9777000$$$666!!!### -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/module.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/CMS/CMS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/modules/_protected/CMS/CMS.zip -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/CMS/web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/EPiServer.Cms.TinyMce/EPiServer.Cms.TinyMce.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/modules/_protected/EPiServer.Cms.TinyMce/EPiServer.Cms.TinyMce.zip -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/EPiServer.Cms.TinyMce/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/Shell/Shell.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Geta/Tags/4c0151cfcc4eb3480e88c9ca09135ebeb32045ee/samples/Geta.Tags.Sample/modules/_protected/Shell/Shell.zip -------------------------------------------------------------------------------- /samples/Geta.Tags.Sample/modules/_protected/Shell/web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/Attributes/TagsGroupKeyAttribute.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System; 5 | 6 | namespace Geta.Tags.Attributes 7 | { 8 | [AttributeUsage(AttributeTargets.Property)] 9 | public class TagsGroupKeyAttribute : Attribute 10 | { 11 | public TagsGroupKeyAttribute(string key) 12 | { 13 | Key = key; 14 | } 15 | 16 | public virtual string Key { get; } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Controllers/GetaTagsController.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Linq; 5 | using System.Web.Mvc; 6 | using EPiServer.ServiceLocation; 7 | using Geta.Tags.Interfaces; 8 | 9 | namespace Geta.Tags.Controllers 10 | { 11 | public class GetaTagsController : Controller 12 | { 13 | private readonly ITagService _tagService; 14 | 15 | public GetaTagsController() : this (ServiceLocator.Current.GetInstance()) 16 | { 17 | } 18 | 19 | public GetaTagsController(ITagService tagService) 20 | { 21 | _tagService = tagService; 22 | } 23 | 24 | public JsonResult Index(string term, string groupKey = null) 25 | { 26 | var normalized = Normalize(term); 27 | var tags = _tagService.GetAllTags(); 28 | 29 | if (IsNotEmpty(normalized)) 30 | { 31 | tags = tags.Where(t => t.Name.ToLower().StartsWith(normalized.ToLower())); 32 | 33 | if (IsNotEmpty(groupKey)) 34 | { 35 | tags = tags.Where(t => t.GroupKey.Equals(groupKey)); 36 | } 37 | } 38 | 39 | var items = tags.OrderBy(t => t.Name) 40 | .Select(t => t.Name) 41 | .Take(10) 42 | .ToList(); 43 | 44 | return Json(items, JsonRequestBehavior.AllowGet); 45 | } 46 | 47 | private static string Normalize(string term) 48 | { 49 | return string.IsNullOrWhiteSpace(term) ? string.Empty : term; 50 | } 51 | 52 | private static bool IsNotEmpty(string name) 53 | { 54 | return !string.IsNullOrEmpty(name); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /src/EditorDescriptors/GetaTagsAttribute.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using EPiServer.Cms.Shell.Extensions; 5 | using EPiServer.DataAnnotations; 6 | using EPiServer.Shell; 7 | using EPiServer.Shell.ObjectEditing; 8 | using Geta.Tags.Attributes; 9 | using Geta.Tags.Helpers; 10 | using System; 11 | using System.Linq; 12 | using System.Web.Mvc; 13 | 14 | namespace Geta.Tags.EditorDescriptors 15 | { 16 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 17 | public class GetaTagsAttribute : Attribute, IMetadataAware 18 | { 19 | public bool AllowSpaces { get; set; } 20 | public bool CaseSensitive { get; set; } 21 | public bool AllowDuplicates { get; set; } 22 | public int TagLimit { get; set; } 23 | 24 | public bool ReadOnly { get; set; } 25 | 26 | public GetaTagsAttribute() 27 | { 28 | AllowDuplicates = false; 29 | AllowSpaces = false; 30 | CaseSensitive = true; 31 | ReadOnly = false; 32 | TagLimit = -1; 33 | } 34 | 35 | public virtual void OnMetadataCreated(ModelMetadata metadata) 36 | { 37 | var extendedMetadata = metadata as ExtendedMetadata; 38 | 39 | if (extendedMetadata == null) 40 | { 41 | return; 42 | } 43 | 44 | var groupKeyAttribute = extendedMetadata 45 | .Attributes 46 | .FirstOrDefault(a => typeof(TagsGroupKeyAttribute) == a.GetType()) as TagsGroupKeyAttribute; 47 | var cultureSpecificAttribute = extendedMetadata 48 | .Attributes 49 | .FirstOrDefault(a => typeof(CultureSpecificAttribute) == a.GetType()) as CultureSpecificAttribute; 50 | var ownerContent = extendedMetadata.FindOwnerContent(); 51 | 52 | extendedMetadata.ClientEditingClass = "geta-tags/TagsSelection"; 53 | extendedMetadata.CustomEditorSettings["uiType"] = extendedMetadata.ClientEditingClass; 54 | extendedMetadata.CustomEditorSettings["uiWrapperType"] = UiWrapperType.Floating; 55 | extendedMetadata.EditorConfiguration["GroupKey"] = 56 | TagsHelper.GetGroupKeyFromAttributes(groupKeyAttribute, cultureSpecificAttribute, ownerContent); 57 | extendedMetadata.EditorConfiguration["allowSpaces"] = AllowSpaces; 58 | extendedMetadata.EditorConfiguration["allowDuplicates"] = AllowDuplicates; 59 | extendedMetadata.EditorConfiguration["caseSensitive "] = CaseSensitive; 60 | extendedMetadata.EditorConfiguration["readOnly "] = ReadOnly; 61 | extendedMetadata.EditorConfiguration["tagLimit"] = TagLimit; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /src/EditorDescriptors/TagsEditorDescriptor.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using EPiServer.Cms.Shell.Extensions; 8 | using EPiServer.DataAnnotations; 9 | using EPiServer.Shell.ObjectEditing; 10 | using EPiServer.Shell.ObjectEditing.EditorDescriptors; 11 | using Geta.Tags.Attributes; 12 | using Geta.Tags.Helpers; 13 | 14 | namespace Geta.Tags.EditorDescriptors 15 | { 16 | [EditorDescriptorRegistration(TargetType = typeof(string), UIHint = "Tags")] 17 | public class TagsEditorDescriptor : EditorDescriptor 18 | { 19 | public TagsEditorDescriptor() 20 | { 21 | ClientEditingClass = "geta-tags/TagsSelection"; 22 | } 23 | 24 | public override void ModifyMetadata(ExtendedMetadata metadata, 25 | IEnumerable attributes) 26 | { 27 | var attrs = attributes.ToArray(); 28 | base.ModifyMetadata(metadata, attrs); 29 | var groupKeyAttribute = attrs.FirstOrDefault( 30 | a => typeof (TagsGroupKeyAttribute) == a.GetType()) as TagsGroupKeyAttribute; 31 | var cultureSpecificAttribute = attrs.FirstOrDefault( 32 | a => typeof(CultureSpecificAttribute) == a.GetType()) as CultureSpecificAttribute; 33 | var getaAttribute = attrs.FirstOrDefault( 34 | a => typeof(GetaTagsAttribute) == a.GetType()) as GetaTagsAttribute; 35 | var ownerContent = metadata.FindOwnerContent(); 36 | 37 | metadata.EditorConfiguration["GroupKey"] = 38 | TagsHelper.GetGroupKeyFromAttributes(groupKeyAttribute, cultureSpecificAttribute, ownerContent); 39 | metadata.EditorConfiguration["allowSpaces"] = getaAttribute?.AllowSpaces ?? false; 40 | metadata.EditorConfiguration["allowDuplicates"] = getaAttribute?.AllowDuplicates ?? false; 41 | metadata.EditorConfiguration["readOnly"] = getaAttribute?.ReadOnly ?? false; 42 | metadata.EditorConfiguration["caseSensitive"] = getaAttribute?.CaseSensitive ?? true; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /src/Geta.Tags.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Geta.Tags 5 | $version$ 6 | Geta.Tags 7 | Geta Digital 8 | Geta Digital 9 | https://github.com/Geta/Tags 10 | false 11 | Easily add tags to your EPiServer content and use the powerful query engine to get back what you want. 12 | Copyright © 2019 Geta 13 | EPiServer Tags 14 | http://cdn.geta.no/opensource/icons/geta-tags-icon.png 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Helpers/TagsHelper.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using EPiServer.Core; 5 | using EPiServer.DataAbstraction; 6 | using EPiServer.DataAnnotations; 7 | using EPiServer.Globalization; 8 | using EPiServer.Web; 9 | using Geta.Tags.Attributes; 10 | using System; 11 | using System.Collections; 12 | using System.Collections.Generic; 13 | using System.Globalization; 14 | 15 | namespace Geta.Tags.Helpers 16 | { 17 | public static class TagsHelper 18 | { 19 | public static string GetGroupKeyFromAttributes( 20 | TagsGroupKeyAttribute groupKeyAttribute, CultureSpecificAttribute cultureSpecificAttribute, IContent content) 21 | { 22 | var groupKey = string.Empty; 23 | 24 | if (groupKeyAttribute == null && cultureSpecificAttribute == null && content is ILocalizable localizableContent) 25 | { 26 | groupKey += localizableContent.MasterLanguage; 27 | } 28 | 29 | if (groupKeyAttribute != null) 30 | { 31 | groupKey += groupKeyAttribute.Key; 32 | } 33 | 34 | if (cultureSpecificAttribute != null && cultureSpecificAttribute.IsCultureSpecific) 35 | { 36 | groupKey += ContentLanguage.PreferredCulture ?? CultureInfo.CurrentCulture; 37 | } 38 | 39 | return groupKey; 40 | } 41 | 42 | public static ContentReference GetContentReference(Guid contentGuid) 43 | { 44 | return PermanentLinkUtility.FindContentReference(contentGuid) ?? ContentReference.EmptyReference; 45 | } 46 | 47 | public static IEnumerable GetContentReferences(List contentLinks) 48 | { 49 | foreach (var contentLink in contentLinks) 50 | { 51 | var reference = GetContentReference(contentLink); 52 | 53 | if (!ContentReference.IsNullOrEmpty(reference)) 54 | { 55 | yield return reference; 56 | } 57 | } 58 | } 59 | 60 | public static bool IsTagProperty(PropertyDefinition propertyDefinition) 61 | { 62 | return propertyDefinition != null 63 | && propertyDefinition.TemplateHint == "Tags"; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/Implementations/TagRepository.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using EPiServer.Data; 8 | using EPiServer.Data.Dynamic; 9 | using EPiServer.ServiceLocation; 10 | using Geta.Tags.Interfaces; 11 | using Geta.Tags.Models; 12 | 13 | namespace Geta.Tags.Implementations 14 | { 15 | [ServiceConfiguration(typeof(ITagRepository))] 16 | public class TagRepository : ITagRepository 17 | { 18 | private static DynamicDataStore TagStore => typeof(Tag).GetOrCreateStore(); 19 | 20 | public Tag GetTagById(Identity id) 21 | { 22 | return TagStore.Load(id); 23 | } 24 | 25 | public Tag GetTagByName(string name) 26 | { 27 | return TagStore.Find("Name", name).FirstOrDefault(); 28 | } 29 | 30 | public Tag GetTagByNameAndGroup(string name, string groupKey) 31 | { 32 | return TagStore 33 | .Find(new Dictionary 34 | { 35 | { "Name", name }, { "GroupKey", groupKey } 36 | }) 37 | .FirstOrDefault(); 38 | } 39 | 40 | public IEnumerable GetTagsByName(string name) 41 | { 42 | return TagStore.Find("Name", name); 43 | } 44 | 45 | public IEnumerable GetTagsByContent(Guid contentGuid) 46 | { 47 | return GetAllTags().Where(t => t.PermanentLinks.Contains(contentGuid)); 48 | } 49 | 50 | public IQueryable GetAllTags() 51 | { 52 | return TagStore.Items(); 53 | } 54 | 55 | public Identity Save(Tag tag) 56 | { 57 | if (string.IsNullOrEmpty(tag?.Name)) 58 | { 59 | return null; 60 | } 61 | 62 | var existingTag = GetTagByNameAndGroup(tag.Name, tag.GroupKey); 63 | return existingTag != null 64 | ? TagStore.Save(tag, existingTag.GetIdentity()) 65 | : TagStore.Save(tag); 66 | } 67 | 68 | public void Delete(Tag tag) 69 | { 70 | TagStore.Delete(tag); 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /src/InitializeModule.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Web.Mvc; 5 | using System.Web.Routing; 6 | using EPiServer.Framework; 7 | using EPiServer.Framework.Initialization; 8 | 9 | namespace Geta.Tags 10 | { 11 | [InitializableModule] 12 | public class InitializeModule : IInitializableModule 13 | { 14 | public void Initialize(InitializationEngine context) 15 | { 16 | RouteTable.Routes.MapRoute("GetaTags", "getatags", new { action = "Index", controller = "GetaTags" }); 17 | RouteTable.Routes.MapRoute( 18 | name: "GetaTagsAdmin", 19 | url: "getatagsadmin/{action}", 20 | defaults: new { controller = "GetaTagsAdmin", action = "Index" }); 21 | } 22 | 23 | public void Uninitialize(InitializationEngine context) { } 24 | } 25 | } -------------------------------------------------------------------------------- /src/Interfaces/ITagEngine.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Collections.Generic; 5 | using EPiServer.Core; 6 | using Geta.Tags.Models; 7 | 8 | namespace Geta.Tags.Interfaces 9 | { 10 | public interface ITagEngine 11 | { 12 | IEnumerable GetContentByTag(string tagName); 13 | IEnumerable GetContentsByTag(Tag tag); 14 | IEnumerable GetContentsByTag(string tagName, ContentReference rootContentReference); 15 | IEnumerable GetContentsByTag(Tag tag, ContentReference rootContentReference); 16 | IEnumerable GetContentReferencesByTags(string tagNames); 17 | IEnumerable GetContentReferencesByTags(IEnumerable tags); 18 | IEnumerable GetContentReferencesByTags(string tagNames, ContentReference rootContentReference); 19 | IEnumerable GetContentReferencesByTags(IEnumerable tags, ContentReference rootContentReference); 20 | } 21 | } -------------------------------------------------------------------------------- /src/Interfaces/ITagRepository.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using EPiServer.Data; 7 | using Geta.Tags.Models; 8 | 9 | namespace Geta.Tags.Interfaces 10 | { 11 | using System; 12 | 13 | public interface ITagRepository 14 | { 15 | Tag GetTagById(Identity id); 16 | [Obsolete("Use GetTagByNameAndGroup instead.")] 17 | Tag GetTagByName(string name); 18 | Tag GetTagByNameAndGroup(string name, string groupKey); 19 | IEnumerable GetTagsByName(string name); 20 | IEnumerable GetTagsByContent(Guid contentGuid); 21 | IQueryable GetAllTags(); 22 | Identity Save(Tag tag); 23 | void Delete(Tag tag); 24 | } 25 | } -------------------------------------------------------------------------------- /src/Interfaces/ITagService.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using EPiServer.Data; 7 | using Geta.Tags.Models; 8 | 9 | namespace Geta.Tags.Interfaces 10 | { 11 | using System; 12 | 13 | public interface ITagService 14 | { 15 | Tag GetTagById(Identity id); 16 | IEnumerable GetTagsByContent(Guid contentGuid); 17 | [Obsolete("Use GetTagByNameAndGroup instead.")] 18 | Tag GetTagByName(string name); 19 | Tag GetTagByNameAndGroup(string name, string groupKey); 20 | IEnumerable GetTagsByName(string name); 21 | IQueryable GetAllTags(); 22 | Identity Save(Tag tag); 23 | Tag Save(Guid contentGuid, string name, string groupKey); 24 | void Save(Guid contentGuid, IEnumerable names, string groupKey); 25 | void Delete(string name); 26 | void Delete(Identity id); 27 | } 28 | } -------------------------------------------------------------------------------- /src/Models/Tag.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using EPiServer.Data; 7 | using EPiServer.Data.Dynamic; 8 | 9 | namespace Geta.Tags.Models 10 | { 11 | [EPiServerDataStore(AutomaticallyCreateStore = true, AutomaticallyRemapStore = true)] 12 | public class Tag 13 | { 14 | public Identity Id { get; set; } 15 | 16 | public string Name { get; set; } 17 | 18 | public string GroupKey { get; set; } 19 | 20 | /// 21 | /// Lowercase, words combined by - between them 22 | /// 23 | public string Slug { get; set; } 24 | 25 | public string Description { get; set; } 26 | 27 | // number of objects, pages that use this term 28 | public int Count => PermanentLinks?.Count ?? 0; 29 | 30 | public IList PermanentLinks { get; set; } 31 | 32 | public bool checkedEditContentTags { get; set; } 33 | 34 | public override int GetHashCode() 35 | { 36 | return Name == null ? base.GetHashCode() : Name.GetHashCode(); 37 | } 38 | 39 | public override bool Equals(object obj) 40 | { 41 | if (obj == null) 42 | { 43 | return false; 44 | } 45 | 46 | if (GetType() != obj.GetType()) 47 | { 48 | return false; 49 | } 50 | 51 | var tag = (Tag) obj; 52 | 53 | return Equals(Name, tag.Name); 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /src/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTitle("Geta.Tags")] 5 | [assembly: AssemblyDescription("Easily add tags to your EPiServer content and use the powerful query engine to get back what you want.")] 6 | [assembly: AssemblyConfiguration("")] 7 | [assembly: AssemblyCompany("Geta Digital")] 8 | [assembly: AssemblyProduct("Geta.Tags")] 9 | [assembly: AssemblyCopyright("Copyright © Geta Digital 2019")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] 12 | [assembly: ComVisible(false)] 13 | [assembly: Guid("430a05a1-003f-465d-9c50-b660e97dfdf6")] 14 | [assembly: AssemblyVersion("1.0.0")] 15 | [assembly: AssemblyFileVersion("1.0.0")] 16 | -------------------------------------------------------------------------------- /src/TagsTransferModule.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Geta Digital. All rights reserved. 2 | // Licensed under Apache-2.0. See the LICENSE file in the project root for more information 3 | 4 | using System.Linq; 5 | using EPiServer.Core.Transfer; 6 | using EPiServer.Data; 7 | using EPiServer.Data.Dynamic; 8 | using EPiServer.Enterprise; 9 | using EPiServer.Enterprise.Transfer; 10 | using EPiServer.Framework; 11 | using EPiServer.Framework.Initialization; 12 | using EPiServer.ServiceLocation; 13 | using Geta.Tags.Models; 14 | 15 | namespace Geta.Tags 16 | { 17 | /// 18 | /// Module to transfer Tags content to mirrored servers when in a full staging/delivery configuration 19 | /// Source: EPiRobots - http://epirobots.codeplex.com/ 20 | /// 21 | [InitializableModule, 22 | ModuleDependency(typeof(DataInitialization)), 23 | ModuleDependency(typeof(DynamicDataTransferHandler))] 24 | public class TagsTransferModule : IInitializableModule 25 | { 26 | private Injected DataExportEvents { get; set; } 27 | 28 | public void Initialize(InitializationEngine context) 29 | { 30 | DataExportEvents.Service.ContentExporting += DataExportEvents_ContentExporting; 31 | } 32 | 33 | private void DataExportEvents_ContentExporting(ITransferContext transferContext, ContentExportingEventArgs e) 34 | { 35 | if (!(transferContext is ITransferHandlerContext exporter) 36 | || exporter.TransferType != TypeOfTransfer.MirroringExporting) 37 | { 38 | return; 39 | } 40 | 41 | var ddsHandler = exporter 42 | .TransferHandlers 43 | .Single(p => p.GetType() == typeof(DynamicDataTransferHandler)) as DynamicDataTransferHandler; 44 | 45 | var store = typeof(Tag).GetStore(); 46 | var externalId = store.GetIdentity().ExternalId; 47 | var storeName = store.Name; 48 | 49 | ddsHandler?.AddToExport(externalId, storeName); 50 | } 51 | 52 | public void Uninitialize(InitializationEngine context) 53 | { 54 | DataExportEvents.Service.ContentExporting -= DataExportEvents_ContentExporting; 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /src/Web.config.transform: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/module/ClientResources/TagsSelection.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "dojo/_base/declare", 3 | "dijit/form/TextBox" 4 | ], 5 | function ( 6 | declare, 7 | TextBox 8 | ) { 9 | return declare([TextBox], { 10 | 11 | _tagWidget: null, 12 | 13 | postCreate: function () { 14 | this.inherited(arguments); 15 | this._createTags(); 16 | }, 17 | 18 | destroy: function() { 19 | this._destroyTags(); 20 | this.inherited(arguments); 21 | }, 22 | 23 | _createTags: function () { 24 | this._destroyTags(); 25 | 26 | this._tagWidget = $(this.textbox).tagit({ 27 | autocomplete: { delay: 0, minLength: 2, source: '/getatags?groupKey=' + this.groupKey }, 28 | allowSpaces: this.allowSpaces, 29 | allowDuplicates: this.allowDuplicates, 30 | caseSensitive: this.caseSensitive, 31 | readOnly: this.readOnly, 32 | tagLimit: this.tagLimit !== -1 ? this.tagLimit : null, 33 | beforeTagAdded: function () { 34 | this.onFocus(); 35 | }.bind(this), 36 | afterTagAdded: function () { 37 | if (this._tagWidget) { 38 | var value = this._tagWidget.val(); 39 | this._set("value", value); 40 | this.onChange(value); 41 | } 42 | }.bind(this) 43 | }); 44 | 45 | $(this.textbox).siblings("ul").first().sortable({ 46 | stop: function (event, ui) { 47 | var list = $(event.target); 48 | var value = this._getTagValues(list); 49 | $(this._tagWidget).val(value); 50 | this._set("value", value); 51 | this.onChange(value); 52 | }.bind(this) 53 | }); 54 | }, 55 | 56 | _destroyTags: function() { 57 | this._tagWidget && this._tagWidget.tagit("destroy"); 58 | this._tagWidget = null; 59 | }, 60 | 61 | _setValueAttr: function (value, priorityChange) { 62 | this.inherited(arguments); 63 | this._started && !priorityChange && this._createTags(); 64 | }, 65 | 66 | _getTagValues: function (list) { 67 | return $(".tagit-label", list) 68 | .clone() 69 | .text(function (index, text) { 70 | return (index === 0) ? text : "," + text; 71 | }) 72 | .text(); 73 | } 74 | }); 75 | }); -------------------------------------------------------------------------------- /src/module/ClientResources/styles/jquery.tagit.css: -------------------------------------------------------------------------------- 1 | ul.tagit { 2 | padding: 1px 5px; 3 | overflow: auto; 4 | margin-left: inherit; /* usually we don't want the regular ul margins. */ 5 | margin-right: inherit; 6 | } 7 | ul.tagit li { 8 | display: block; 9 | float: left; 10 | margin: 2px 5px 2px 0; 11 | } 12 | ul.tagit li.tagit-choice { 13 | position: relative; 14 | line-height: inherit; 15 | } 16 | input.tagit-hidden-field { 17 | display: none; 18 | } 19 | ul.tagit li.tagit-choice-read-only { 20 | padding: .2em .5em .2em .5em; 21 | } 22 | 23 | ul.tagit li.tagit-choice-editable { 24 | padding: .2em 18px .2em .5em; 25 | } 26 | 27 | ul.tagit li.tagit-new { 28 | padding: .25em 4px .25em 0; 29 | } 30 | 31 | ul.tagit li.tagit-choice a.tagit-label { 32 | cursor: pointer; 33 | text-decoration: none; 34 | } 35 | ul.tagit li.tagit-choice .tagit-close { 36 | cursor: pointer; 37 | position: absolute; 38 | right: .1em; 39 | top: 50%; 40 | margin-top: -8px; 41 | line-height: 17px; 42 | } 43 | 44 | /* used for some custom themes that don't need image icons */ 45 | ul.tagit li.tagit-choice .tagit-close .text-icon { 46 | display: none; 47 | } 48 | 49 | ul.tagit li.tagit-choice input { 50 | display: block; 51 | float: left; 52 | margin: 2px 5px 2px 0; 53 | } 54 | ul.tagit input[type="text"] { 55 | -moz-box-sizing: border-box; 56 | -webkit-box-sizing: border-box; 57 | box-sizing: border-box; 58 | 59 | -moz-box-shadow: none; 60 | -webkit-box-shadow: none; 61 | box-shadow: none; 62 | 63 | border: none; 64 | margin: 0; 65 | padding: 0; 66 | width: inherit; 67 | background-color: inherit; 68 | outline: none; 69 | } 70 | -------------------------------------------------------------------------------- /src/module/ClientResources/styles/tagit.overrides.css: -------------------------------------------------------------------------------- 1 | .tagit-autocomplete { 2 | z-index: 1000; 3 | } -------------------------------------------------------------------------------- /src/module/Views/Admin/Edit.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web.Mvc.Html 2 | @using EPiServer.Shell 3 | @using Geta.Tags.Controllers 4 | 5 | @inherits System.Web.Mvc.WebViewPage 6 | @{ 7 | ViewBag.Title = "Edit tag"; 8 | Layout = Paths.ToClientResource(typeof(GetaTagsAdminController), "Views/Shared/_Layout.cshtml"); 9 | } 10 | 11 |

    @ViewBag.Title

    12 | 13 |
    14 | @using (Html.BeginForm()) 15 | { 16 | @Html.AntiForgeryToken() 17 | @Html.ValidationSummary(true) 18 | @Html.HiddenFor(model => model.Id) 19 |

    20 | @Html.LabelFor(model => model.Name)
    @Html.TextBoxFor(model => model.Name) 21 |

    22 |

    23 | @Html.LabelFor(model => model.GroupKey)
    @Html.TextBoxFor(model => model.GroupKey) 24 |

    25 |

    26 | @Html.CheckBoxFor(model => model.checkedEditContentTags) Check this box to edit existing tags in the content 27 |

    28 |
    29 | 30 | 31 | 32 | 33 | 34 | 35 |
    36 | } -------------------------------------------------------------------------------- /src/module/Views/web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 |
    7 |
    8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/module/module.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | --------------------------------------------------------------------------------