Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
		| @ -74,22 +74,29 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (PageState.Action == "Add") | ||||
|             if (string.IsNullOrEmpty(_name)) | ||||
|             { | ||||
|                 [Module] [Module] = new [Module](); | ||||
|                 [Module].ModuleId = ModuleState.ModuleId; | ||||
|                 [Module].Name = _name; | ||||
|                 [Module] = await [Module]Service.Add[Module]Async([Module]); | ||||
|                 await logger.LogInformation("[Module] Added {[Module]}", [Module]); | ||||
|                 if (PageState.Action == "Add") | ||||
|                 { | ||||
|                     [Module] [Module] = new [Module](); | ||||
|                     [Module].ModuleId = ModuleState.ModuleId; | ||||
|                     [Module].Name = _name; | ||||
|                     [Module] = await [Module]Service.Add[Module]Async([Module]); | ||||
|                     await logger.LogInformation("[Module] Added {[Module]}", [Module]); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId); | ||||
|                     [Module].Name = _name; | ||||
|                     await [Module]Service.Update[Module]Async([Module]); | ||||
|                     await logger.LogInformation("[Module] Updated {[Module]}", [Module]); | ||||
|                 } | ||||
|                 NavigationManager.NavigateTo(NavigateUrl()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId); | ||||
|                 [Module].Name = _name; | ||||
|                 await [Module]Service.Update[Module]Async([Module]); | ||||
|                 await logger.LogInformation("[Module] Updated {[Module]}", [Module]); | ||||
|                 AddModuleMessage("The Name Is Required", MessageType.Warning); | ||||
|             } | ||||
|             NavigationManager.NavigateTo(NavigateUrl()); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
| @ -1,100 +0,0 @@ | ||||
| @using Oqtane.Modules.Controls | ||||
| @using [Owner].[Module].Services | ||||
| @using [Owner].[Module].Models | ||||
|  | ||||
| @namespace [Owner].[Module] | ||||
| @inherits ModuleBase | ||||
| @inject I[Module]Service [Module]Service | ||||
| @inject NavigationManager NavigationManager | ||||
|  | ||||
| <table class="table table-borderless"> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <Label For="name" HelpText="Enter a name">Name: </Label> | ||||
|         </td> | ||||
|         <td> | ||||
|             <input id="name" class="form-control" @bind="@_name" /> | ||||
|         </td> | ||||
|     </tr> | ||||
| </table> | ||||
| <button type="button" class="btn btn-success" @onclick="Save">Save</button> | ||||
| <NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink> | ||||
| <br /> | ||||
| <br /> | ||||
| @if (PageState.Action == "Edit") | ||||
| { | ||||
|     <AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo> | ||||
| } | ||||
|  | ||||
| @code { | ||||
|     public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; | ||||
|  | ||||
|     public override string Actions => "Add,Edit"; | ||||
|  | ||||
|     public override string Title => "Manage [Module]"; | ||||
|  | ||||
|     public override List<Resource> Resources => new List<Resource>() | ||||
|     { | ||||
|         new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } | ||||
|     }; | ||||
|  | ||||
|     int _id; | ||||
|     string _name; | ||||
|     string _createdby; | ||||
|     DateTime _createdon; | ||||
|     string _modifiedby; | ||||
|     DateTime _modifiedon; | ||||
|  | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (PageState.Action == "Edit") | ||||
|             { | ||||
|                 _id = Int32.Parse(PageState.QueryString["id"]); | ||||
|                 [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId); | ||||
|                 if ([Module] != null) | ||||
|                 { | ||||
|                     _name = [Module].Name; | ||||
|                     _createdby = [Module].CreatedBy; | ||||
|                     _createdon = [Module].CreatedOn; | ||||
|                     _modifiedby = [Module].ModifiedBy; | ||||
|                     _modifiedon = [Module].ModifiedOn; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Loading [Module] {[Module]Id} {Error}", _id, ex.Message); | ||||
|             AddModuleMessage("Error Loading [Module]", MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task Save() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (PageState.Action == "Add") | ||||
|             { | ||||
|                 [Module] [Module] = new [Module](); | ||||
|                 [Module].ModuleId = ModuleState.ModuleId; | ||||
|                 [Module].Name = _name; | ||||
|                 [Module] = await [Module]Service.Add[Module]Async([Module]); | ||||
|                 await logger.LogInformation("[Module] Added {[Module]}", [Module]); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId); | ||||
|                 [Module].Name = _name; | ||||
|                 await [Module]Service.Update[Module]Async([Module]); | ||||
|                 await logger.LogInformation("[Module] Updated {[Module]}", [Module]); | ||||
|             } | ||||
|             NavigationManager.NavigateTo(NavigateUrl()); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Saving [Module] {Error}", ex.Message); | ||||
|             AddModuleMessage("Error Saving [Module]", MessageType.Error); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,100 +0,0 @@ | ||||
| @using [Owner].[Module].Services | ||||
| @using [Owner].[Module].Models | ||||
|  | ||||
| @namespace [Owner].[Module] | ||||
| @inherits ModuleBase | ||||
| @inject I[Module]Service [Module]Service | ||||
| @inject NavigationManager NavigationManager | ||||
|  | ||||
| @if (_[Module]s == null) | ||||
| { | ||||
|     <p><em>Loading...</em></p> | ||||
| } | ||||
| else | ||||
| { | ||||
|     <ActionLink Action="Add" Security="SecurityAccessLevel.Edit" Text="Add [Module]" /> | ||||
|     <br /> | ||||
|     <br /> | ||||
|     @if (@_[Module]s.Count != 0) | ||||
|     { | ||||
|         <Pager Items="@_[Module]s"> | ||||
|             <Header> | ||||
|                 <th style="width: 1px;"> </th> | ||||
|                 <th style="width: 1px;"> </th> | ||||
|                 <th>Name</th> | ||||
|             </Header> | ||||
|             <Row> | ||||
|                 <td><ActionLink Action="Edit" Parameters="@($"id=" + context.[Module]Id.ToString())" /></td> | ||||
|                 <td><ActionDialog Header="Delete [Module]" Message="@("Are You Sure You Wish To Delete The " + context.Name + " [Module]?")" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" /></td> | ||||
|                 <td>@context.Name</td> | ||||
|             </Row> | ||||
|         </Pager> | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         <p>No [Module]s To Display</p> | ||||
|     } | ||||
| } | ||||
|  | ||||
| <!-- The content below is for informational purposes only and can be safely removed --> | ||||
|  | ||||
| <hr /> | ||||
| [Module] Module Created Successfully. Use Edit Mode To Add A [Module]. You Can Access The Files At The Following Locations:<br /><br /> | ||||
| [RootPath]Oqtane.Client\Modules\[Module]\<br /> | ||||
| - Edit.razor - component for adding or editing content<br /> | ||||
| - Index.razor - main component for your module **the content you are reading is in this file**<br /> | ||||
| - ModuleInfo.cs - implements IModule interface to provide configuration settings for your module<br /> | ||||
| - Settings.razor - component for managing module settings<br /> | ||||
| - Services\I[Module]Service.cs - interface for defining service API methods<br /> | ||||
| - Services\[Module]Service.cs - implements service API interface methods<br /><br /> | ||||
| [RootPath]Oqtane.Server\Modules\[Module]\<br /> | ||||
| - Controllers\[Module]Controller.cs - API methods implemented using a REST pattern<br /> | ||||
| - Manager\[Module]Manager.cs - implements optional module interfaces for features such as import/export of content<br /> | ||||
| - Repository\I[Module]Repository.cs - interface for defining repository methods<br /> | ||||
| - Repository\[Module]Respository.cs - implements repository interface methods for data access using EF Core<br /> | ||||
| - Repository\[Module]Context.cs - provides a DB Context for data access<br /> | ||||
| - Scripts\[Owner].[Module]s.1.0.0.sql - database schema definition script<br /> | ||||
| - Scripts\[Owner].[Module]s.Uninstall.sql - database uninstall script<br /><br /> | ||||
| [RootPath]Oqtane.Shared\Modules\[Module]\<br /> | ||||
| - Models\[Module].cs - model definition<br /><br /> | ||||
|  | ||||
| <!-- The content above is for informational purposes only and can be safely removed --> | ||||
|  | ||||
| @code { | ||||
|     public override List<Resource> Resources => new List<Resource>() | ||||
|     { | ||||
|         new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }, | ||||
|         new Resource { ResourceType = ResourceType.Script, Url = ModulePath() + "Module.js" } | ||||
|     }; | ||||
|  | ||||
|     List<[Module]> _[Module]s; | ||||
|  | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             _[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Loading [Module] {Error}", ex.Message); | ||||
|             AddModuleMessage("Error Loading [Module]", MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task Delete([Module] [Module]) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             await [Module]Service.Delete[Module]Async([Module].[Module]Id, ModuleState.ModuleId); | ||||
|             await logger.LogInformation("[Module] Deleted {[Module]}", [Module]); | ||||
|             _[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId); | ||||
|             StateHasChanged(); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Deleting [Module] {[Module]} {Error}", [Module], ex.Message); | ||||
|             AddModuleMessage("Error Deleting [Module]", MessageType.Error); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,15 +0,0 @@ | ||||
| using Microsoft.JSInterop; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace [Owner].[Module] | ||||
| { | ||||
|     public class Interop | ||||
|     { | ||||
|         private readonly IJSRuntime _jsRuntime; | ||||
|  | ||||
|         public Interop(IJSRuntime jsRuntime) | ||||
|         { | ||||
|             _jsRuntime = jsRuntime; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Modules; | ||||
|  | ||||
| namespace [Owner].[Module] | ||||
| { | ||||
|     public class ModuleInfo : IModule | ||||
|     { | ||||
|         public ModuleDefinition ModuleDefinition => new ModuleDefinition | ||||
|         { | ||||
|             Name = "[Module]", | ||||
|             Description = "[Module]", | ||||
|             Version = "1.0.0", | ||||
|             ServerManagerType = "[ServerManagerType]", | ||||
|             ReleaseVersions = "1.0.0" | ||||
|         }; | ||||
|     } | ||||
| } | ||||
| @ -1,19 +0,0 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Threading.Tasks; | ||||
| using [Owner].[Module].Models; | ||||
|  | ||||
| namespace [Owner].[Module].Services | ||||
| { | ||||
|     public interface I[Module]Service  | ||||
|     { | ||||
|         Task<List<Models.[Module]>> Get[Module]sAsync(int ModuleId); | ||||
|  | ||||
|         Task<Models.[Module]> Get[Module]Async(int [Module]Id, int ModuleId); | ||||
|  | ||||
|         Task<Models.[Module]> Add[Module]Async(Models.[Module] [Module]); | ||||
|  | ||||
|         Task<Models.[Module]> Update[Module]Async(Models.[Module] [Module]); | ||||
|  | ||||
|         Task Delete[Module]Async(int [Module]Id, int ModuleId); | ||||
|     } | ||||
| } | ||||
| @ -1,49 +0,0 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Oqtane.Modules; | ||||
| using Oqtane.Services; | ||||
| using Oqtane.Shared; | ||||
| using [Owner].[Module].Models; | ||||
|  | ||||
| namespace [Owner].[Module].Services | ||||
| { | ||||
|     public class [Module]Service : ServiceBase, I[Module]Service, IService | ||||
|     { | ||||
|         private readonly SiteState _siteState; | ||||
|  | ||||
|         public [Module]Service(HttpClient http, SiteState siteState) : base(http) | ||||
|         { | ||||
|             _siteState = siteState; | ||||
|         } | ||||
|  | ||||
|          private string Apiurl => CreateApiUrl(_siteState.Alias, "[Module]"); | ||||
|  | ||||
|         public async Task<List<Models.[Module]>> Get[Module]sAsync(int ModuleId) | ||||
|         { | ||||
|             List<Models.[Module]> [Module]s = await GetJsonAsync<List<Models.[Module]>>(CreateAuthorizationPolicyUrl($"{Apiurl}?moduleid={ModuleId}", ModuleId)); | ||||
|             return [Module]s.OrderBy(item => item.Name).ToList(); | ||||
|         } | ||||
|  | ||||
|         public async Task<Models.[Module]> Get[Module]Async(int [Module]Id, int ModuleId) | ||||
|         { | ||||
|             return await GetJsonAsync<Models.[Module]>(CreateAuthorizationPolicyUrl($"{Apiurl}/{[Module]Id}", ModuleId)); | ||||
|         } | ||||
|  | ||||
|         public async Task<Models.[Module]> Add[Module]Async(Models.[Module] [Module]) | ||||
|         { | ||||
|             return await PostJsonAsync<Models.[Module]>(CreateAuthorizationPolicyUrl($"{Apiurl}", [Module].ModuleId), [Module]); | ||||
|         } | ||||
|  | ||||
|         public async Task<Models.[Module]> Update[Module]Async(Models.[Module] [Module]) | ||||
|         { | ||||
|             return await PutJsonAsync<Models.[Module]>(CreateAuthorizationPolicyUrl($"{Apiurl}/{[Module].[Module]Id}", [Module].ModuleId), [Module]); | ||||
|         } | ||||
|  | ||||
|         public async Task Delete[Module]Async(int [Module]Id, int ModuleId) | ||||
|         { | ||||
|             await DeleteAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{[Module]Id}", ModuleId)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,47 +0,0 @@ | ||||
| @namespace [Owner].[Module] | ||||
| @inherits ModuleBase | ||||
| @inject ISettingService SettingService | ||||
|  | ||||
| <table class="table table-borderless"> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <Label For="value" HelpText="Enter a value">Name: </Label> | ||||
|         </td> | ||||
|         <td> | ||||
|             <input id="value" type="text" class="form-control" @bind="@_value" /> | ||||
|         </td> | ||||
|     </tr> | ||||
| </table> | ||||
|  | ||||
| @code { | ||||
|     public override string Title => "[Module] Settings"; | ||||
|  | ||||
|     string _value; | ||||
|  | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Dictionary<string, string> settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); | ||||
|             _value = SettingService.GetSetting(settings, "SettingName", ""); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public async Task UpdateSettings() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Dictionary<string, string> settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); | ||||
|             SettingService.SetSetting(settings, "SettingName", _value); | ||||
|             await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,91 +0,0 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Authorization; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Oqtane.Shared; | ||||
| using Oqtane.Enums; | ||||
| using Oqtane.Infrastructure; | ||||
| using [Owner].[Module].Models; | ||||
| using [Owner].[Module].Repository; | ||||
|  | ||||
| namespace [Owner].[Module].Controllers | ||||
| { | ||||
|     [Route(ControllerRoutes.Default)] | ||||
|     public class [Module]Controller : Controller | ||||
|     { | ||||
|         private readonly I[Module]Repository _[Module]Repository; | ||||
|         private readonly ILogManager _logger; | ||||
|         protected int _entityId = -1; | ||||
|  | ||||
|         public [Module]Controller(I[Module]Repository [Module]Repository, ILogManager logger, IHttpContextAccessor accessor) | ||||
|         { | ||||
|             _[Module]Repository = [Module]Repository; | ||||
|             _logger = logger; | ||||
|  | ||||
|             if (accessor.HttpContext.Request.Query.ContainsKey("entityid")) | ||||
|             { | ||||
|                 _entityId = int.Parse(accessor.HttpContext.Request.Query["entityid"]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // GET: api/<controller>?moduleid=x | ||||
|         [HttpGet] | ||||
|         [Authorize(Policy = PolicyNames.ViewModule)] | ||||
|         public IEnumerable<Models.[Module]> Get(string moduleid) | ||||
|         { | ||||
|             return _[Module]Repository.Get[Module]s(int.Parse(moduleid)); | ||||
|         } | ||||
|  | ||||
|         // GET api/<controller>/5 | ||||
|         [HttpGet("{id}")] | ||||
|         [Authorize(Policy = PolicyNames.ViewModule)] | ||||
|         public Models.[Module] Get(int id) | ||||
|         { | ||||
|             Models.[Module] [Module] = _[Module]Repository.Get[Module](id); | ||||
|             if ([Module] != null && [Module].ModuleId != _entityId) | ||||
|             { | ||||
|                 [Module] = null; | ||||
|             } | ||||
|             return [Module]; | ||||
|         } | ||||
|  | ||||
|         // POST api/<controller> | ||||
|         [HttpPost] | ||||
|         [Authorize(Policy = PolicyNames.EditModule)] | ||||
|         public Models.[Module] Post([FromBody] Models.[Module] [Module]) | ||||
|         { | ||||
|             if (ModelState.IsValid && [Module].ModuleId == _entityId) | ||||
|             { | ||||
|                 [Module] = _[Module]Repository.Add[Module]([Module]); | ||||
|                 _logger.Log(LogLevel.Information, this, LogFunction.Create, "[Module] Added {[Module]}", [Module]); | ||||
|             } | ||||
|             return [Module]; | ||||
|         } | ||||
|  | ||||
|         // PUT api/<controller>/5 | ||||
|         [HttpPut("{id}")] | ||||
|         [Authorize(Policy = PolicyNames.EditModule)] | ||||
|         public Models.[Module] Put(int id, [FromBody] Models.[Module] [Module]) | ||||
|         { | ||||
|             if (ModelState.IsValid && [Module].ModuleId == _entityId) | ||||
|             { | ||||
|                 [Module] = _[Module]Repository.Update[Module]([Module]); | ||||
|                 _logger.Log(LogLevel.Information, this, LogFunction.Update, "[Module] Updated {[Module]}", [Module]); | ||||
|             } | ||||
|             return [Module]; | ||||
|         } | ||||
|  | ||||
|         // DELETE api/<controller>/5 | ||||
|         [HttpDelete("{id}")] | ||||
|         [Authorize(Policy = PolicyNames.EditModule)] | ||||
|         public void Delete(int id) | ||||
|         { | ||||
|             Models.[Module] [Module] = _[Module]Repository.Get[Module](id); | ||||
|             if ([Module] != null && [Module].ModuleId == _entityId) | ||||
|             { | ||||
|                 _[Module]Repository.Delete[Module](id); | ||||
|                 _logger.Log(LogLevel.Information, this, LogFunction.Delete, "[Module] Deleted {[Module]Id}", id); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,61 +0,0 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| using Oqtane.Modules; | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Infrastructure; | ||||
| using Oqtane.Repository; | ||||
| using [Owner].[Module].Models; | ||||
| using [Owner].[Module].Repository; | ||||
|  | ||||
| namespace [Owner].[Module].Manager | ||||
| { | ||||
|     public class [Module]Manager : IInstallable, IPortable | ||||
|     { | ||||
|         private I[Module]Repository _[Module]Repository; | ||||
|         private ISqlRepository _sql; | ||||
|  | ||||
|         public [Module]Manager(I[Module]Repository [Module]Repository, ISqlRepository sql) | ||||
|         { | ||||
|             _[Module]Repository = [Module]Repository; | ||||
|             _sql = sql; | ||||
|         } | ||||
|  | ||||
|         public bool Install(Tenant tenant, string version) | ||||
|         { | ||||
|             return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]." + version + ".sql"); | ||||
|         } | ||||
|  | ||||
|         public bool Uninstall(Tenant tenant) | ||||
|         { | ||||
|             return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module].Uninstall.sql"); | ||||
|         } | ||||
|  | ||||
|         public string ExportModule(Module module) | ||||
|         { | ||||
|             string content = ""; | ||||
|             List<Models.[Module]> [Module]s = _[Module]Repository.Get[Module]s(module.ModuleId).ToList(); | ||||
|             if ([Module]s != null) | ||||
|             { | ||||
|                 content = JsonSerializer.Serialize([Module]s); | ||||
|             } | ||||
|             return content; | ||||
|         } | ||||
|  | ||||
|         public void ImportModule(Module module, string content, string version) | ||||
|         { | ||||
|             List<Models.[Module]> [Module]s = null; | ||||
|             if (!string.IsNullOrEmpty(content)) | ||||
|             { | ||||
|                 [Module]s = JsonSerializer.Deserialize<List<Models.[Module]>>(content); | ||||
|             } | ||||
|             if ([Module]s != null) | ||||
|             { | ||||
|                 foreach(var [Module] in [Module]s) | ||||
|                 { | ||||
|                     _[Module]Repository.Add[Module](new Models.[Module] { ModuleId = module.ModuleId, Name = [Module].Name }); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,14 +0,0 @@ | ||||
| using System.Collections.Generic; | ||||
| using [Owner].[Module].Models; | ||||
|  | ||||
| namespace [Owner].[Module].Repository | ||||
| { | ||||
|     public interface I[Module]Repository | ||||
|     { | ||||
|         IEnumerable<Models.[Module]> Get[Module]s(int ModuleId); | ||||
|         Models.[Module] Get[Module](int [Module]Id); | ||||
|         Models.[Module] Add[Module](Models.[Module] [Module]); | ||||
|         Models.[Module] Update[Module](Models.[Module] [Module]); | ||||
|         void Delete[Module](int [Module]Id); | ||||
|     } | ||||
| } | ||||
| @ -1,18 +0,0 @@ | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Oqtane.Modules; | ||||
| using Oqtane.Repository; | ||||
| using [Owner].[Module].Models; | ||||
|  | ||||
| namespace [Owner].[Module].Repository | ||||
| { | ||||
|     public class [Module]Context : DBContextBase, IService | ||||
|     { | ||||
|         public virtual DbSet<Models.[Module]> [Module] { get; set; } | ||||
|  | ||||
|         public [Module]Context(ITenantResolver tenantResolver, IHttpContextAccessor accessor) : base(tenantResolver, accessor) | ||||
|         { | ||||
|             // ContextBase handles multi-tenant database connections | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,49 +0,0 @@ | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using System.Linq; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Modules; | ||||
| using [Owner].[Module].Models; | ||||
|  | ||||
| namespace [Owner].[Module].Repository | ||||
| { | ||||
|     public class [Module]Repository : I[Module]Repository, IService | ||||
|     { | ||||
|         private readonly [Module]Context _db; | ||||
|  | ||||
|         public [Module]Repository([Module]Context context) | ||||
|         { | ||||
|             _db = context; | ||||
|         } | ||||
|  | ||||
|         public IEnumerable<Models.[Module]> Get[Module]s(int ModuleId) | ||||
|         { | ||||
|             return _db.[Module].Where(item => item.ModuleId == ModuleId); | ||||
|         } | ||||
|  | ||||
|         public Models.[Module] Get[Module](int [Module]Id) | ||||
|         { | ||||
|             return _db.[Module].Find([Module]Id); | ||||
|         } | ||||
|  | ||||
|         public Models.[Module] Add[Module](Models.[Module] [Module]) | ||||
|         { | ||||
|             _db.[Module].Add([Module]); | ||||
|             _db.SaveChanges(); | ||||
|             return [Module]; | ||||
|         } | ||||
|  | ||||
|         public Models.[Module] Update[Module](Models.[Module] [Module]) | ||||
|         { | ||||
|             _db.Entry([Module]).State = EntityState.Modified; | ||||
|             _db.SaveChanges(); | ||||
|             return [Module]; | ||||
|         } | ||||
|  | ||||
|         public void Delete[Module](int [Module]Id) | ||||
|         { | ||||
|             Models.[Module] [Module] = _db.[Module].Find([Module]Id); | ||||
|             _db.[Module].Remove([Module]); | ||||
|             _db.SaveChanges(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,26 +0,0 @@ | ||||
| /*   | ||||
| Create [Owner][Module] table | ||||
| */ | ||||
|  | ||||
| CREATE TABLE [dbo].[[Owner][Module]]( | ||||
| 	[[Module]Id] [int] IDENTITY(1,1) NOT NULL, | ||||
| 	[ModuleId] [int] NOT NULL, | ||||
| 	[Name] [nvarchar](256) NOT NULL, | ||||
| 	[CreatedBy] [nvarchar](256) NOT NULL, | ||||
| 	[CreatedOn] [datetime] NOT NULL, | ||||
| 	[ModifiedBy] [nvarchar](256) NOT NULL, | ||||
| 	[ModifiedOn] [datetime] NOT NULL, | ||||
|   CONSTRAINT [PK_[Owner][Module]] PRIMARY KEY CLUSTERED  | ||||
|   ( | ||||
| 	[[Module]Id] ASC | ||||
|   ) | ||||
| ) | ||||
| GO | ||||
|  | ||||
| /*   | ||||
| Create foreign key relationships | ||||
| */ | ||||
| ALTER TABLE [dbo].[[Owner][Module]]  WITH CHECK ADD  CONSTRAINT [FK_[Owner][Module]_Module] FOREIGN KEY([ModuleId]) | ||||
| REFERENCES [dbo].Module ([ModuleId]) | ||||
| ON DELETE CASCADE | ||||
| GO | ||||
| @ -1,6 +0,0 @@ | ||||
| /*   | ||||
| Remove [Owner][Module] table | ||||
| */ | ||||
|  | ||||
| DROP TABLE [dbo].[[Owner][Module]] | ||||
| GO | ||||
| @ -1 +0,0 @@ | ||||
| /* Module Custom Styles */ | ||||
| @ -1,5 +0,0 @@ | ||||
| /* Module Script */ | ||||
| var [Owner] = [Owner] || {}; | ||||
|  | ||||
| [Owner].[Module] = { | ||||
| }; | ||||
| @ -1,19 +0,0 @@ | ||||
| using System; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| using Oqtane.Models; | ||||
|  | ||||
| namespace [Owner].[Module].Models | ||||
| { | ||||
|     [Table("[Owner][Module]")] | ||||
|     public class [Module] : IAuditable | ||||
|     { | ||||
|         public int [Module]Id { get; set; } | ||||
|         public int ModuleId { get; set; } | ||||
|         public string Name { get; set; } | ||||
|  | ||||
|         public string CreatedBy { get; set; } | ||||
|         public DateTime CreatedOn { get; set; } | ||||
|         public string ModifiedBy { get; set; } | ||||
|         public DateTime ModifiedOn { get; set; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										4
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/AssemblyInfo.cs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/AssemblyInfo.cs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| using System.Resources; | ||||
| using Microsoft.Extensions.Localization; | ||||
|  | ||||
| [assembly: RootNamespace("[Owner].[Theme].Client")] | ||||
							
								
								
									
										20
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/Containers/Container1.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/Containers/Container1.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| @namespace [Owner].[Theme] | ||||
| @inherits ContainerBase | ||||
|  | ||||
| <div class="container"> | ||||
|     <div class="row px-4"> | ||||
|         <div class="d-flex flex-nowrap"> | ||||
|             <ModuleActions /><h2><ModuleTitle /></h2> | ||||
|         </div> | ||||
|         <hr class="app-rule" /> | ||||
|     </div> | ||||
|     <div class="row px-4"> | ||||
|         <div class="container"> | ||||
|             <ModuleInstance /> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|  | ||||
| @code { | ||||
|     public override string Name => "Container1"; | ||||
| } | ||||
							
								
								
									
										15
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Themes; | ||||
|  | ||||
| namespace [Owner].[Theme] | ||||
| { | ||||
|     public class ThemeInfo : ITheme | ||||
|     { | ||||
|         public Theme Theme => new Theme | ||||
|         { | ||||
|             Name = "[Theme]", | ||||
|             Version = "1.0.0" | ||||
|         }; | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										107
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/Themes/Theme1.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/Themes/Theme1.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| @namespace [Owner].[Theme] | ||||
| @inherits ThemeBase | ||||
|  | ||||
| <main role="main"> | ||||
|     <nav class="navbar navbar-expand-md navbar-dark bg-primary fixed-top"> | ||||
|         <Logo /><Menu Orientation="Horizontal" /> | ||||
|         <div class="controls ml-md-auto"> | ||||
|             <div class="controls-group"><UserProfile /> <Login /> <ControlPanel /></div> | ||||
|         </div> | ||||
|     </nav> | ||||
|     <div class="container"> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-12"> | ||||
|                 <Pane Name="Content" /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|     <Pane Name="Top Full Width" /> | ||||
|     <div class="container"> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-12"> | ||||
|                 <Pane Name="Top 100%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-6"> | ||||
|                 <Pane Name="Left 50%" /> | ||||
|             </div> | ||||
|             <div class="col-md-6"> | ||||
|                 <Pane Name="Right 50%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-4"> | ||||
|                 <Pane Name="Left 33%" /> | ||||
|             </div> | ||||
|             <div class="col-md-4"> | ||||
|                 <Pane Name="Center 33%" /> | ||||
|             </div> | ||||
|             <div class="col-md-4"> | ||||
|                 <Pane Name="Right 33%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Left Outer 25%" /> | ||||
|             </div> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Left Inner 25%" /> | ||||
|             </div> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Right Inner 25%" /> | ||||
|             </div> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Right Outer 25%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Left 25%" /> | ||||
|             </div> | ||||
|             <div class="col-md-6"> | ||||
|                 <Pane Name="Center 50%" /> | ||||
|             </div> | ||||
|             <div class="col-md-3"> | ||||
|                 <Pane Name="Right 25%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-8"> | ||||
|                 <Pane Name="Left Sidebar 66%" /> | ||||
|             </div> | ||||
|             <div class="col-md-4"> | ||||
|                 <Pane Name="Right Sidebar 33%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-4"> | ||||
|                 <Pane Name="Left Sidebar 33%" /> | ||||
|             </div> | ||||
|             <div class="col-md-8"> | ||||
|                 <Pane Name="Right Sidebar 66%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-12"> | ||||
|                 <Pane Name="Bottom 100%" /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|     <Pane Name="Bottom Full Width" /> | ||||
| </main> | ||||
|  | ||||
| @code { | ||||
|     public override string Name => "Theme1"; | ||||
|  | ||||
|     public override string Panes => "Content,Top Full Width,Top 100%,Left 50%,Right 50%,Left 33%,Center 33%,Right 33%,Left Outer 25%,Left Inner 25%,Right Inner 25%,Right Outer 25%,Left 25%,Center 50%,Right 25%,Left Sidebar 66%,Right Sidebar 33%,Left Sidebar 33%,Right Sidebar 66%,Bottom 100%,Bottom Full Width"; | ||||
|  | ||||
|     public override List<Resource> Resources => new List<Resource>() | ||||
|     { | ||||
|         new Resource { ResourceType = ResourceType.Stylesheet, Url = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css", Integrity = "sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk", CrossOrigin = "anonymous" }, | ||||
|         new Resource { ResourceType = ResourceType.Stylesheet, Url = ThemePath() + "Theme.css" }, | ||||
|         new Resource { ResourceType = ResourceType.Script, Bundle = "Bootstrap", Url = "https://code.jquery.com/jquery-3.5.1.slim.min.js", Integrity = "sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj", CrossOrigin = "anonymous" }, | ||||
|         new Resource { ResourceType = ResourceType.Script, Bundle = "Bootstrap", Url = "https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js", Integrity = "sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo", CrossOrigin = "anonymous" }, | ||||
|         new Resource { ResourceType = ResourceType.Script, Bundle = "Bootstrap", Url = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js", Integrity = "sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI", CrossOrigin = "anonymous" } | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										34
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].[Theme].Client.csproj
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].[Theme].Client.csproj
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk.Razor"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net5.0</TargetFramework> | ||||
|     <RazorLangVersion>3.0</RazorLangVersion> | ||||
|     <Version>1.0.0</Version> | ||||
|     <Authors>[Owner]</Authors> | ||||
|     <Company>[Owner]</Company> | ||||
|     <Description>[Description]</Description> | ||||
|     <Product>[Owner].[Theme]</Product> | ||||
|     <Copyright>[Owner]</Copyright> | ||||
|     <AssemblyName>[Owner].[Theme].Client.Oqtane</AssemblyName> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.0" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0" PrivateAssets="all" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="5.0.0" /> | ||||
|     <PackageReference Include="Microsoft.Extensions.Localization" Version="5.0.0" /> | ||||
|     <PackageReference Include="System.Net.Http.Json" Version="5.0.0" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     [ClientReference] | ||||
|     [SharedReference] | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <!-- there may be other elements here --> | ||||
|     <BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking> | ||||
|     <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
|   </PropertyGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										21
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/_Imports.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/_Imports.razor
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| @using System | ||||
| @using System.Linq | ||||
| @using System.Collections.Generic | ||||
| @using System.Net.Http | ||||
| @using System.Net.Http.Json | ||||
|  | ||||
| @using Microsoft.AspNetCore.Components.Routing | ||||
| @using Microsoft.AspNetCore.Components.Web | ||||
| @using Microsoft.JSInterop | ||||
|  | ||||
| @using Oqtane.Models | ||||
| @using Oqtane.Modules | ||||
| @using Oqtane.Modules.Controls | ||||
| @using Oqtane.Providers | ||||
| @using Oqtane.Security | ||||
| @using Oqtane.Services | ||||
| @using Oqtane.Shared | ||||
| @using Oqtane.Themes | ||||
| @using Oqtane.Themes.Controls | ||||
| @using Oqtane.UI | ||||
| @using Oqtane.Enums | ||||
							
								
								
									
										83
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].[Theme]/Theme.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].[Theme]/Theme.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| /* Oqtane Styles */ | ||||
|  | ||||
| body { | ||||
|     padding-top: 7rem; | ||||
| } | ||||
|  | ||||
| .controls { | ||||
|     z-index: 2000; | ||||
|     padding-top: 15px; | ||||
|     padding-bottom: 15px; | ||||
|     margin-right: 10px; | ||||
| } | ||||
|  | ||||
| .app-menu .nav-item { | ||||
|     font-size: 0.9rem; | ||||
|     padding-bottom: 0.5rem; | ||||
| } | ||||
|  | ||||
| .app-menu .nav-item a { | ||||
|     border-radius: 4px; | ||||
|     height: 3rem; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     line-height: 3rem; | ||||
| } | ||||
|  | ||||
| .app-menu .nav-item a.active { | ||||
|     background-color: rgba(255,255,255,0.25); | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .app-menu .nav-item a:hover { | ||||
|     background-color: rgba(255,255,255,0.1); | ||||
|     color: white; | ||||
| } | ||||
|  | ||||
| .app-menu .nav-link .oi { | ||||
|     width: 1.5rem; | ||||
|     font-size: 1.1rem; | ||||
|     vertical-align: text-top; | ||||
|     top: -2px; | ||||
| } | ||||
|  | ||||
| .navbar-toggler { | ||||
|     background-color: rgba(255, 255, 255, 0.1); | ||||
|     margin-left: auto; | ||||
| } | ||||
|  | ||||
| div.app-moduleactions a.dropdown-toggle, div.app-moduleactions div.dropdown-menu { | ||||
|     color:#ffffff; | ||||
| } | ||||
|  | ||||
| @media (max-width: 767px) { | ||||
|  | ||||
|     .app-menu { | ||||
|         width: 100% | ||||
|     } | ||||
|  | ||||
|     .navbar { | ||||
|         position: fixed; | ||||
|         top: 60px; | ||||
|         width: 100%; | ||||
|     } | ||||
|  | ||||
|     .controls { | ||||
|         height: 60px; | ||||
|         top: 15px; | ||||
|         position: fixed; | ||||
|         top: 0px; | ||||
|         width: 100%; | ||||
|         background-color: rgb(0, 0, 0); | ||||
|     } | ||||
|  | ||||
|     .controls-group { | ||||
|         float: right; | ||||
|         margin-right: 25px; | ||||
|     } | ||||
|  | ||||
|     .content { | ||||
|         position: relative; | ||||
|         top: 60px; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										17
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].Package.csproj
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].Package.csproj
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net5.0</TargetFramework> | ||||
|     <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\Client\[Owner].[Theme].Client.csproj" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <Target Name="PostBuild" AfterTargets="PostBuildEvent"> | ||||
|     <Exec Command="IF $(ConfigurationName) == Debug (debug.cmd)" /> | ||||
|     <Exec Command="IF $(ConfigurationName) == Release (release.cmd)" /> | ||||
|   </Target> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										27
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].nuspec
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].nuspec
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> | ||||
|   <metadata> | ||||
|     <id>[Owner].[Theme]</id> | ||||
|     <version>1.0.0</version> | ||||
|     <authors>[Owner]</authors> | ||||
|     <owners>[Owner]</owners> | ||||
|     <title>[Theme]</title> | ||||
|     <description>[Theme]</description> | ||||
|     <copyright>[Owner]</copyright> | ||||
|     <requireLicenseAcceptance>false</requireLicenseAcceptance> | ||||
|     <license type="expression">MIT</license> | ||||
|     <projectUrl>https://github.com/oqtane/oqtane.framework</projectUrl> | ||||
|     <iconUrl>https://www.oqtane.org/Portals/0/icon.jpg</iconUrl> | ||||
|     <tags>oqtane module</tags> | ||||
|     <releaseNotes></releaseNotes> | ||||
|     <summary></summary> | ||||
|     <dependencies> | ||||
|       <dependency id="Oqtane.Framework" version="[FrameworkVersion]" /> | ||||
|     </dependencies> | ||||
|   </metadata> | ||||
|   <files> | ||||
|     <file src="..\Client\bin\Release\net5.0\[Owner].[Theme].Client.Oqtane.dll" target="lib\net5.0" />  | ||||
|     <file src="..\Client\bin\Release\net5.0\[Owner].[Theme].Client.Oqtane.pdb" target="lib\net5.0" />  | ||||
|     <file src="..\Client\wwwroot\**\*.*" target="wwwroot" />  | ||||
|   </files> | ||||
| </package> | ||||
							
								
								
									
										3
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| XCOPY "..\Client\bin\Debug\net5.0\[Owner].[Theme].Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net5.0\" /Y | ||||
| XCOPY "..\Client\bin\Debug\net5.0\[Owner].[Theme].Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net5.0\" /Y | ||||
| XCOPY "..\Client\wwwroot\*" "..\..\[RootFolder]\Oqtane.Client\wwwroot\" /Y /S /I | ||||
							
								
								
									
										2
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| "..\..\[RootFolder]\oqtane.package\nuget.exe" pack [Owner].[Theme].nuspec  | ||||
| XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\wwwroot\Themes\" /Y | ||||
							
								
								
									
										36
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/[Owner].[Theme].sln
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Oqtane.Server/wwwroot/Themes/Templates/External/[Owner].[Theme].sln
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 16 | ||||
| VisualStudioVersion = 16.0.28621.142 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Theme].Client", "Client\[Owner].[Theme].Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "[Owner].[Theme].Package", "Package\[Owner].[Theme].Package.csproj", "{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
| 		Release|Any CPU = Release|Any CPU | ||||
| 		Wasm|Any CPU = Wasm|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Wasm|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Wasm|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Wasm|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Wasm|Any CPU.Build.0 = Debug|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {1D016F15-46FE-4726-8DFD-2E4FD4DC7668} | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
| @ -1,4 +1,4 @@ | ||||
| @import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); | ||||
| @import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); | ||||
|  | ||||
| html, body { | ||||
|     font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; | ||||
| @ -90,6 +90,17 @@ app { | ||||
|     color: gray; | ||||
| } | ||||
|  | ||||
| .app-moduleactions .dropdown-submenu { | ||||
|     position: relative; | ||||
| } | ||||
|  | ||||
|     .app-moduleactions .dropdown-submenu > .dropdown-menu { | ||||
|         top: 0; | ||||
|         left: 100%; | ||||
|         margin-top: 0px; | ||||
|         margin-left: 0px; | ||||
|     } | ||||
|  | ||||
| .app-progress-indicator { | ||||
|     background: rgba(0,0,0,0.2) url('../loading.gif') no-repeat 50% 50%; | ||||
|     width: 100%; | ||||
| @ -125,6 +136,13 @@ app { | ||||
|     vertical-align: inherit; | ||||
| } | ||||
|  | ||||
| .app-alert { | ||||
|     padding: 20px; | ||||
|     background-color: #f44336; /* red */ | ||||
|     color: white; | ||||
|     margin-bottom: 15px; | ||||
| } | ||||
|  | ||||
| /* Tooltips */ | ||||
| .app-tooltip { | ||||
|     cursor: help; | ||||
| @ -207,4 +225,4 @@ app { | ||||
|     position: absolute; | ||||
|     right: 0.75rem; | ||||
|     top: 0.5rem; | ||||
| } | ||||
| } | ||||
|  | ||||
							
								
								
									
										8
									
								
								Oqtane.Server/wwwroot/js/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Oqtane.Server/wwwroot/js/app.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| function subMenu(a) { | ||||
|     event.preventDefault(); | ||||
|     event.stopPropagation(); | ||||
|  | ||||
|     var li = a.parentElement, submenu = li.getElementsByTagName('ul')[0]; | ||||
|     submenu.style.display = submenu.style.display == "block" ? "none" : "block"; | ||||
|     return false; | ||||
| } | ||||
| @ -362,5 +362,8 @@ Oqtane.Interop = { | ||||
|         setInterval(function () { | ||||
|             window.location.href = url; | ||||
|         }, wait * 1000); | ||||
|     }, | ||||
|     formValid: function (formRef) { | ||||
|         return formRef.checkValidity(); | ||||
|     } | ||||
| }; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Charles Nurse
					Charles Nurse