diff --git a/OrchardCoreContrib.Modules.sln b/OrchardCoreContrib.Modules.sln
index 38866dc5..318ca5f6 100644
--- a/OrchardCoreContrib.Modules.sln
+++ b/OrchardCoreContrib.Modules.sln
@@ -56,7 +56,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrchardCoreContrib.Themes.A
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrchardCoreContrib.Liquid", "src\OrchardCoreContrib.Liquid\OrchardCoreContrib.Liquid.csproj", "{8C49A05B-5D69-4222-9245-310E412E237E}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCoreContrib.Sms.Azure", "src\OrchardCoreContrib.Sms.Azure\OrchardCoreContrib.Sms.Azure.csproj", "{47BE63E8-AECC-43E5-AC48-2E2835452402}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrchardCoreContrib.Sms.Azure", "src\OrchardCoreContrib.Sms.Azure\OrchardCoreContrib.Sms.Azure.csproj", "{47BE63E8-AECC-43E5-AC48-2E2835452402}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrchardCoreContrib.IssueTracker", "src\OrchardCoreContrib.IssueTracker\OrchardCoreContrib.IssueTracker.csproj", "{BBB66E6C-28A1-424A-9630-70DBBB09614C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -156,6 +158,10 @@ Global
{47BE63E8-AECC-43E5-AC48-2E2835452402}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47BE63E8-AECC-43E5-AC48-2E2835452402}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47BE63E8-AECC-43E5-AC48-2E2835452402}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BBB66E6C-28A1-424A-9630-70DBBB09614C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BBB66E6C-28A1-424A-9630-70DBBB09614C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BBB66E6C-28A1-424A-9630-70DBBB09614C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BBB66E6C-28A1-424A-9630-70DBBB09614C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -184,6 +190,7 @@ Global
{EF11652A-B9A2-4E5E-897E-16F26C4D6946} = {C80A325F-F4C4-4C7B-A3CF-FB77CD8C9949}
{8C49A05B-5D69-4222-9245-310E412E237E} = {C80A325F-F4C4-4C7B-A3CF-FB77CD8C9949}
{47BE63E8-AECC-43E5-AC48-2E2835452402} = {C80A325F-F4C4-4C7B-A3CF-FB77CD8C9949}
+ {BBB66E6C-28A1-424A-9630-70DBBB09614C} = {C80A325F-F4C4-4C7B-A3CF-FB77CD8C9949}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {48F73B05-7D3D-4ACF-81AE-A98B2B4EFDB2}
diff --git a/src/OrchardCoreContrib.IssueTracker/Controllers/HomeController.cs b/src/OrchardCoreContrib.IssueTracker/Controllers/HomeController.cs
new file mode 100644
index 00000000..97df07c3
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Controllers/HomeController.cs
@@ -0,0 +1,15 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OrchardCoreContrib.IssueTracker.Controllers;
+public class HomeController : Controller
+{
+ public ActionResult Index()
+ {
+ return View();
+ }
+}
diff --git a/src/OrchardCoreContrib.IssueTracker/Manifest.cs b/src/OrchardCoreContrib.IssueTracker/Manifest.cs
new file mode 100644
index 00000000..827428a6
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Manifest.cs
@@ -0,0 +1,11 @@
+using OrchardCore.Modules.Manifest;
+
+[assembly: Module(
+ Name = "Issue Tracker",
+ Author = "The Orchard Core Community",
+ Website = "https://github.com/OrchardCoreContrib",
+ Version = "0.0.1",
+ Description = "Provides a set of features and services to manage and track issues.",
+ Dependencies = new[] { "OrchardCore.Contents", "OrchardCore.Taxonomies", "OrchardCore.Media" },
+ Category = "Content Management"
+)]
diff --git a/src/OrchardCoreContrib.IssueTracker/Migrations.cs b/src/OrchardCoreContrib.IssueTracker/Migrations.cs
new file mode 100644
index 00000000..f64a131c
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Migrations.cs
@@ -0,0 +1,173 @@
+using OrchardCore.ContentFields.Settings;
+using OrchardCore.ContentManagement;
+using OrchardCore.ContentManagement.Metadata;
+using OrchardCore.ContentManagement.Metadata.Settings;
+using OrchardCore.Data.Migration;
+using OrchardCore.Media.Settings;
+using OrchardCore.Taxonomies.Settings;
+
+namespace OrchardCoreContrib.IssueTracker;
+public class Migrations : DataMigration
+{
+ IContentDefinitionManager _contentDefinitionManager;
+
+ public Migrations(IContentDefinitionManager contentDefinitionManager)
+ {
+ _contentDefinitionManager = contentDefinitionManager;
+ }
+
+ public int Create()
+ {
+ // Issue Priority
+ _contentDefinitionManager.AlterTypeDefinition("IssuePriority", type => type
+ .DisplayedAs("Issue Priority")
+ .WithPart("TitlePart", part => part
+ .WithPosition("0")
+ )
+ .WithPart("IssuePriority", part => part
+ .WithPosition("1")
+ )
+ .WithPart("AutoroutePart", part => part
+ .WithPosition("2")
+ )
+ );
+
+ // Issue Status
+ _contentDefinitionManager.AlterTypeDefinition("IssueStatus", type => type
+ .DisplayedAs("Issue Status")
+ .WithPart("TitlePart", part => part
+ .WithPosition("0")
+ )
+ .WithPart("IssueStatus", part => part
+ .WithPosition("1")
+ )
+ .WithPart("AutoroutePart", part => part
+ .WithPosition("2")
+ )
+ );
+
+ // Issue Category
+ _contentDefinitionManager.AlterTypeDefinition("IssueCategory", type => type
+ .DisplayedAs("Issue Category")
+ .WithPart("TitlePart", part => part
+ .WithPosition("0")
+ )
+ .WithPart("IssueCategory", part => part
+ .WithPosition("1")
+ )
+ .WithPart("AutoroutePart", part => part
+ .WithPosition("2")
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("IssueCategory", part => part
+ .WithField("ResponsibleUsers", field => field
+ .OfType("UserPickerField")
+ .WithDisplayName("Responsible Users")
+ .WithPosition("0")
+ .WithSettings(new UserPickerFieldSettings
+ {
+ Required = true,
+ Multiple = true,
+ DisplayAllUsers = false,
+ DisplayedRoles = new[]
+ {
+ "Administrator",
+ },
+ })
+ )
+ );
+
+ // Issue
+ _contentDefinitionManager.AlterTypeDefinition("Issue", type => type
+ .DisplayedAs("Issue")
+ .Creatable()
+ .Listable()
+ .Securable()
+ .WithPart("Issue", part => part
+ .WithPosition("2")
+ )
+ .WithPart("AutoroutePart", part => part
+ .WithPosition("3")
+ )
+ .WithPart("TitlePart", part => part
+ .WithPosition("0")
+ )
+ .WithPart("ContactInformationPart", part => part
+ .WithPosition("1")
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("Issue", part => part
+ .WithField("Description", field => field
+ .OfType("MarkdownField")
+ .WithDisplayName("Description")
+ .WithEditor("Wysiwyg")
+ .WithPosition("0")
+ )
+ .WithField("Files", field => field
+ .OfType("MediaField")
+ .WithDisplayName("Files")
+ .WithEditor("Attached")
+ .WithPosition("4")
+ )
+ .WithField("Category", field => field
+ .OfType("TaxonomyField")
+ .WithDisplayName("Category")
+ .WithPosition("1")
+ .WithSettings(new TaxonomyFieldSettings
+ {
+ Required = true,
+ TaxonomyContentItemId = "4gj5zq9wf1zaet99mqab9gvw4g",
+ Unique = true,
+ })
+ )
+ .WithField("Assignees", field => field
+ .OfType("UserPickerField")
+ .WithDisplayName("Assignees")
+ .WithPosition("2")
+ .WithSettings(new UserPickerFieldSettings
+ {
+ Multiple = true,
+ DisplayAllUsers = false,
+ DisplayedRoles = new[]
+ {
+ "Administrator",
+ },
+ })
+ )
+ .WithField("Priority", field => field
+ .OfType("TaxonomyField")
+ .WithDisplayName("Priority")
+ .WithPosition("3")
+ .WithSettings(new TaxonomyFieldSettings
+ {
+ TaxonomyContentItemId = "4mwtqz7n7dqyr1hxnr7hcte148",
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("ContactInformationPart", part => part
+ .Attachable()
+ .WithDescription("Contact Information")
+ .WithField("Name", field => field
+ .OfType("TextField")
+ .WithDisplayName("Name")
+ .WithPosition("0")
+ )
+ .WithField("Email", field => field
+ .OfType("TextField")
+ .WithDisplayName("Email")
+ .WithEditor("Email")
+ .WithPosition("2")
+ )
+ .WithField("Phone", field => field
+ .OfType("TextField")
+ .WithDisplayName("Phone")
+ .WithEditor("Tel")
+ .WithPosition("1")
+ )
+ );
+ return 1;
+ }
+}
diff --git a/src/OrchardCoreContrib.IssueTracker/OrchardCoreContrib.IssueTracker.csproj b/src/OrchardCoreContrib.IssueTracker/OrchardCoreContrib.IssueTracker.csproj
new file mode 100644
index 00000000..98e575ed
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/OrchardCoreContrib.IssueTracker.csproj
@@ -0,0 +1,30 @@
+
+
+
+ net6.0;net7.0
+ true
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OrchardCoreContrib.IssueTracker/Startup.cs b/src/OrchardCoreContrib.IssueTracker/Startup.cs
new file mode 100644
index 00000000..597b2a50
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Startup.cs
@@ -0,0 +1,29 @@
+using Fluid;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+using OrchardCore.ContentManagement;
+using OrchardCore.ContentManagement.Display.ContentDisplay;
+using OrchardCore.ContentManagement.Handlers;
+using OrchardCore.ContentTypes.Editors;
+using OrchardCore.Data.Migration;
+using OrchardCore.Modules;
+
+namespace OrchardCoreContrib.IssueTracker;
+public class Startup : StartupBase
+{
+ public override void ConfigureServices(IServiceCollection services)
+ {
+ services.AddDataMigration();
+ }
+
+ public override void Configure(IApplicationBuilder builder, IEndpointRouteBuilder routes, IServiceProvider serviceProvider)
+ {
+ routes.MapAreaControllerRoute(
+ name: "Home",
+ areaName: "OrchardCoreContrib.IssueTracker",
+ pattern: "Home/Index",
+ defaults: new { controller = "Home", action = "Index" }
+ );
+ }
+}
diff --git a/src/OrchardCoreContrib.IssueTracker/Views/Home/Index.cshtml b/src/OrchardCoreContrib.IssueTracker/Views/Home/Index.cshtml
new file mode 100644
index 00000000..abab7be9
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Views/Home/Index.cshtml
@@ -0,0 +1 @@
+Template
\ No newline at end of file
diff --git a/src/OrchardCoreContrib.IssueTracker/Views/_ViewImports.cshtml b/src/OrchardCoreContrib.IssueTracker/Views/_ViewImports.cshtml
new file mode 100644
index 00000000..4769da1c
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/Views/_ViewImports.cshtml
@@ -0,0 +1,9 @@
+@*
+ For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
+
+*@
+
+@inherits OrchardCore.DisplayManagement.Razor.RazorPage
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@addTagHelper *, OrchardCore.DisplayManagement
+@addTagHelper *, OrchardCore.ResourceManagement
diff --git a/src/OrchardCoreContrib.IssueTracker/readme.md b/src/OrchardCoreContrib.IssueTracker/readme.md
new file mode 100644
index 00000000..4975c721
--- /dev/null
+++ b/src/OrchardCoreContrib.IssueTracker/readme.md
@@ -0,0 +1,43 @@
+# Issue Tracker Module
+
+## Definitions
+**Issue** - Used for reporting problems, requesting new features, or any request for something to be done.
+
+**Project** - A set of related tasks that need to be completed.
+
+**Milestone** - A date when something should happen such the date something is due to be completed.
+
+**Member** - A user who is responsible for some part of an issue or project.
+
+## Features
+### Common to both an Issue and a Project
+- [ ] Title
+- [ ] Body (html or markdown)
+- [ ] Requestor contact information
+- [ ] Members (Assign to one or more users who are responsible for the task)
+- [ ] Attach files
+- [ ] Category
+- [ ] Different groups of people should be linked to different categories. For example, IT would be responsible for the category "Computer" and Application Development would be responsible for the "Website" category
+- [ ] Status (New, In Progress, completed, cancelled, etc)
+- [ ] Priority
+- [ ] Comments
+- [ ] Milestones
+
+### Issue
+- [ ] A user should be able to submit an Issue without having access to the admin side
+- [ ] Users can view all Issues they have submitted
+
+### Project
+- [ ] Multiple Issues can be associated with a project
+
+### Milestone
+- [ ] Title
+- [ ] Body (html or markdown)
+- [ ] Date
+
+### Member
+- [ ] User
+
+### Workflows
+- [ ] Users who submitted or are assigned to should be notified when a change is made or comment added
+- [ ] Users should be notified when new content is added with a Category they are responsible for
diff --git a/src/OrchardCoreContrib.Modules.Web/OrchardCoreContrib.Modules.Web.csproj b/src/OrchardCoreContrib.Modules.Web/OrchardCoreContrib.Modules.Web.csproj
index f3cc41cb..77bbda61 100644
--- a/src/OrchardCoreContrib.Modules.Web/OrchardCoreContrib.Modules.Web.csproj
+++ b/src/OrchardCoreContrib.Modules.Web/OrchardCoreContrib.Modules.Web.csproj
@@ -26,6 +26,7 @@
+