Initial commit
This commit is contained in:
15
.codegen.json
Normal file
15
.codegen.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"Template": ".\\.templates\\Main.cshtml",
|
||||||
|
"OutputDirectory": ".\\.out",
|
||||||
|
"OrgName": "Bring2mind",
|
||||||
|
"ModuleName": "InMemoriam",
|
||||||
|
"RootNameSpace": "Bring2mind.InMemoriam.Core",
|
||||||
|
"SiteConfig": "",
|
||||||
|
"ConnectionString": "Data Source=.\\SQLEXPRESS;Initial Catalog=Robert;uid=test;pwd=test;TrustServerCertificate=True",
|
||||||
|
"ObjectQualifier": "",
|
||||||
|
"DatabaseOwner": "dbo",
|
||||||
|
"ModuleObjectQualifier": "B2M_InMemoriam_",
|
||||||
|
"IncludeSqlScripts": true,
|
||||||
|
"EnumValues": null,
|
||||||
|
"FullDbPattern": "(?<owner>\\[?dbo\\]?\\.)?\\[?(?<name>\\w+)\\]?|(?<owner>\\[?dbo\\]?\\.)\\[?(?<name>\\w+)\\]?|(?<=\\sJOIN\\s+)(?<name>\\w+)"
|
||||||
|
}
|
||||||
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
node_modules
|
||||||
|
**/bin
|
||||||
|
**/obj
|
||||||
|
.vs
|
||||||
|
.out
|
||||||
|
local.json
|
||||||
|
Releases
|
||||||
|
tools
|
||||||
49
.templates/AuditableEntity.cshtml
Normal file
49
.templates/AuditableEntity.cshtml
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
@inherits RazorTemplate<string>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Data
|
||||||
|
{
|
||||||
|
[DataContract]
|
||||||
|
public abstract class AuditableEntity
|
||||||
|
{
|
||||||
|
|
||||||
|
public void FillAuditFields(IDataReader dr)
|
||||||
|
{
|
||||||
|
CreatedByUserID = Convert.ToInt32(Null.SetNull(dr["CreatedByUserID"], CreatedByUserID));
|
||||||
|
CreatedOnDate = Convert.ToDateTime(Null.SetNull(dr["CreatedOnDate"], CreatedOnDate));
|
||||||
|
LastModifiedByUserID = Convert.ToInt32(Null.SetNull(dr["LastModifiedByUserID"], LastModifiedByUserID));
|
||||||
|
LastModifiedOnDate = Convert.ToDateTime(Null.SetNull(dr["LastModifiedOnDate"], LastModifiedOnDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAddingUser(int userId)
|
||||||
|
{
|
||||||
|
CreatedByUserID = userId;
|
||||||
|
CreatedOnDate = DateTime.Now;
|
||||||
|
SetModifyingUser(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetModifyingUser(int userId)
|
||||||
|
{
|
||||||
|
LastModifiedByUserID = userId;
|
||||||
|
LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Public Properties
|
||||||
|
[DataMember]
|
||||||
|
public int CreatedByUserID { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public DateTime CreatedOnDate { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int LastModifiedByUserID { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public DateTime LastModifiedOnDate { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
35
.templates/BootstrapPopupEdit.cshtml
Normal file
35
.templates/BootstrapPopupEdit.cshtml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="modal-dialog modal-lg">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
<h4 class="modal-title" id="cmModalLabel">@@Html.GetLocalizedString("EditUser")</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12 form-horizontal">
|
||||||
|
@foreach (Column c in Model.Table.Columns)
|
||||||
|
{
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="Title" class="col-sm-2 control-label">@@Html.GetLocalizedString("@c.Name")</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="@c.Name" value="@("@Model.")@c.Name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a href="#" id="cmdCancel" class="btn btn-default" data-dismiss="modal">@@Html.GetLocalizedString("cmdCancel")</a>
|
||||||
|
<a href="#" id="cmdSubmit" class="btn btn-primary">@@Html.GetLocalizedString("cmdSubmit")</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
61
.templates/Controller.cshtml
Normal file
61
.templates/Controller.cshtml
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
using @(Settings.RootNameSpace).Models.@(Model.PluralName);
|
||||||
|
using @(Settings.RootNameSpace).Repositories;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Controllers
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class @(Model.PluralName)Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
@if (@Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: public static @(Model.SingularName) Get@(Model.SingularName)(@Model.Table.PrimaryKeyParameterList())
|
||||||
|
@: {
|
||||||
|
@:
|
||||||
|
@: @(Model.SingularName)Repository repo = new @(Model.SingularName)Repository();
|
||||||
|
@: return repo.GetById(@Model.Table.PrimaryKeyParameters().Lowered());
|
||||||
|
@:
|
||||||
|
@: }
|
||||||
|
@:
|
||||||
|
@: public static int Add@(Model.SingularName)(ref @(Model.SingularName)Base @(Model.SingularName.Lowered())@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
@: {
|
||||||
|
if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@:
|
||||||
|
@: @(Model.SingularName.Lowered()).SetAddingUser(userId);
|
||||||
|
}
|
||||||
|
@: @(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
@: repo.Insert(@(Model.SingularName.Lowered()));
|
||||||
|
@: return @(Model.SingularName.Lowered()).@Model.Table.PrimaryKeyParameters();
|
||||||
|
@:
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Update@(Model.SingularName)(@(Model.SingularName)Base @(Model.SingularName.Lowered())@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
{
|
||||||
|
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularName.Lowered()).SetModifyingUser(userId);
|
||||||
|
}
|
||||||
|
@(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
repo.Update(@(Model.SingularName.Lowered()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Delete@(Model.SingularName)(@(Model.SingularName)Base @(Model.SingularName.Lowered()))
|
||||||
|
{
|
||||||
|
|
||||||
|
@(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
repo.Delete(@(Model.SingularName.Lowered()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
82
.templates/Controller_Services.cshtml
Normal file
82
.templates/Controller_Services.cshtml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Web.Http;
|
||||||
|
using DotNetNuke.Web.Api;
|
||||||
|
using @(Settings.RootNameSpace).Repositories;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Api
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class @(Model.PluralName)Controller : @(Settings.ModuleName)ApiController
|
||||||
|
{
|
||||||
|
|
||||||
|
[HttpGet()]
|
||||||
|
[DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.View)]
|
||||||
|
public HttpResponseMessage MyMethod(int id)
|
||||||
|
{
|
||||||
|
bool res = true;
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (@Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: [HttpGet]
|
||||||
|
@: [DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.View)]
|
||||||
|
@: public HttpResponseMessage Get (@Model.Table.PrimaryKeyParameterList())
|
||||||
|
@: {
|
||||||
|
@:
|
||||||
|
@: @(Model.SingularName)Repository repo = new @(Model.SingularName)Repository();
|
||||||
|
@: return Request.CreateResponse(HttpStatusCode.OK, repo.GetById(@Model.Table.PrimaryKeyParameters().Lowered()));
|
||||||
|
@:
|
||||||
|
@: }
|
||||||
|
@:
|
||||||
|
@: [HttpPost]
|
||||||
|
@: [DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.Edit)]
|
||||||
|
@: public HttpResponseMessage Add (@(Model.SingularName)Base @(Model.SingularName.Lowered()))
|
||||||
|
@: {
|
||||||
|
if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@:
|
||||||
|
@: @(Model.SingularName.Lowered()).SetAddingUser(userId);
|
||||||
|
}
|
||||||
|
@: @(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
@: repo.Insert(@(Model.SingularName.Lowered()));
|
||||||
|
@: return Request.CreateResponse(HttpStatusCode.OK, @(Model.SingularName.Lowered()));
|
||||||
|
@:
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.Edit)]
|
||||||
|
public HttpResponseMessage Update (@(Model.SingularName)Base @(Model.SingularName.Lowered()))
|
||||||
|
{
|
||||||
|
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularName.Lowered()).SetModifyingUser(userId);
|
||||||
|
}
|
||||||
|
@(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
repo.Update(@(Model.SingularName.Lowered()));
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, @(Model.SingularName.Lowered()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.Edit)]
|
||||||
|
public HttpResponseMessage Delete (@Model.Table.PrimaryKeyParameterList())
|
||||||
|
{
|
||||||
|
|
||||||
|
@(Model.SingularName)BaseRepository repo = new @(Model.SingularName)BaseRepository();
|
||||||
|
repo.Delete(@(Model.SingularName.Lowered()));
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, "");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
21
.templates/IHydratableField.cshtml
Normal file
21
.templates/IHydratableField.cshtml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
@inherits RazorTemplate<Column>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@switch (Model.DataType.SqlDataType.ToString())
|
||||||
|
{
|
||||||
|
case "DateTime":
|
||||||
|
case "SmallDateTime":
|
||||||
|
@: @Model.Name = (DateTime)(Null.SetNull(dr["@Model.Name"], @Model.Name));
|
||||||
|
break;
|
||||||
|
case "Time":
|
||||||
|
@: if (dr["@Model.Name"] != DBNull.Value) { @Model.Name = (TimeSpan)dr["@Model.Name"]; }
|
||||||
|
break;
|
||||||
|
case "Guid":
|
||||||
|
@: @Model.Name = (Guid)(Null.SetNull(dr["@Model.Name"], @Model.Name));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
@: @Model.Name = Convert.To@(Model.DataType.DataTypeToCsStruct())(Null.SetNull(dr["@Model.Name"], @Model.Name));
|
||||||
|
break;
|
||||||
|
}
|
||||||
39
.templates/IPropertyAccessField.cshtml
Normal file
39
.templates/IPropertyAccessField.cshtml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
@inherits RazorTemplate<Column>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
case "@Model.Name.ToLower()": // @Model.DataType.SqlDataType.ToString()
|
||||||
|
@if (Model.Nullable)
|
||||||
|
{
|
||||||
|
@: if (@Model.Name == null)
|
||||||
|
@: {
|
||||||
|
@: return "";
|
||||||
|
@: };
|
||||||
|
}
|
||||||
|
@switch (Model.DataType.SqlDataType.ToString())
|
||||||
|
{
|
||||||
|
case "Bit":
|
||||||
|
@: return @(Model.Name).ToString();
|
||||||
|
break;
|
||||||
|
case "Char":
|
||||||
|
case "Text":
|
||||||
|
case "VarChar":
|
||||||
|
case "VarCharMax":
|
||||||
|
case "NChar":
|
||||||
|
case "NText":
|
||||||
|
case "NVarChar":
|
||||||
|
case "NVarCharMax":
|
||||||
|
@: return PropertyAccess.FormatString(@Model.Name, strFormat);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (Model.Nullable)
|
||||||
|
{
|
||||||
|
@: return ((@(Model.DataType.DataTypeToCs()))@(Model.Name)).ToString(strFormat, formatProvider);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@: return @(Model.Name).ToString(strFormat, formatProvider);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
56
.templates/Main.cshtml
Normal file
56
.templates/Main.cshtml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
@inherits RazorTemplate<string>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
|
||||||
|
@foreach (Bring2mind.CodeGen.Cli.Data.ObjectDefinition od in DnnDb.Objects.Values)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("Controller.cshtml", "Controllers\\" + od.PluralName + "Controller.cs", od);
|
||||||
|
Engine.RenderTemplate("Controller_Services.cshtml", "Api\\" + od.PluralName + "Controller.cs", od);
|
||||||
|
if (od.IsLinkTableWithoutFields)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("RepositoryLinkTable.cshtml", "Repositories\\" + od.SingularName + "Repository_Core.cs", od);
|
||||||
|
}
|
||||||
|
else if (od.IsLinkTableWithFields)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("RepositoryLinkTablePlus.cshtml", "Repositories\\" + od.SingularName + "Repository_Core.cs", od);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("Repository.cshtml", "Repositories\\" + od.SingularName + "Repository_Core.cs", od);
|
||||||
|
}
|
||||||
|
Engine.RenderTemplate("Repository_Empty.cshtml", "Repositories\\" + od.SingularName + "Repository.cs", od);
|
||||||
|
if (od.HasTable)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("BootstrapPopupEdit.cshtml", "Extra\\Bootstrap\\" + od.SingularName + "Popup.cs", od);
|
||||||
|
Engine.RenderTemplate("MvcEdit.cshtml", "Extra\\Mvc\\" + od.SingularName + "Edit.cshtml", od);
|
||||||
|
Engine.RenderTemplate("MvcBootstrapEdit.cshtml", "Extra\\MvcBootstrap\\" + od.SingularName + "Edit.cshtml", od);
|
||||||
|
}
|
||||||
|
if (od.TableAndView)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("Model.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Declaration.cs", od);
|
||||||
|
Engine.RenderTemplate("Model_Interfaces.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Interfaces.cs", od);
|
||||||
|
Engine.RenderTemplate("ModelBase.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "Base.cs", od);
|
||||||
|
Engine.RenderTemplate("ModelBase_Interfaces.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "Base_Interfaces.cs", od);
|
||||||
|
}
|
||||||
|
else if (od.TableOnly)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("ModelBase.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Declaration.cs", od);
|
||||||
|
Engine.RenderTemplate("ModelBase_Interfaces.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Interfaces.cs", od);
|
||||||
|
Engine.RenderTemplate("Model_Empty.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + ".cs", od);
|
||||||
|
}
|
||||||
|
else if (od.ViewOnly)
|
||||||
|
{
|
||||||
|
Engine.RenderTemplate("Model.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Declaration.cs", od);
|
||||||
|
Engine.RenderTemplate("Model_Interfaces.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + "_Interfaces.cs", od);
|
||||||
|
Engine.RenderTemplate("Model_Empty.cshtml", "Models\\" + od.PluralName + "\\" + od.SingularName + ".cs", od);
|
||||||
|
}
|
||||||
|
Engine.RenderTemplate("TypeScriptIModel.cshtml", "ts\\Models\\I" + od.SingularName + ".ts", od);
|
||||||
|
}
|
||||||
|
|
||||||
|
@{
|
||||||
|
Engine.RenderTemplate("TypeScriptIModelIndex.cshtml", "ts\\Models\\index.js");
|
||||||
|
Engine.RenderTemplate("RepositoryImpl.cshtml", "Data\\RepositoryImpl.cs");
|
||||||
|
Engine.RenderTemplate("AuditableEntity.cshtml", "Data\\AuditableEntity.cs");
|
||||||
|
Engine.RenderTemplate("Sprocs.cshtml", "Data\\Sprocs.cs", DnnDb.StoredProcedures);
|
||||||
|
}
|
||||||
89
.templates/Model.cshtml
Normal file
89
.templates/Model.cshtml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
|
||||||
|
[TableName("@Model.Prefix@Model.ModuleQualifier@Model.Name")]
|
||||||
|
@if (Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: [PrimaryKey("@Model.Table.PrimaryKeyParameters()", AutoIncrement = true)]
|
||||||
|
}
|
||||||
|
[DataContract]
|
||||||
|
@if (Model.Scope != "")
|
||||||
|
{
|
||||||
|
@: [Scope("@Model.Scope")]
|
||||||
|
}
|
||||||
|
public partial class @(Model.SingularName) @if (Model.TableAndView){@: : @(Model.SingularName)Base
|
||||||
|
}
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public @(Model.SingularName)() @if (Model.TableAndView){@: : base()
|
||||||
|
}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("PropertyField.cshtml", c).TrimEnd('\r', '\n'))
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
@if (Model.TableAndView)
|
||||||
|
{
|
||||||
|
@: public @(Model.SingularName)Base Get@(Model.SingularName)Base()
|
||||||
|
@: {
|
||||||
|
@: @(Model.SingularName)Base res = new @(Model.SingularName)Base();
|
||||||
|
foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: res.@c.Name = @c.Name;
|
||||||
|
}
|
||||||
|
if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: res.CreatedByUserID = CreatedByUserID;
|
||||||
|
@: res.CreatedOnDate = CreatedOnDate;
|
||||||
|
@: res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
@: res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
}
|
||||||
|
@: return res;
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
public @(Model.SingularName) Clone()
|
||||||
|
{
|
||||||
|
@(Model.SingularName) res = new @(Model.SingularName)();
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: res.@c.Name = @c.Name;
|
||||||
|
}
|
||||||
|
@if (Model.TableAndView)
|
||||||
|
{
|
||||||
|
foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@: res.@c.Name = @c.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: res.CreatedByUserID = CreatedByUserID;
|
||||||
|
@: res.CreatedOnDate = CreatedOnDate;
|
||||||
|
@: res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
@: res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
68
.templates/ModelBase.cshtml
Normal file
68
.templates/ModelBase.cshtml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
dynamic vb = new System.Dynamic.ExpandoObject();
|
||||||
|
vb.ObjectName = Model.SingularName;
|
||||||
|
|
||||||
|
string baseQualifier = "Base";
|
||||||
|
if (Model.TableOnly)
|
||||||
|
{
|
||||||
|
baseQualifier = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using @(Settings.RootNameSpace).Data;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
[TableName("@Model.ModuleQualifier@Model.Name")]
|
||||||
|
@if (Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: [PrimaryKey("@Model.Table.PrimaryKeyParameters()", AutoIncrement = true)]
|
||||||
|
}
|
||||||
|
[DataContract]
|
||||||
|
@if (Model.Scope != "")
|
||||||
|
{
|
||||||
|
@: [Scope("@Model.Scope")]
|
||||||
|
}
|
||||||
|
public partial class @(Model.SingularName)@baseQualifier @if (Model.HasAuditFields){@: : AuditableEntity
|
||||||
|
}
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public @(Model.SingularName)@(baseQualifier)()
|
||||||
|
{
|
||||||
|
@if (@Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: @Model.Table.PrimaryKeyParameters() = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("PropertyField.cshtml", c))
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public void Read@(Model.SingularName)@(baseQualifier)(@(Model.SingularName)@baseQualifier @(Model.SingularName.Lowered()))
|
||||||
|
{
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("ReadBaseField.cshtml", c, vb))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
81
.templates/ModelBase_Interfaces.cshtml
Normal file
81
.templates/ModelBase_Interfaces.cshtml
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
string baseQualifier = "Base";
|
||||||
|
if (Model.TableOnly)
|
||||||
|
{
|
||||||
|
baseQualifier = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using DotNetNuke.Entities.Modules;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
public partial class @(Model.SingularName)@baseQualifier : IHydratable, IPropertyAccess
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
|
||||||
|
public virtual void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: FillAuditFields(dr);
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("IHydratableField.cshtml", c).TrimEnd('\r', '\n'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public int KeyID
|
||||||
|
{
|
||||||
|
@if (@Model.Table.IsTableWithIdColumn())
|
||||||
|
{
|
||||||
|
@: get { return @Model.Table.PrimaryKeyParameters(); }
|
||||||
|
@: set { @Model.Table.PrimaryKeyParameters() = value; }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@: get { return Null.NullInteger; }
|
||||||
|
@: set { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public virtual string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower())
|
||||||
|
{
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("IPropertyAccessField.cshtml", c).TrimEnd('\r', '\n'))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
propertyNotFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Null.NullString;
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public CacheLevel Cacheability
|
||||||
|
{
|
||||||
|
get { return CacheLevel.fullyCacheable; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
52
.templates/ModelPublic.cshtml
Normal file
52
.templates/ModelPublic.cshtml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
public class @(Model.SingularName)Public : @(Model.SingularName)
|
||||||
|
{
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new @c.DataType.DataTypeToCs()@(c.NullSuffix()) @c.Name { get; set; }
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new @c.DataType.DataTypeToCs()@(c.NullSuffix()) @c.Name { get; set; }
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new int CreatedByUserID { get; set; }
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new DateTime CreatedOnDate { get; set; }
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new int LastModifiedByUserID { get; set; }
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new DateTime LastModifiedOnDate { get; set; }
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new string CreatedByUser { get; set; }
|
||||||
|
@: [JsonIgnore]
|
||||||
|
@: public new string LastModifiedByUser { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public @(Model.SingularName)Public(@(Model.SingularName) input)
|
||||||
|
{
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: @c.Name = input.@c.Name;
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@: @c.Name = input.@c.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
12
.templates/Model_Empty.cshtml
Normal file
12
.templates/Model_Empty.cshtml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
public partial class @(Model.SingularName)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
60
.templates/Model_Interfaces.cshtml
Normal file
60
.templates/Model_Interfaces.cshtml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Models.@(Model.PluralName)
|
||||||
|
{
|
||||||
|
|
||||||
|
[Serializable(), XmlRoot("@(Model.SingularName)")]
|
||||||
|
public partial class @(Model.SingularName)
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
public @(Model.TableAndView ? "override" : "") void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
@if (Model.TableAndView)
|
||||||
|
{
|
||||||
|
@: base.Fill(dr);
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("IHydratableField.cshtml", c).TrimEnd('\r', '\n'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public @(Model.TableAndView ? "override" : "") string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower()) {
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@:@Raw(Engine.RunCompile("IPropertyAccessField.cshtml", c).TrimEnd('\r', '\n'))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
@if (Model.TableAndView)
|
||||||
|
{
|
||||||
|
@: return base.GetProperty(strPropertyName, strFormat, formatProvider, accessingUser, accessLevel, ref propertyNotFound);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@: propertyNotFound = true;
|
||||||
|
@: return "";
|
||||||
|
@: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
55
.templates/MvcBootstrapEdit.cshtml
Normal file
55
.templates/MvcBootstrapEdit.cshtml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
@@inherits WebPage<@(Model.SingularName)>
|
||||||
|
@@using Connect.DNN.Modules.Conference.Common;
|
||||||
|
@@using Connect.Conference.Core.Models.Conferences;
|
||||||
|
@@using DotNetNuke.Web.Mvc.Helpers;
|
||||||
|
|
||||||
|
<div class="form-horizontal">
|
||||||
|
@foreach (Column c in Model.Table.Columns)
|
||||||
|
{
|
||||||
|
var req = c.Nullable ? "" : ", required = \"true\"";
|
||||||
|
var tp = "";
|
||||||
|
switch (c.DataType.SqlDataType) {
|
||||||
|
case SqlDataType.BigInt:
|
||||||
|
case SqlDataType.Int:
|
||||||
|
case SqlDataType.TinyInt:
|
||||||
|
case SqlDataType.SmallInt:
|
||||||
|
case SqlDataType.Real:
|
||||||
|
case SqlDataType.Numeric:
|
||||||
|
case SqlDataType.Float:
|
||||||
|
tp = ", type = \"number\"";
|
||||||
|
break;
|
||||||
|
case SqlDataType.Date:
|
||||||
|
tp = ", type = \"date\"";
|
||||||
|
break;
|
||||||
|
case SqlDataType.DateTime:
|
||||||
|
case SqlDataType.SmallDateTime:
|
||||||
|
tp = ", type = \"datetime\"";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c.DataType.SqlDataType == SqlDataType.Bit) {
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
@@Html.CheckBoxFor(m => m.@c.Name) @@Dnn.LocalizeString("@c.Name")
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
} else {
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="@c.Name" class="col-sm-2 control-label">@@Dnn.LocalizeString("@c.Name")</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
@@Html.TextBoxFor(m => m.@c.Name, new { @@class = "form-control", placeholder = Dnn.LocalizeString("@c.Name")@req@tp })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
23
.templates/MvcEdit.cshtml
Normal file
23
.templates/MvcEdit.cshtml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{
|
||||||
|
}
|
||||||
|
@@inherits WebPage<@(Model.SingularName)>
|
||||||
|
@@using Connect.DNN.Modules.Conference.Common;
|
||||||
|
@@using Connect.Conference.Core.Models.Conferences;
|
||||||
|
@@using DotNetNuke.Web.Mvc.Helpers;
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
@foreach (Column c in Model.Table.Columns)
|
||||||
|
{
|
||||||
|
<div class="dnnFormItem">
|
||||||
|
<div class="dnnLabel" style="position: relative;">
|
||||||
|
<label>@@Dnn.LocalizeString("@c.Name")</label>
|
||||||
|
</div>
|
||||||
|
@@Html.TextBoxFor(m => m.@c.Name, new { placeholder = Dnn.LocalizeString("@c.Name") })
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</fieldset>
|
||||||
7
.templates/PropertyField.cshtml
Normal file
7
.templates/PropertyField.cshtml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
@inherits RazorTemplate<Column>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
[DataMember]
|
||||||
|
public @Model.DataType.DataTypeToCs()@(Model.NullSuffix()) @Model.Name { get; set; }
|
||||||
35
.templates/ReadBaseField.cshtml
Normal file
35
.templates/ReadBaseField.cshtml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@inherits RazorTemplate<Column>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@switch (Model.DataType.SqlDataType.ToString())
|
||||||
|
{
|
||||||
|
case "Int":
|
||||||
|
case "TinyInt":
|
||||||
|
case "SmallInt":
|
||||||
|
@: if (@(((string)ViewBag.ObjectName).Lowered()).@Model.Name > -1)
|
||||||
|
@: @Model.Name = @(((string)ViewBag.ObjectName).Lowered()).@Model.Name;
|
||||||
|
break;
|
||||||
|
case "Real":
|
||||||
|
case "Numeric":
|
||||||
|
case "Float":
|
||||||
|
case "Decimal":
|
||||||
|
case "Money":
|
||||||
|
case "SmallMoney":
|
||||||
|
case "Date":
|
||||||
|
case "DateTime":
|
||||||
|
case "Time":
|
||||||
|
case "SmallDateTime":
|
||||||
|
case "Bit":
|
||||||
|
if (Model.Nullable)
|
||||||
|
{
|
||||||
|
@: if (@(((string)ViewBag.ObjectName).Lowered()).@Model.Name != null)
|
||||||
|
}
|
||||||
|
@: @Model.Name = @(((string)ViewBag.ObjectName).Lowered()).@Model.Name;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
@: if (!String.IsNullOrEmpty(@(((string)ViewBag.ObjectName).Lowered()).@Model.Name))
|
||||||
|
@: @Model.Name = @(((string)ViewBag.ObjectName).Lowered()).@Model.Name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
142
.templates/Repository.cshtml
Normal file
142
.templates/Repository.cshtml
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using @(Settings.RootNameSpace).Models.@(Model.PluralName);
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class @(Model.SingularName)Repository : ServiceLocator<I@(Model.SingularName)Repository, @(Model.SingularName)Repository>, I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
protected override Func<I@(Model.SingularName)Repository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new @(Model.SingularName)Repository();
|
||||||
|
}
|
||||||
|
public IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)(@(Model.GetScopeDeclaration(true, true, false, false)))
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<@(Model.SingularName)>();
|
||||||
|
return rep.Get(@(Model.GetScopeDeclaration(true, false, false, false)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: public IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")))
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: return context.ExecuteQuery<@(Model.SingularName)>(System.Data.CommandType.Text,
|
||||||
|
@: "SELECT * FROM {databaseOwner}{objectQualifier}@Model.Prefix@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.Parameter(fo.Key, false, false, ""))=@@0",
|
||||||
|
@: @(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasTable)
|
||||||
|
{
|
||||||
|
if (!Model.HasNoPrimaryKey)
|
||||||
|
{
|
||||||
|
@: public @(Model.SingularName) Get@(Model.SingularName)(@(Model.GetScopeDeclaration(true, true, false, true))@Model.Table.PrimaryKeyParameterList())
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.SingularName)>();
|
||||||
|
@: return rep.GetById(@Model.Table.PrimaryKeyParameters().Lowered()@(Model.GetScopeDeclaration(true, false, true, false)));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
@: public @(Model.TableObjectName) Add@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
@: {
|
||||||
|
@: Requires.NotNull(@(Model.SingularNameLowered));
|
||||||
|
if (Model.Scope != "")
|
||||||
|
{
|
||||||
|
@: Requires.PropertyNotNegative(@(Model.SingularNameLowered), "@(Model.GetScopeDeclaration(false, false, false, false))");
|
||||||
|
}
|
||||||
|
if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularNameLowered).CreatedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).CreatedOnDate = DateTime.Now;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
@: rep.Insert(@(Model.SingularNameLowered));
|
||||||
|
@: }
|
||||||
|
@: return @(Model.SingularNameLowered);
|
||||||
|
@: }
|
||||||
|
@: public void Delete@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered))
|
||||||
|
@: {
|
||||||
|
@: Requires.NotNull(@(Model.SingularNameLowered));
|
||||||
|
@: Requires.PropertyNotNegative(@(Model.SingularNameLowered), "@(Model.SingularName)Id");
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
@: rep.Delete(@(Model.SingularNameLowered));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
if (!Model.HasNoPrimaryKey)
|
||||||
|
{
|
||||||
|
@: public void Delete@(Model.SingularName)(@(Model.GetScopeDeclaration(true, true, false, true))@Model.Table.PrimaryKeyParameterList())
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
@: rep.Delete("@(Model.GetParameterList(true, true, ObjectDefinition.ParameterListType.SqlWhereClause))", @(Model.GetParameterList(true, true, ObjectDefinition.ParameterListType.Plain)));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
@: public void Update@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
@: {
|
||||||
|
@: Requires.NotNull(@(Model.SingularNameLowered));
|
||||||
|
@: Requires.PropertyNotNegative(@(Model.SingularNameLowered), "@(Model.SingularName)Id");
|
||||||
|
if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
@: rep.Update(@(Model.SingularNameLowered));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public partial interface I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)(@(Model.GetScopeDeclaration(true, true, false, false)));
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasTable)
|
||||||
|
{
|
||||||
|
if (!Model.HasNoPrimaryKey)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularName) Get@(Model.SingularName)(@(Model.GetScopeDeclaration(true, true, false, true))@Model.Table.PrimaryKeyParameterList());
|
||||||
|
}
|
||||||
|
@: @(Model.TableObjectName) Add@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""));
|
||||||
|
@: void Delete@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered));
|
||||||
|
if (!Model.HasNoPrimaryKey)
|
||||||
|
{
|
||||||
|
@: void Delete@(Model.SingularName)(@(Model.GetScopeDeclaration(true, true, false, true))@Model.Table.PrimaryKeyParameterList());
|
||||||
|
}
|
||||||
|
@: void Update@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
135
.templates/RepositoryImpl.cshtml
Normal file
135
.templates/RepositoryImpl.cshtml
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
@inherits RazorTemplate<string>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using DotNetNuke.Collections;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Data
|
||||||
|
{
|
||||||
|
public abstract class RepositoryImpl<T> : IRepository<T> where T : class
|
||||||
|
{
|
||||||
|
|
||||||
|
public virtual void Delete(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Delete(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Delete(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Delete(sqlCondition, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Find(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Find(sqlCondition, args);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> Find(int pageIndex, int pageSize, string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Find(pageIndex, pageSize, sqlCondition, args);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Get()
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Get();
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Get<TScopeType>(TScopeType scopeValue)
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Get<TScopeType>(scopeValue);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual T GetById<TProperty>(TProperty id)
|
||||||
|
{
|
||||||
|
T item = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
item = repo.GetById<TProperty>(id);
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual T GetById<TProperty, TScopeType>(TProperty id, TScopeType scopeValue)
|
||||||
|
{
|
||||||
|
T item = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
item = repo.GetById<TProperty, TScopeType>(id, scopeValue);
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> GetPage(int pageIndex, int pageSize)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.GetPage(pageIndex, pageSize);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> GetPage<TScopeType>(TScopeType scopeValue, int pageIndex, int pageSize)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.GetPage<TScopeType>(scopeValue, pageIndex, pageSize);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Insert(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Insert(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Update(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Update(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Update(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Update(sqlCondition, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
111
.templates/RepositoryLinkTable.cshtml
Normal file
111
.templates/RepositoryLinkTable.cshtml
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System;
|
||||||
|
using System.CodeDom;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Collections;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using @(Settings.RootNameSpace).Data;
|
||||||
|
using @(Settings.RootNameSpace).Models.@(Model.PluralName);
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class @(Model.SingularName)Repository : ServiceLocator<I@(Model.SingularName)Repository, @(Model.SingularName)Repository>, I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
protected override Func<I@(Model.SingularName)Repository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new @(Model.SingularName)Repository();
|
||||||
|
}
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: public IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")))
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: return context.ExecuteQuery<@(Model.SingularName)>(System.Data.CommandType.Text,
|
||||||
|
@: "SELECT * FROM {databaseOwner}{objectQualifier}@Model.Prefix@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.Parameter(fo.Key, false, false, ""))=@@0",
|
||||||
|
@: @(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Set@(Model.SingularName)(@Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, true, true))
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"IF NOT EXISTS (SELECT * FROM {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) " +
|
||||||
|
"WHERE @Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, 0, " AND ")) " +
|
||||||
|
"INSERT INTO {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) (@Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, false, "", ", ")) " +
|
||||||
|
"SELECT @@0, @@1", @Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Set@(Model.PluralName)(@(Model.Table.FirstPrimaryKeyParameter().ColumnParameter()), List<int> @(Model.PluralName.Lowered()))
|
||||||
|
{
|
||||||
|
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"DELETE FROM {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) WHERE @(Model.Table.FirstPrimaryKeyParameter().Name)=@@0", @(Model.Table.FirstPrimaryKeyParameter().Name.Lowered()));
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"INSERT INTO {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) (@Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, false, "", ", ")) " +
|
||||||
|
"SELECT @@0, s.RecordID " +
|
||||||
|
"FROM {databaseOwner}{objectQualifier}SplitDelimitedIDs(@@1, ',') s", @(Model.Table.FirstPrimaryKeyParameter().Name.Lowered()), string.Join(",", @(Model.PluralName.Lowered())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Delete@(Model.SingularName)(@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, true, true)))
|
||||||
|
{
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: Requires.NotNull(@(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"DELETE FROM {databaseOwner}{objectQualifier}@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, 0, " AND "))",
|
||||||
|
@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, true, "", ",")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
@: public void Delete@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")))
|
||||||
|
@: {
|
||||||
|
@: Requires.NotNull(@(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
@: rep.Delete("WHERE @(Model.Table.Parameter(fo.Key, false, false, ""))=@@0", @(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public partial interface I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Set@(Model.SingularName)(@Model.Table.PrimaryKeyParameterList());
|
||||||
|
void Set@(Model.PluralName)(@(Model.Table.FirstPrimaryKeyParameter().ColumnParameter()), List<int> @(Model.PluralName.Lowered()));
|
||||||
|
void Delete@(Model.SingularName)(@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, true, true)));
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
@: void Delete@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
152
.templates/RepositoryLinkTablePlus.cshtml
Normal file
152
.templates/RepositoryLinkTablePlus.cshtml
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using @(Settings.RootNameSpace).Models.@(Model.PluralName);
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class @(Model.SingularName)Repository : ServiceLocator<I@(Model.SingularName)Repository, @(Model.SingularName)Repository>, I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
protected override Func<I@(Model.SingularName)Repository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new @(Model.SingularName)Repository();
|
||||||
|
}
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: public IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")))
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: return context.ExecuteQuery<@(Model.SingularName)>(System.Data.CommandType.Text,
|
||||||
|
@: "SELECT * FROM {databaseOwner}{objectQualifier}@Model.Prefix@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.Parameter(fo.Key, false, false, ""))=@@0",
|
||||||
|
@: @(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public @(Model.SingularName) Get@(Model.SingularName)(@Model.Table.PrimaryKeyParameterList())
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
return context.ExecuteSingleOrDefault<@(Model.SingularName)>(System.Data.CommandType.Text,
|
||||||
|
"SELECT * FROM {databaseOwner}{objectQualifier}@Model.Prefix@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, 0, " AND "))",
|
||||||
|
@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, true, "", ",")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Add@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
{
|
||||||
|
Requires.NotNull(@(Model.SingularNameLowered));
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: Requires.NotNull(@(Model.SingularNameLowered).@(Model.Table.Parameter(fo.Key, false, false, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularNameLowered).CreatedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).CreatedOnDate = DateTime.Now;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"IF NOT EXISTS (SELECT * FROM {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) " +
|
||||||
|
"WHERE @Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, 0, " AND ")) " +
|
||||||
|
"INSERT INTO {databaseOwner}{objectQualifier}@(Model.ModuleQualifier)@(Model.Name) (@Model.Table.ParameterList(Globals.ColumnGroup.All, false, false, "", ", ")) " +
|
||||||
|
"SELECT @(Globals.GetSqlParameterNumbers(Model.Table.Columns.Count, 0, ", "))", @(Model.Table.ParameterList(Globals.ColumnGroup.All, false, false, Model.SingularNameLowered + ".", ", ")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Delete@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered))
|
||||||
|
{
|
||||||
|
Delete@(Model.SingularName)(@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, false, Model.SingularNameLowered + ".", ", ")));
|
||||||
|
}
|
||||||
|
public void Delete@(Model.SingularName)(@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, true, true)))
|
||||||
|
{
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: Requires.NotNull(@(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
context.Execute(System.Data.CommandType.Text,
|
||||||
|
"DELETE FROM {databaseOwner}{objectQualifier}@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, 0, " AND "))",
|
||||||
|
@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, true, "", ",")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: public void Delete@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")))
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
@: context.Execute(System.Data.CommandType.Text,
|
||||||
|
@: "DELETE FROM {databaseOwner}{objectQualifier}@Model.ModuleQualifier@Model.Name WHERE @(Model.Table.Parameter(fo.Key, false, false, ""))=@@0",
|
||||||
|
@: @(Model.Table.Parameter(fo.Key, false, true, "")));
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Update@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""))
|
||||||
|
{
|
||||||
|
Requires.NotNull(@(Model.SingularNameLowered));
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: Requires.NotNull(@(Model.SingularNameLowered).@(Model.Table.Parameter(fo.Key, false, false, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedByUserID = userId;
|
||||||
|
@: @(Model.SingularNameLowered).LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<@(Model.TableObjectName)>();
|
||||||
|
rep.Update("SET @(Model.Table.SqlParameterList(Globals.ColumnGroup.NonePrimaryKey, true, 0, ", ")) WHERE @(Model.Table.SqlParameterList(Globals.ColumnGroup.PrimaryKey, true, Model.Table.GetColumns(Globals.ColumnGroup.NonePrimaryKey).Count, " AND "))",
|
||||||
|
@(Model.Table.ParameterList(Globals.ColumnGroup.NonePrimaryKey, false, false, Model.SingularNameLowered + ".", ",")), @(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, false, false, Model.SingularNameLowered + ".", ",")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public partial interface I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: IEnumerable<@(Model.SingularName)> Get@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@(Model.SingularName) Get@(Model.SingularName)(@Model.Table.PrimaryKeyParameterList());
|
||||||
|
void Add@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""));
|
||||||
|
void Delete@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered));
|
||||||
|
void Delete@(Model.SingularName)(@(Model.Table.ParameterList(Globals.ColumnGroup.PrimaryKey, true, true)));
|
||||||
|
@foreach (KeyValuePair<String, ObjectDefinition> fo in Model.ForeignKeyObjects)
|
||||||
|
{
|
||||||
|
if (fo.Key != Model.Scope)
|
||||||
|
{
|
||||||
|
@: void Delete@(Model.PluralName)By@(fo.Value.SingularName)(@(Model.Table.Parameter(fo.Key, true, true, "")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Update@(Model.SingularName)(@(Model.TableObjectName) @(Model.SingularNameLowered)@(Model.HasAuditFields ? ", int userId" : ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
21
.templates/Repository_Empty.cshtml
Normal file
21
.templates/Repository_Empty.cshtml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using @(Settings.RootNameSpace).Models.@(Model.PluralName);
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Repositories
|
||||||
|
{
|
||||||
|
public partial class @(Model.SingularName)Repository : ServiceLocator<I@(Model.SingularName)Repository, @(Model.SingularName)Repository>, I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public partial interface I@(Model.SingularName)Repository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
51
.templates/Sprocs.cshtml
Normal file
51
.templates/Sprocs.cshtml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
@inherits RazorTemplate<Dictionary<String, SprocDefinition>>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@{}
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
|
||||||
|
namespace @(Settings.RootNameSpace).Data
|
||||||
|
{
|
||||||
|
public class Sprocs
|
||||||
|
{
|
||||||
|
@foreach (SprocDefinition sp in Model.Values)
|
||||||
|
{
|
||||||
|
var objName = "object";
|
||||||
|
if (sp.ReturnObject != "")
|
||||||
|
{
|
||||||
|
objName = sp.ReturnObject;
|
||||||
|
}
|
||||||
|
@: // @Raw(System.Text.RegularExpressions.Regex.Replace(sp.Sproc.TextBody, "(\n|\r\n?)", "\r\n // "));
|
||||||
|
if (sp.ReturnsData)
|
||||||
|
{
|
||||||
|
@: public static IEnumerable<@objName> @(sp.Name)(@sp.Sproc.ParameterList(true, true, "", ", "))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@: public static void @(sp.Name)(@sp.Sproc.ParameterList(true, true, "", ", "))
|
||||||
|
}
|
||||||
|
@: {
|
||||||
|
@: using (var context = DataContext.Instance())
|
||||||
|
@: {
|
||||||
|
if (sp.ReturnsData)
|
||||||
|
{
|
||||||
|
@: return context.ExecuteQuery<@objName>(System.Data.CommandType.StoredProcedure,
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@: context.Execute(System.Data.CommandType.StoredProcedure,
|
||||||
|
}
|
||||||
|
var pl = sp.Sproc.ParameterList(false, true, "", ", ");
|
||||||
|
var comma = string.IsNullOrEmpty(pl) ? "" : ",";
|
||||||
|
@: "@sp.Sproc.Name"@comma
|
||||||
|
@: @pl);
|
||||||
|
@: }
|
||||||
|
@: }
|
||||||
|
@:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
89
.templates/TypeScriptIModel.cshtml
Normal file
89
.templates/TypeScriptIModel.cshtml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
@inherits RazorTemplate<ObjectDefinition>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
export interface I@(Model.SingularName) {
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: @(c.Name)@(c.NullSuffix()): @(c.DataType.DataTypeToJs());
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: CreatedByUserID: number;
|
||||||
|
@: CreatedOnDate: Date;
|
||||||
|
@: LastModifiedByUserID: number;
|
||||||
|
@: LastModifiedOnDate: Date;
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@: @(c.Name)@(c.NullSuffix()): @(c.DataType.DataTypeToJs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class @(Model.SingularName) implements I@(Model.SingularName) {
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
@: @(c.Name)@(c.NullSuffix()): @(c.DataType.DataTypeToJs());
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: CreatedByUserID: number;
|
||||||
|
@: CreatedOnDate: Date;
|
||||||
|
@: LastModifiedByUserID: number;
|
||||||
|
@: LastModifiedOnDate: Date;
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
@: @(c.Name)@(c.NullSuffix()): @(c.DataType.DataTypeToJs());
|
||||||
|
}
|
||||||
|
constructor() {
|
||||||
|
@foreach (Column c in Model.TableColumns)
|
||||||
|
{
|
||||||
|
if (!c.Nullable) {
|
||||||
|
switch (c.DataType.DataTypeToJs())
|
||||||
|
{
|
||||||
|
case "number":
|
||||||
|
@: this.@(c.Name) = -1;
|
||||||
|
break;
|
||||||
|
case "string":
|
||||||
|
@: this.@(c.Name) = "";
|
||||||
|
break;
|
||||||
|
case "boolean":
|
||||||
|
@: this.@(c.Name) = false;
|
||||||
|
break;
|
||||||
|
case "Date":
|
||||||
|
@: this.@(c.Name) = new Date();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (Model.HasAuditFields)
|
||||||
|
{
|
||||||
|
@: this.CreatedByUserID = -1;
|
||||||
|
@: this.CreatedOnDate = new Date();
|
||||||
|
@: this.LastModifiedByUserID = -1;
|
||||||
|
@: this.LastModifiedOnDate = new Date();
|
||||||
|
}
|
||||||
|
@foreach (Column c in Model.UniqueViewColumns)
|
||||||
|
{
|
||||||
|
if (!c.Nullable) {
|
||||||
|
switch (c.DataType.DataTypeToJs())
|
||||||
|
{
|
||||||
|
case "number":
|
||||||
|
@: this.@(c.Name) = -1;
|
||||||
|
break;
|
||||||
|
case "string":
|
||||||
|
@: this.@(c.Name) = "";
|
||||||
|
break;
|
||||||
|
case "boolean":
|
||||||
|
@: this.@(c.Name) = false;
|
||||||
|
break;
|
||||||
|
case "Date":
|
||||||
|
@: this.@(c.Name) = new Date();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
.templates/TypeScriptIModelIndex.cshtml
Normal file
11
.templates/TypeScriptIModelIndex.cshtml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@inherits RazorTemplate<string>
|
||||||
|
@using Bring2mind.CodeGen.Cli.Common
|
||||||
|
@using Bring2mind.CodeGen.Cli.Data
|
||||||
|
@using Bring2mind.CodeGen.Cli.Razor
|
||||||
|
@using Microsoft.SqlServer.Management.Smo
|
||||||
|
@using System.Linq
|
||||||
|
|
||||||
|
@foreach (ObjectDefinition od in DnnDb.Objects.Values.OrderBy(od => od.SingularName))
|
||||||
|
{
|
||||||
|
@:export * from './I@(od.SingularName)';
|
||||||
|
}
|
||||||
29
.yo-rc.json
Normal file
29
.yo-rc.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"generator-dotnetnuke": {
|
||||||
|
"promptValues": {
|
||||||
|
"projType": "react",
|
||||||
|
"dnnVersion": "9.13.0",
|
||||||
|
"npm": true,
|
||||||
|
"projectname": "InMemoriam",
|
||||||
|
"projectdescription": "In Memoriam module",
|
||||||
|
"yourname": "Peter Donker",
|
||||||
|
"email": "peter@bring2mind.net",
|
||||||
|
"companyfull": "Bring2mind",
|
||||||
|
"companyshort": "Bring2mind",
|
||||||
|
"companyUrl": "bring2mind.net",
|
||||||
|
"dnnHost": "http://dnndev.me",
|
||||||
|
"dnnRoot": "DL/",
|
||||||
|
"namespace": "Bring2mind.InMemoriam",
|
||||||
|
"Name": "InMemoriam",
|
||||||
|
"Namespace": "Bring2mind.InMemoriam",
|
||||||
|
"FileOutName": "skin",
|
||||||
|
"ModuleName": "InMemoriam",
|
||||||
|
"Separate": true,
|
||||||
|
"ReactOptions": []
|
||||||
|
},
|
||||||
|
"Company": "Bring2mind",
|
||||||
|
"Project": "InMemoriam",
|
||||||
|
"Namespace": "Bring2mind.InMemoriam",
|
||||||
|
"Solution": "Bring2mind.InMemoriam"
|
||||||
|
}
|
||||||
|
}
|
||||||
42
Bring2mind.InMemoriam.sln
Normal file
42
Bring2mind.InMemoriam.sln
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.31903.59
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Themes", "Themes", "{404978B5-8C01-4201-A7FA-0B358DCFE99F}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InMemoriamSkin", "Themes\Skins\InMemoriamSkin\InMemoriamSkin.csproj", "{04747D14-1B14-4960-BB36-EFD061E47FAD}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InMemoriamContainer", "Themes\Containers\InMemoriamContainer\InMemoriamContainer.csproj", "{1517F2C9-F610-4F81-A09C-1C7E109A1ED6}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bring2mind.InMemoriam.Core", "Server\Core\Bring2mind.InMemoriam.Core.csproj", "{081727B2-44B2-4819-9836-2C6F3B890CC2}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bring2mind.InMemoriam", "Server\InMemoriam\Bring2mind.InMemoriam.csproj", "{DE141835-4474-431A-A2AC-D82F54DDB3B1}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{04747D14-1B14-4960-BB36-EFD061E47FAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{04747D14-1B14-4960-BB36-EFD061E47FAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1517F2C9-F610-4F81-A09C-1C7E109A1ED6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1517F2C9-F610-4F81-A09C-1C7E109A1ED6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{081727B2-44B2-4819-9836-2C6F3B890CC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{081727B2-44B2-4819-9836-2C6F3B890CC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{081727B2-44B2-4819-9836-2C6F3B890CC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{081727B2-44B2-4819-9836-2C6F3B890CC2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{DE141835-4474-431A-A2AC-D82F54DDB3B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{DE141835-4474-431A-A2AC-D82F54DDB3B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{DE141835-4474-431A-A2AC-D82F54DDB3B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{DE141835-4474-431A-A2AC-D82F54DDB3B1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{04747D14-1B14-4960-BB36-EFD061E47FAD} = {404978B5-8C01-4201-A7FA-0B358DCFE99F}
|
||||||
|
{1517F2C9-F610-4F81-A09C-1C7E109A1ED6} = {404978B5-8C01-4201-A7FA-0B358DCFE99F}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
42
Client/Css/InMemoriam/scss/bootstrap.scss
vendored
Normal file
42
Client/Css/InMemoriam/scss/bootstrap.scss
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
@import "../../../../node_modules/bootstrap/scss/bootstrap";
|
||||||
|
// Custom.scss
|
||||||
|
// Option B: Include parts of Bootstrap
|
||||||
|
|
||||||
|
// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/functions";
|
||||||
|
|
||||||
|
// 2. Include any default variable overrides here
|
||||||
|
// $body-bg: #383E42;
|
||||||
|
// $color-contrast-dark: #fff;
|
||||||
|
// $color-contrast-light: #383E42;
|
||||||
|
// $light: #383E42;
|
||||||
|
// $dark: #fff;
|
||||||
|
|
||||||
|
// 3. Include remainder of required Bootstrap stylesheets (including any separate color mode stylesheets)
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/variables";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/variables-dark";
|
||||||
|
|
||||||
|
// 4. Include any default map overrides here
|
||||||
|
|
||||||
|
// 5. Include remainder of required parts
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/maps";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/mixins";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/root";
|
||||||
|
|
||||||
|
// 6. Optionally include any other parts as needed
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/utilities";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/reboot";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/type";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/images";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/containers";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/grid";
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/helpers";
|
||||||
|
|
||||||
|
// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
|
||||||
|
@import "../../../../node_modules/bootstrap/scss/utilities/api";
|
||||||
|
|
||||||
|
// 8. Add additional custom code here
|
||||||
|
[data-bs-theme="dark"] {
|
||||||
|
--bs-body-bg: #383E42;
|
||||||
|
}
|
||||||
|
|
||||||
98
Client/Css/InMemoriam/scss/inpictures.scss
Normal file
98
Client/Css/InMemoriam/scss/inpictures.scss
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
.pictures {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, 222px);
|
||||||
|
column-gap: 20px;
|
||||||
|
width: 100%;
|
||||||
|
.picture {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
min-height: 300px;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: rgb(96 139 168 / 0.2);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
.footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-top: 1px solid #777;
|
||||||
|
padding-top: 6px;
|
||||||
|
.buttons {
|
||||||
|
a {
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.picture-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: rgba(0, 0, 0, 0.8);
|
||||||
|
transition: opacity 0.3s;
|
||||||
|
z-index: 1000;
|
||||||
|
padding: 3vw;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
|
.top {
|
||||||
|
height: 3em;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
.close {
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 2em;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.title {
|
||||||
|
color: white;
|
||||||
|
font-size: 2em;
|
||||||
|
height: 2em;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.overlay-container {
|
||||||
|
flex-grow: 1;
|
||||||
|
min-height: 0;
|
||||||
|
display: grid;
|
||||||
|
overflow: hidden;
|
||||||
|
grid-template-columns: 70% 30%;
|
||||||
|
.picture {
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
overflow: hidden;
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
height: auto;
|
||||||
|
width: auto;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.bottom {
|
||||||
|
height: 3em;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
.previous {
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 2em;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.next {
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 2em;
|
||||||
|
color: white;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
29
Client/Css/InMemoriam/scss/instories.scss
Normal file
29
Client/Css/InMemoriam/scss/instories.scss
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
.stories {
|
||||||
|
width: 100%;
|
||||||
|
.story {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 20px;
|
||||||
|
.title {
|
||||||
|
font-size: 1.5em;
|
||||||
|
font-weight: bold;
|
||||||
|
.date {
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-top: 1px solid #777;
|
||||||
|
padding-top: 6px;
|
||||||
|
.buttons {
|
||||||
|
a {
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
29
Client/Css/InMemoriam/scss/messages.scss
Normal file
29
Client/Css/InMemoriam/scss/messages.scss
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
.messages {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, 350px);
|
||||||
|
column-gap: 20px;
|
||||||
|
width: 100%;
|
||||||
|
.message {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
min-height: 300px;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: rgb(96 139 168 / 0.2);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
.content {
|
||||||
|
height: 100%;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-top: 1px solid #777;
|
||||||
|
padding-top: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
98
Client/Css/InMemoriam/scss/styles.scss
Normal file
98
Client/Css/InMemoriam/scss/styles.scss
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
@import "./bootstrap";
|
||||||
|
@import "./inpictures.scss";
|
||||||
|
@import "./instories.scss";
|
||||||
|
@import "./messages.scss";
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Quicksand", serif !important;
|
||||||
|
font-optical-sizing: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home-dates {
|
||||||
|
width: 100%;
|
||||||
|
height: 80vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
h2 {
|
||||||
|
margin-top: auto;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#dnn_MenuPane,
|
||||||
|
header > div {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
ul.homemenu,
|
||||||
|
ul.mainmenu,
|
||||||
|
ul.rightmenu {
|
||||||
|
list-style-type: none;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-left: 0;
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
li.active {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.rightmenu {
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.language-object {
|
||||||
|
display: inline;
|
||||||
|
li {
|
||||||
|
a {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginContainer,
|
||||||
|
#registrationContainer,
|
||||||
|
.doublePane,
|
||||||
|
.triplePane {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
#loginContainer {
|
||||||
|
padding-top: 200px;
|
||||||
|
> div {
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#registrationContainer {
|
||||||
|
padding-top: 100px;
|
||||||
|
> div {
|
||||||
|
width: 500px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dnnHelperTip {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.password-strength-container {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
.dnnFormMessage.dnnFormError {
|
||||||
|
background-color: transparent;
|
||||||
|
color: red;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
ul.dnnActions {
|
||||||
|
list-style-type: none;
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div.defaultContainer {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
36
Client/Css/InMemoriam/webpack.config.js
Normal file
36
Client/Css/InMemoriam/webpack.config.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
var path = require("path"),
|
||||||
|
MiniCssExtractPlugin = require("mini-css-extract-plugin"),
|
||||||
|
FileManagerPlugin = require("filemanager-webpack-plugin");
|
||||||
|
|
||||||
|
var outPath = path.resolve(__dirname, "../../../Themes/Skins/InMemoriamSkin");
|
||||||
|
|
||||||
|
var inmemoriamAppConfig = {
|
||||||
|
context: path.join(__dirname, "."),
|
||||||
|
entry: "./scss/styles.scss",
|
||||||
|
output: {
|
||||||
|
path: outPath,
|
||||||
|
filename: "skin.css.js"
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.scss$/,
|
||||||
|
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: "skin.css"
|
||||||
|
}),
|
||||||
|
new FileManagerPlugin({
|
||||||
|
events: {
|
||||||
|
onEnd: {
|
||||||
|
delete: [outPath + "/skin.css.js"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = inmemoriamAppConfig;
|
||||||
9
Client/Js/InMemoriam/App.tsx
Normal file
9
Client/Js/InMemoriam/App.tsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import * as ReactDOM from "react-dom";
|
||||||
|
import { AppManager } from "./AppManager";
|
||||||
|
import { ComponentLoader } from "./ComponentLoader";
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
AppManager.loadData();
|
||||||
|
ComponentLoader.load();
|
||||||
|
});
|
||||||
52
Client/Js/InMemoriam/AppManager.ts
Normal file
52
Client/Js/InMemoriam/AppManager.ts
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { AppModule, IAppModule } from "./Models/IAppModule";
|
||||||
|
import { KeyedCollection } from "./Models/IKeyedCollection";
|
||||||
|
import DataService from "./Service";
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Element {
|
||||||
|
dataInt: (prop: string) => number;
|
||||||
|
dataString: (prop: string, defaultValue: string) => string;
|
||||||
|
dataObject: (prop: string) => any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element.prototype.dataInt = function (this: Element, prop: string): number {
|
||||||
|
if (this.getAttribute("data-" + prop) == null) return 0;
|
||||||
|
return parseInt(this.getAttribute("data-" + prop) as string);
|
||||||
|
};
|
||||||
|
|
||||||
|
Element.prototype.dataString = function (
|
||||||
|
this: Element,
|
||||||
|
prop: string,
|
||||||
|
defaultValue: string
|
||||||
|
): string {
|
||||||
|
if (this.getAttribute("data-" + prop) == null) return defaultValue;
|
||||||
|
return this.getAttribute("data-" + prop) as string;
|
||||||
|
};
|
||||||
|
|
||||||
|
Element.prototype.dataObject = function (this: Element, prop: string): any {
|
||||||
|
if (this.getAttribute("data-" + prop) == null) return null;
|
||||||
|
return JSON.parse(this.getAttribute("data-" + prop) as string);
|
||||||
|
};
|
||||||
|
|
||||||
|
export class AppManager {
|
||||||
|
public static Modules = new KeyedCollection<IAppModule>();
|
||||||
|
|
||||||
|
public static loadData(): void {
|
||||||
|
document.querySelectorAll(".Bring2mindInMemoriam").forEach((el) => {
|
||||||
|
var moduleId = el.dataInt("moduleid");
|
||||||
|
AppManager.Modules.Add(
|
||||||
|
moduleId.toString(),
|
||||||
|
new AppModule(
|
||||||
|
moduleId,
|
||||||
|
el.dataInt("tabid"),
|
||||||
|
el.dataString("locale", "en-US"),
|
||||||
|
el.dataObject("resources"),
|
||||||
|
el.dataObject("common"),
|
||||||
|
el.dataObject("security"),
|
||||||
|
new DataService(moduleId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
33
Client/Js/InMemoriam/ComponentLoader.tsx
Normal file
33
Client/Js/InMemoriam/ComponentLoader.tsx
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { createRoot } from "react-dom/client";
|
||||||
|
|
||||||
|
import { AppManager } from "./AppManager";
|
||||||
|
import InPicturesPage from "./Components/InPictures/InPicturesPage";
|
||||||
|
import InStoriesPage from "./Components/InStories/InStoriesPage";
|
||||||
|
import MessagesPage from "./Components/Messages/MessagesPage";
|
||||||
|
|
||||||
|
export class ComponentLoader {
|
||||||
|
public static load(): void {
|
||||||
|
document.querySelectorAll(".InPictures").forEach((el) => {
|
||||||
|
const root = createRoot(el);
|
||||||
|
const moduleId = el.dataInt("moduleid");
|
||||||
|
root.render(
|
||||||
|
<InPicturesPage module={AppManager.Modules.Item(moduleId.toString())} />
|
||||||
|
);
|
||||||
|
});
|
||||||
|
document.querySelectorAll(".InWords").forEach((el) => {
|
||||||
|
const root = createRoot(el);
|
||||||
|
const moduleId = el.dataInt("moduleid");
|
||||||
|
root.render(
|
||||||
|
<InStoriesPage module={AppManager.Modules.Item(moduleId.toString())} />
|
||||||
|
);
|
||||||
|
});
|
||||||
|
document.querySelectorAll(".Messages").forEach((el) => {
|
||||||
|
const root = createRoot(el);
|
||||||
|
const moduleId = el.dataInt("moduleid");
|
||||||
|
root.render(
|
||||||
|
<MessagesPage module={AppManager.Modules.Item(moduleId.toString())} />
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
209
Client/Js/InMemoriam/Components/InPictures/EditImage.tsx
Normal file
209
Client/Js/InMemoriam/Components/InPictures/EditImage.tsx
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { Modal, Form } from "react-bootstrap";
|
||||||
|
import { IPicture } from "../../Models/IPicture";
|
||||||
|
|
||||||
|
interface IEditImageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
picture: IPicture;
|
||||||
|
shown: boolean;
|
||||||
|
dismiss: () => void;
|
||||||
|
editedPicture: (editedPicture: IPicture | null) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const EditImage: React.FC<IEditImageProps> = (props) => {
|
||||||
|
const [title, setTitle] = React.useState(props.picture.Title);
|
||||||
|
const [description, setDescription] = React.useState(
|
||||||
|
props.picture.Description
|
||||||
|
);
|
||||||
|
const [visibility, setVisibility] = React.useState(props.picture.Visibility); // 0 = public, 1 = friends, 2 = private
|
||||||
|
const [pictureYear, setPictureYear] = React.useState(
|
||||||
|
props.picture.PictureYear < 1 ? "" : props.picture.PictureYear.toString()
|
||||||
|
);
|
||||||
|
const [pictureMonth, setPictureMonth] = React.useState(
|
||||||
|
props.picture.PictureMonth < 1 ? "" : props.picture.PictureMonth.toString()
|
||||||
|
);
|
||||||
|
const [pictureDay, setPictureDay] = React.useState(
|
||||||
|
props.picture.PictureDay < 1 ? "" : props.picture.PictureDay.toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
const pictureYearIsValid =
|
||||||
|
pictureYear.length === 0 || /^\d{4}$/.test(pictureYear);
|
||||||
|
const pictureMonthIsValid =
|
||||||
|
pictureMonth.length === 0 || /^\d{1,2}$/.test(pictureMonth);
|
||||||
|
const pictureDayIsValid =
|
||||||
|
pictureDay.length === 0 || /^\d{1,2}$/.test(pictureDay);
|
||||||
|
const formIsValid =
|
||||||
|
pictureYearIsValid &&
|
||||||
|
pictureMonthIsValid &&
|
||||||
|
pictureDayIsValid &&
|
||||||
|
title !== "";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal show={props.shown} onHide={props.dismiss}>
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>{props.module.resources.AddImage}</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<div>
|
||||||
|
<img
|
||||||
|
src={
|
||||||
|
props.module.service.baseServicepath +
|
||||||
|
"Pictures/Get?id=" +
|
||||||
|
props.picture.ImageIdentifier +
|
||||||
|
"&width=200&height=200&method=c&moduleId=" +
|
||||||
|
props.module.moduleId +
|
||||||
|
"&tabId=" +
|
||||||
|
props.module.service.tabId
|
||||||
|
}
|
||||||
|
alt={props.picture.Title}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Form.Group controlId="title" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Title}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
value={title}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setTitle(e.target.value);
|
||||||
|
}}
|
||||||
|
isValid={title !== ""}
|
||||||
|
isInvalid={title === ""}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="description" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Description}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="textarea"
|
||||||
|
value={description}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
|
setDescription(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Visibility}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="select"
|
||||||
|
value={visibility}
|
||||||
|
onChange={(e) => {
|
||||||
|
setVisibility(parseInt(e.target.value));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<option value="0">{props.module.resources.Public}</option>
|
||||||
|
<option value="1">{props.module.resources.Friends}</option>
|
||||||
|
<option value="2">{props.module.resources.Private}</option>
|
||||||
|
</Form.Control>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Date}</Form.Label>
|
||||||
|
<div style={{ display: "flex" }}>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Year}
|
||||||
|
value={pictureYear}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureYear(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureYearIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Month}
|
||||||
|
value={pictureMonth}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureMonth(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureMonthIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Day}
|
||||||
|
value={pictureDay}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureDay(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureDayIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Form.Group>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button
|
||||||
|
className="btn btn-secondary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
props.dismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Cancel}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className="btn btn-danger"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (confirm(props.module.resources.DeleteConfirm) === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
props.module.service.deletePicture(
|
||||||
|
props.picture.PictureId,
|
||||||
|
() => {
|
||||||
|
// Success
|
||||||
|
props.editedPicture(null);
|
||||||
|
props.dismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
// Error
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
props.dismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Delete}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
disabled={formIsValid === false}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const picture = {
|
||||||
|
...props.picture,
|
||||||
|
Title: title,
|
||||||
|
Description: description,
|
||||||
|
Visibility: visibility,
|
||||||
|
PictureYear: pictureYear === "" ? -1 : parseInt(pictureYear),
|
||||||
|
PictureMonth: pictureMonth === "" ? -1 : parseInt(pictureMonth),
|
||||||
|
PictureDay: pictureDay === "" ? -1 : parseInt(pictureDay),
|
||||||
|
};
|
||||||
|
props.module.service.editPicture(
|
||||||
|
picture,
|
||||||
|
(picture: IPicture) => {
|
||||||
|
// Success
|
||||||
|
props.editedPicture(picture);
|
||||||
|
props.dismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
// Error
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
props.dismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Save}
|
||||||
|
</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EditImage;
|
||||||
139
Client/Js/InMemoriam/Components/InPictures/InPicturesPage.tsx
Normal file
139
Client/Js/InMemoriam/Components/InPictures/InPicturesPage.tsx
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import NewImage from "./NewImage";
|
||||||
|
import { IPicture } from "../../Models/IPicture";
|
||||||
|
import Picture from "./Picture";
|
||||||
|
import EditImage from "./EditImage";
|
||||||
|
import PictureOverlay from "./PictureOverlay";
|
||||||
|
|
||||||
|
interface IInPicturesPageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
}
|
||||||
|
|
||||||
|
const InPicturesPage: React.FC<IInPicturesPageProps> = (props) => {
|
||||||
|
const [showNewImage, setShowNewImage] = React.useState(false);
|
||||||
|
const [showEditImage, setShowEditImage] = React.useState(false);
|
||||||
|
const [pictures, setPictures] = React.useState<IPicture[]>([]);
|
||||||
|
const [pictureInEdit, setPictureInEdit] = React.useState<IPicture | null>(
|
||||||
|
null
|
||||||
|
);
|
||||||
|
const [selectedPictureIndex, setSelectedPictureIndex] = React.useState(-1);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
const handleKeyPress = (e: KeyboardEvent) => {
|
||||||
|
console.log(e.key, selectedPictureIndex, pictures.length);
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
setSelectedPictureIndex(-1);
|
||||||
|
} else if (
|
||||||
|
e.key === "ArrowRight" &&
|
||||||
|
selectedPictureIndex < pictures.length - 1
|
||||||
|
) {
|
||||||
|
setSelectedPictureIndex(selectedPictureIndex + 1);
|
||||||
|
} else if (e.key === "ArrowLeft" && selectedPictureIndex > 0) {
|
||||||
|
setSelectedPictureIndex(selectedPictureIndex - 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener("keydown", handleKeyPress);
|
||||||
|
return () => window.removeEventListener("keydown", handleKeyPress);
|
||||||
|
}, [selectedPictureIndex]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
props.module.service.getPictures(
|
||||||
|
(data) => {
|
||||||
|
setPictures(data);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setShowEditImage(pictureInEdit !== null);
|
||||||
|
}, [pictureInEdit]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{props.module.security.CanAdd && (
|
||||||
|
<div className="d-flex flex-row-reverse">
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
setShowNewImage(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Add}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="pictures">
|
||||||
|
{pictures.map((picture, index) => {
|
||||||
|
return (
|
||||||
|
<Picture
|
||||||
|
key={index}
|
||||||
|
module={props.module}
|
||||||
|
picture={picture}
|
||||||
|
onEdit={(picture) => {
|
||||||
|
setPictureInEdit(picture);
|
||||||
|
}}
|
||||||
|
onClick={(picture) => {
|
||||||
|
setSelectedPictureIndex(index);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<NewImage
|
||||||
|
module={props.module}
|
||||||
|
shown={showNewImage}
|
||||||
|
dismiss={() => {
|
||||||
|
setShowNewImage(false);
|
||||||
|
}}
|
||||||
|
addNewPicture={(picture) => {
|
||||||
|
setPictures([...pictures, picture]);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{pictureInEdit && (
|
||||||
|
<EditImage
|
||||||
|
module={props.module}
|
||||||
|
picture={pictureInEdit}
|
||||||
|
shown={showEditImage}
|
||||||
|
dismiss={() => {
|
||||||
|
setPictureInEdit(null);
|
||||||
|
}}
|
||||||
|
editedPicture={(picture) => {
|
||||||
|
if (picture) {
|
||||||
|
setPictures(
|
||||||
|
pictures.map((p) => {
|
||||||
|
return p.PictureId === picture.PictureId ? picture : p;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{selectedPictureIndex > -1 && (
|
||||||
|
<PictureOverlay
|
||||||
|
module={props.module}
|
||||||
|
picture={pictures[selectedPictureIndex]}
|
||||||
|
onClose={() => {
|
||||||
|
setSelectedPictureIndex(-1);
|
||||||
|
}}
|
||||||
|
hasNext={selectedPictureIndex < pictures.length - 1}
|
||||||
|
hasPrevious={selectedPictureIndex > 0}
|
||||||
|
onNext={() => {
|
||||||
|
setSelectedPictureIndex(selectedPictureIndex + 1);
|
||||||
|
}}
|
||||||
|
onPrevious={() => {
|
||||||
|
setSelectedPictureIndex(selectedPictureIndex - 1);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default InPicturesPage;
|
||||||
189
Client/Js/InMemoriam/Components/InPictures/NewImage.tsx
Normal file
189
Client/Js/InMemoriam/Components/InPictures/NewImage.tsx
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { Modal, Form } from "react-bootstrap";
|
||||||
|
import { IPicture } from "../../Models/IPicture";
|
||||||
|
|
||||||
|
interface INewImageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
shown: boolean;
|
||||||
|
dismiss: () => void;
|
||||||
|
addNewPicture: (newPicture: IPicture) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NewImage: React.FC<INewImageProps> = (props) => {
|
||||||
|
const [newFile, setNewFile] = React.useState<File | null>(null);
|
||||||
|
const [title, setTitle] = React.useState("");
|
||||||
|
const [description, setDescription] = React.useState("");
|
||||||
|
const [visibility, setVisibility] = React.useState(0); // 0 = public, 1 = friends, 2 = private
|
||||||
|
const [pictureYear, setPictureYear] = React.useState("");
|
||||||
|
const [pictureMonth, setPictureMonth] = React.useState("");
|
||||||
|
const [pictureDay, setPictureDay] = React.useState("");
|
||||||
|
|
||||||
|
const clearFormAndDismiss = () => {
|
||||||
|
setNewFile(null);
|
||||||
|
setTitle("");
|
||||||
|
setDescription("");
|
||||||
|
setVisibility(1);
|
||||||
|
setPictureYear("");
|
||||||
|
setPictureMonth("");
|
||||||
|
setPictureDay("");
|
||||||
|
props.dismiss();
|
||||||
|
};
|
||||||
|
|
||||||
|
const pictureYearIsValid =
|
||||||
|
pictureYear.length === 0 || /^\d{4}$/.test(pictureYear);
|
||||||
|
const pictureMonthIsValid =
|
||||||
|
pictureMonth.length === 0 || /^\d{1,2}$/.test(pictureMonth);
|
||||||
|
const pictureDayIsValid =
|
||||||
|
pictureDay.length === 0 || /^\d{1,2}$/.test(pictureDay);
|
||||||
|
const formIsValid =
|
||||||
|
pictureYearIsValid &&
|
||||||
|
pictureMonthIsValid &&
|
||||||
|
pictureDayIsValid &&
|
||||||
|
newFile &&
|
||||||
|
title !== "";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal show={props.shown} onHide={props.dismiss}>
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>{props.module.resources.AddImage}</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<Form.Group controlId="formFile" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.SelectJpg}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="file"
|
||||||
|
accept=".jpg"
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const file = e.target.files?.item(0);
|
||||||
|
if (file) {
|
||||||
|
setNewFile(file);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
isValid={newFile !== null}
|
||||||
|
isInvalid={newFile === null}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="title" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Title}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
value={title}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setTitle(e.target.value);
|
||||||
|
}}
|
||||||
|
isValid={title !== ""}
|
||||||
|
isInvalid={title === ""}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="description" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Description}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="textarea"
|
||||||
|
value={description}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
|
setDescription(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Visibility}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="select"
|
||||||
|
value={visibility}
|
||||||
|
onChange={(e) => {
|
||||||
|
setVisibility(parseInt(e.target.value));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<option value="0">{props.module.resources.Public}</option>
|
||||||
|
<option value="1">{props.module.resources.Friends}</option>
|
||||||
|
<option value="2">{props.module.resources.Private}</option>
|
||||||
|
</Form.Control>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Date}</Form.Label>
|
||||||
|
<div style={{ display: "flex" }}>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Year}
|
||||||
|
value={pictureYear}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureYear(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureYearIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Month}
|
||||||
|
value={pictureMonth}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureMonth(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureMonthIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Day}
|
||||||
|
value={pictureDay}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setPictureDay(e.target.value);
|
||||||
|
}}
|
||||||
|
isInvalid={!pictureDayIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Form.Group>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button
|
||||||
|
className="btn btn-secondary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Cancel}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
disabled={formIsValid === false}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
// Do something with newFile, title, description, and visibility
|
||||||
|
if (newFile !== null) {
|
||||||
|
props.module.service.createPicture(
|
||||||
|
newFile,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
visibility,
|
||||||
|
pictureYear === "" ? -1 : parseInt(pictureYear),
|
||||||
|
pictureMonth === "" ? -1 : parseInt(pictureMonth),
|
||||||
|
pictureDay === "" ? -1 : parseInt(pictureDay),
|
||||||
|
(newPicture: IPicture) => {
|
||||||
|
// Success
|
||||||
|
props.addNewPicture(newPicture);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
// Error
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Save}
|
||||||
|
</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NewImage;
|
||||||
86
Client/Js/InMemoriam/Components/InPictures/Picture.tsx
Normal file
86
Client/Js/InMemoriam/Components/InPictures/Picture.tsx
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IPicture } from "../../Models/IPicture";
|
||||||
|
import Icon from "@mdi/react";
|
||||||
|
import { mdiPencil } from "@mdi/js";
|
||||||
|
|
||||||
|
interface IPictureProps {
|
||||||
|
module: IAppModule;
|
||||||
|
picture: IPicture;
|
||||||
|
onEdit: (picture: IPicture) => void;
|
||||||
|
onClick: (picture: IPicture) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Picture: React.FC<IPictureProps> = (props) => {
|
||||||
|
const canEdit =
|
||||||
|
props.module.security.IsFamily ||
|
||||||
|
props.module.security.UserId === props.picture.CreatedByUserID;
|
||||||
|
|
||||||
|
let dt = "";
|
||||||
|
if (props.picture.PictureYear > 0) {
|
||||||
|
dt = props.picture.PictureYear.toString();
|
||||||
|
if (props.picture.PictureMonth > 0) {
|
||||||
|
const month = new Date(0, props.picture.PictureMonth - 1).toLocaleString(
|
||||||
|
undefined,
|
||||||
|
{ month: "long" }
|
||||||
|
);
|
||||||
|
dt = month + ", " + dt;
|
||||||
|
if (props.picture.PictureDay > 0) {
|
||||||
|
dt = props.picture.PictureDay.toString() + " " + dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dt = "(" + dt + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="picture"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
props.onClick(props.picture);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<img
|
||||||
|
src={
|
||||||
|
props.module.service.baseServicepath +
|
||||||
|
"Pictures/Get?id=" +
|
||||||
|
props.picture.ImageIdentifier +
|
||||||
|
"&width=200&height=200&method=c&moduleId=" +
|
||||||
|
props.module.moduleId +
|
||||||
|
"&tabId=" +
|
||||||
|
props.module.service.tabId
|
||||||
|
}
|
||||||
|
alt={props.picture.Title}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="w-100 text-body-secondary text-center text-small mt-1 overflow-hidden">
|
||||||
|
{props.picture.Title} <span className="date">{dt}</span>
|
||||||
|
</div>
|
||||||
|
<div className="footer mt-3">
|
||||||
|
<div>
|
||||||
|
<small>
|
||||||
|
<strong>by</strong> {props.picture.CreatedByUser}
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
<div className="buttons">
|
||||||
|
{canEdit && (
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="btn btn-sm"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
props.onEdit(props.picture);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon path={mdiPencil} size={0.5} />
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Picture;
|
||||||
107
Client/Js/InMemoriam/Components/InPictures/PictureOverlay.tsx
Normal file
107
Client/Js/InMemoriam/Components/InPictures/PictureOverlay.tsx
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IPicture } from "../../Models/IPicture";
|
||||||
|
|
||||||
|
interface IPictureOverlayProps {
|
||||||
|
module: IAppModule;
|
||||||
|
picture: IPicture;
|
||||||
|
hasNext: boolean;
|
||||||
|
hasPrevious: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
onNext: () => void;
|
||||||
|
onPrevious: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PictureOverlay: React.FC<IPictureOverlayProps> = (props) => {
|
||||||
|
let dt = "";
|
||||||
|
if (props.picture.PictureYear > 0) {
|
||||||
|
dt = props.picture.PictureYear.toString();
|
||||||
|
if (props.picture.PictureMonth > 0) {
|
||||||
|
const month = new Date(0, props.picture.PictureMonth - 1).toLocaleString(
|
||||||
|
undefined,
|
||||||
|
{ month: "long" }
|
||||||
|
);
|
||||||
|
dt = month + ", " + dt;
|
||||||
|
if (props.picture.PictureDay > 0) {
|
||||||
|
dt = props.picture.PictureDay.toString() + " " + dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="picture-overlay">
|
||||||
|
<div className="top">
|
||||||
|
<div className="title">{props.picture.Title}</div>
|
||||||
|
<div className="close" onClick={props.onClose}>
|
||||||
|
×
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="overlay-container">
|
||||||
|
<div className="picture">
|
||||||
|
<img
|
||||||
|
src={
|
||||||
|
props.module.service.baseServicepath +
|
||||||
|
"Pictures/Get?id=" +
|
||||||
|
props.picture.ImageIdentifier +
|
||||||
|
"&width=800&height=800&method=b&moduleId=" +
|
||||||
|
props.module.moduleId +
|
||||||
|
"&tabId=" +
|
||||||
|
props.module.service.tabId
|
||||||
|
}
|
||||||
|
alt={props.picture.Title}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="details">
|
||||||
|
<div className="data">
|
||||||
|
<strong>{props.module.resources.Created}:</strong>{" "}
|
||||||
|
{new Intl.DateTimeFormat(undefined, { dateStyle: "short" }).format(
|
||||||
|
new Date(props.picture.CreatedOnDate)
|
||||||
|
)}{" "}
|
||||||
|
<strong>{props.module.resources.By}</strong>{" "}
|
||||||
|
{props.picture.CreatedByUser}
|
||||||
|
</div>
|
||||||
|
{dt !== "" && (
|
||||||
|
<div className="data">
|
||||||
|
<strong>{props.module.resources.Date}:</strong> {dt}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="description">{props.picture.Description}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="bottom">
|
||||||
|
<div className="previous">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
disabled={!props.hasPrevious}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (props.hasPrevious) {
|
||||||
|
props.onPrevious();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
className="btn"
|
||||||
|
>
|
||||||
|
<
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="next">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
disabled={!props.hasNext}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (props.hasNext) {
|
||||||
|
props.onNext();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
className="btn"
|
||||||
|
>
|
||||||
|
>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PictureOverlay;
|
||||||
189
Client/Js/InMemoriam/Components/InStories/EditStory.tsx
Normal file
189
Client/Js/InMemoriam/Components/InStories/EditStory.tsx
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IStory, Story } from "../../Models/IStory";
|
||||||
|
import { Modal, Form } from "react-bootstrap";
|
||||||
|
|
||||||
|
interface IEditStoryProps {
|
||||||
|
module: IAppModule;
|
||||||
|
story: IStory;
|
||||||
|
shown: boolean;
|
||||||
|
dismiss: () => void;
|
||||||
|
editedStory: (editedStory: IStory | null) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const EditStory: React.FC<IEditStoryProps> = (props) => {
|
||||||
|
console.log(props.story);
|
||||||
|
const [title, setTitle] = React.useState(props.story.Title);
|
||||||
|
const [contents, setContents] = React.useState(props.story.Contents);
|
||||||
|
const [visibility, setVisibility] = React.useState(props.story.Visibility); // 0 = public, 1 = friends, 2 = private
|
||||||
|
const [storyYear, setStoryYear] = React.useState(
|
||||||
|
props.story.StoryYear < 1 ? "" : props.story.StoryYear.toString()
|
||||||
|
);
|
||||||
|
const [storyMonth, setStoryMonth] = React.useState(
|
||||||
|
props.story.StoryMonth < 1 ? "" : props.story.StoryMonth.toString()
|
||||||
|
);
|
||||||
|
const [storyDay, setStoryDay] = React.useState(
|
||||||
|
props.story.StoryDay < 1 ? "" : props.story.StoryDay.toString()
|
||||||
|
);
|
||||||
|
console.log(title);
|
||||||
|
|
||||||
|
const clearFormAndDismiss = () => {
|
||||||
|
setTitle("");
|
||||||
|
setContents("");
|
||||||
|
setVisibility(1);
|
||||||
|
setStoryYear("");
|
||||||
|
setStoryMonth("");
|
||||||
|
setStoryDay("");
|
||||||
|
props.dismiss();
|
||||||
|
};
|
||||||
|
|
||||||
|
const storyYearIsValid = storyYear.length === 0 || /^\d{4}$/.test(storyYear);
|
||||||
|
const storyMonthIsValid =
|
||||||
|
storyMonth.length === 0 || /^\d{1,2}$/.test(storyMonth);
|
||||||
|
const storyDayIsValid = storyDay.length === 0 || /^\d{1,2}$/.test(storyDay);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal show={props.shown} onHide={props.dismiss} size="lg">
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>{props.module.resources.EditStory}</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<Form>
|
||||||
|
<Form.Group controlId="title" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Title}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
value={title}
|
||||||
|
onChange={(e) => setTitle(e.target.value)}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="contents" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Contents}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="textarea"
|
||||||
|
value={contents}
|
||||||
|
rows={10}
|
||||||
|
onChange={(e) => setContents(e.target.value)}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Visibility}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="select"
|
||||||
|
value={visibility}
|
||||||
|
onChange={(e) => setVisibility(parseInt(e.target.value))}
|
||||||
|
>
|
||||||
|
<option value="0">{props.module.resources.Public}</option>
|
||||||
|
<option value="1">{props.module.resources.Friends}</option>
|
||||||
|
<option value="2">{props.module.resources.Private}</option>
|
||||||
|
</Form.Control>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="visibility" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Date}</Form.Label>
|
||||||
|
<div style={{ display: "flex" }}>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Year}
|
||||||
|
value={storyYear}
|
||||||
|
onChange={(e) => setStoryYear(e.target.value)}
|
||||||
|
isInvalid={!storyYearIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Month}
|
||||||
|
value={storyMonth}
|
||||||
|
onChange={(e) => setStoryMonth(e.target.value)}
|
||||||
|
isInvalid={!storyMonthIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{" "}
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
placeholder={props.module.resources.Day}
|
||||||
|
value={storyDay}
|
||||||
|
onChange={(e) => setStoryDay(e.target.value)}
|
||||||
|
isInvalid={!storyDayIsValid}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Form.Group>
|
||||||
|
</Form>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button
|
||||||
|
className="btn"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Cancel}
|
||||||
|
</button>
|
||||||
|
{props.story && props.story.StoryId !== -1 && (
|
||||||
|
<button
|
||||||
|
className="btn btn-danger"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (confirm(props.module.resources.DeleteConfirm) === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
props.module.service.deleteStory(
|
||||||
|
(props.story as IStory).StoryId,
|
||||||
|
() => {
|
||||||
|
// Success
|
||||||
|
props.editedStory(null);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
// Error
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Delete}
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
onClick={() => {
|
||||||
|
if (storyYearIsValid && storyMonthIsValid && storyDayIsValid) {
|
||||||
|
const story = {
|
||||||
|
...new Story(),
|
||||||
|
StoryId: props.story ? props.story.StoryId : -1,
|
||||||
|
Title: title,
|
||||||
|
Contents: contents,
|
||||||
|
Visibility: visibility,
|
||||||
|
StoryYear: storyYear.length === 0 ? 0 : parseInt(storyYear),
|
||||||
|
StoryMonth: storyMonth.length === 0 ? 0 : parseInt(storyMonth),
|
||||||
|
StoryDay: storyDay.length === 0 ? 0 : parseInt(storyDay),
|
||||||
|
};
|
||||||
|
props.module.service.editStory(
|
||||||
|
story,
|
||||||
|
(editedStory: IStory) => {
|
||||||
|
props.editedStory(editedStory);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Save}
|
||||||
|
</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EditStory;
|
||||||
84
Client/Js/InMemoriam/Components/InStories/InStoriesPage.tsx
Normal file
84
Client/Js/InMemoriam/Components/InStories/InStoriesPage.tsx
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IStory, Story as NewStory } from "../../Models/IStory";
|
||||||
|
import Story from "./Story";
|
||||||
|
import EditStory from "./EditStory";
|
||||||
|
|
||||||
|
interface IInStoriesPageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
}
|
||||||
|
|
||||||
|
const InStoriesPage: React.FC<IInStoriesPageProps> = (props) => {
|
||||||
|
const [showEditStory, setShowEditStory] = React.useState(false);
|
||||||
|
const [stories, setStories] = React.useState<IStory[]>([]);
|
||||||
|
const [storyInEdit, setStoryInEdit] = React.useState<IStory | null>(null);
|
||||||
|
|
||||||
|
const getStories = () => {
|
||||||
|
props.module.service.getStories(
|
||||||
|
(data) => {
|
||||||
|
setStories(data);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
getStories();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setShowEditStory(storyInEdit !== null);
|
||||||
|
}, [storyInEdit]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div className="d-flex flex-row-reverse mb-4">
|
||||||
|
{props.module.security.CanAdd && (
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
setStoryInEdit(new NewStory());
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Add}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="stories">
|
||||||
|
{stories.map((story, index) => {
|
||||||
|
return (
|
||||||
|
<Story
|
||||||
|
key={index}
|
||||||
|
module={props.module}
|
||||||
|
story={story}
|
||||||
|
onEdit={(story) => {
|
||||||
|
setStoryInEdit(story);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
{storyInEdit && (
|
||||||
|
<EditStory
|
||||||
|
module={props.module}
|
||||||
|
shown={showEditStory}
|
||||||
|
story={storyInEdit}
|
||||||
|
editedStory={(story) => {
|
||||||
|
setStoryInEdit(null);
|
||||||
|
getStories();
|
||||||
|
}}
|
||||||
|
dismiss={() => {
|
||||||
|
setStoryInEdit(null);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default InStoriesPage;
|
||||||
72
Client/Js/InMemoriam/Components/InStories/Story.tsx
Normal file
72
Client/Js/InMemoriam/Components/InStories/Story.tsx
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IStory } from "../../Models/IStory";
|
||||||
|
import Icon from "@mdi/react";
|
||||||
|
import { mdiPencil } from "@mdi/js";
|
||||||
|
import SanitizedHTML from "react-sanitized-html";
|
||||||
|
|
||||||
|
interface IStoryProps {
|
||||||
|
module: IAppModule;
|
||||||
|
story: IStory;
|
||||||
|
onEdit: (story: IStory) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Story: React.FC<IStoryProps> = (props) => {
|
||||||
|
const canEdit =
|
||||||
|
props.module.security.IsFamily ||
|
||||||
|
props.module.security.UserId === props.story.CreatedByUserID;
|
||||||
|
|
||||||
|
let dt = "";
|
||||||
|
if (props.story.StoryYear > 0) {
|
||||||
|
dt = props.story.StoryYear.toString();
|
||||||
|
if (props.story.StoryMonth > 0) {
|
||||||
|
const month = new Date(0, props.story.StoryMonth - 1).toLocaleString(
|
||||||
|
undefined,
|
||||||
|
{ month: "long" }
|
||||||
|
);
|
||||||
|
dt = month + ", " + dt;
|
||||||
|
if (props.story.StoryDay > 0) {
|
||||||
|
dt = props.story.StoryDay.toString() + " " + dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dt = "(" + dt + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="story mb-4">
|
||||||
|
<div className="title">
|
||||||
|
{props.story.Title} <span className="date">{dt}</span>
|
||||||
|
</div>
|
||||||
|
<div className="content">
|
||||||
|
<SanitizedHTML html={props.story.Contents.replace(/\n/g, "<br />")} />
|
||||||
|
</div>
|
||||||
|
<div className="footer mt-3">
|
||||||
|
<div>
|
||||||
|
<small>
|
||||||
|
<strong>Created:</strong>{" "}
|
||||||
|
{new Intl.DateTimeFormat(undefined, { dateStyle: "short" }).format(
|
||||||
|
new Date(props.story.CreatedOnDate)
|
||||||
|
)}{" "}
|
||||||
|
<strong>by</strong> {props.story.CreatedByUser}
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
<div className="buttons">
|
||||||
|
{canEdit && (
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="btn btn-sm"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
props.onEdit(props.story);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon path={mdiPencil} size={0.5} />
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Story;
|
||||||
113
Client/Js/InMemoriam/Components/Messages/CreateMessage.tsx
Normal file
113
Client/Js/InMemoriam/Components/Messages/CreateMessage.tsx
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IMessage, Message } from "../../Models/IMessage";
|
||||||
|
import { Modal, Form } from "react-bootstrap";
|
||||||
|
|
||||||
|
interface ICreateMessageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
shown: boolean;
|
||||||
|
dismiss: () => void;
|
||||||
|
addNewMessage: (newMessage: IMessage) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CreateMessage: React.FC<ICreateMessageProps> = (props) => {
|
||||||
|
const [contents, setContents] = React.useState("");
|
||||||
|
const [senderName, setSenderName] = React.useState("");
|
||||||
|
const [senderEmail, setSenderEmail] = React.useState("");
|
||||||
|
|
||||||
|
const clearFormAndDismiss = () => {
|
||||||
|
setContents("");
|
||||||
|
setSenderName("");
|
||||||
|
setSenderEmail("");
|
||||||
|
props.dismiss();
|
||||||
|
};
|
||||||
|
|
||||||
|
const contentsIsValid = contents.trim() !== "";
|
||||||
|
const senderNameIsValid = senderName.trim() !== "";
|
||||||
|
const formIsValid = contentsIsValid && senderNameIsValid;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal show={props.shown} onHide={props.dismiss}>
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>{props.module.resources.AddMessage}</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<Form.Group controlId="contents" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.Contents}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
as="textarea"
|
||||||
|
value={contents}
|
||||||
|
isInvalid={!contentsIsValid}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
|
setContents(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="senderName" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.SenderName}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="text"
|
||||||
|
value={senderName}
|
||||||
|
isInvalid={!senderNameIsValid}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setSenderName(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group controlId="senderEmail" className="mb-3">
|
||||||
|
<Form.Label>{props.module.resources.SenderEmail}</Form.Label>
|
||||||
|
<Form.Control
|
||||||
|
type="email"
|
||||||
|
value={senderEmail}
|
||||||
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setSenderEmail(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Group>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button
|
||||||
|
className="btn btn-secondary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Cancel}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
disabled={formIsValid === false}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
// Do something with newFile, title, description, and visibility
|
||||||
|
const newMessage = {
|
||||||
|
...new Message(),
|
||||||
|
Contents: contents.trim(),
|
||||||
|
SenderName: senderName.trim(),
|
||||||
|
SenderEmail: senderEmail.trim(),
|
||||||
|
};
|
||||||
|
props.module.service.addMessage(
|
||||||
|
newMessage,
|
||||||
|
(newMessage: IMessage) => {
|
||||||
|
// Success
|
||||||
|
props.addNewMessage(newMessage);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
},
|
||||||
|
(error: string) => {
|
||||||
|
// Error
|
||||||
|
alert(error);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
clearFormAndDismiss();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Save}
|
||||||
|
</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CreateMessage;
|
||||||
60
Client/Js/InMemoriam/Components/Messages/Message.tsx
Normal file
60
Client/Js/InMemoriam/Components/Messages/Message.tsx
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IMessage } from "../../Models/IMessage";
|
||||||
|
import SanitizedHTML from "react-sanitized-html";
|
||||||
|
import Icon from "@mdi/react";
|
||||||
|
import { mdiDeleteForever } from "@mdi/js";
|
||||||
|
|
||||||
|
interface IMessageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
message: IMessage;
|
||||||
|
onDelete: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Message: React.FC<IMessageProps> = (props) => {
|
||||||
|
return (
|
||||||
|
<div className="message">
|
||||||
|
<div className="content">
|
||||||
|
<SanitizedHTML html={props.message.Contents.replace(/\n/g, "<br />")} />
|
||||||
|
</div>
|
||||||
|
<div className="footer mt-3">
|
||||||
|
<div>
|
||||||
|
<small>
|
||||||
|
<strong>Created:</strong>{" "}
|
||||||
|
{new Intl.DateTimeFormat(undefined, { dateStyle: "short" }).format(
|
||||||
|
new Date(props.message.CreatedOn)
|
||||||
|
)}{" "}
|
||||||
|
<strong>by</strong> {props.message.SenderName}
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
{props.module.security.IsFamily && (
|
||||||
|
<div className="buttons">
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="btn btn-sm"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (confirm(props.module.resources.DeleteConfirm)) {
|
||||||
|
props.module.service.deleteMessage(
|
||||||
|
props.message.MessageId,
|
||||||
|
() => {
|
||||||
|
props.onDelete();
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.error(error);
|
||||||
|
props.onDelete();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon path={mdiDeleteForever} size={1} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Message;
|
||||||
73
Client/Js/InMemoriam/Components/Messages/MessagesPage.tsx
Normal file
73
Client/Js/InMemoriam/Components/Messages/MessagesPage.tsx
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { IAppModule } from "../../Models/IAppModule";
|
||||||
|
import { IMessage } from "../../Models/IMessage";
|
||||||
|
import Message from "./Message";
|
||||||
|
import CreateMessage from "./CreateMessage";
|
||||||
|
|
||||||
|
interface IMessagesPageProps {
|
||||||
|
module: IAppModule;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MessagesPage: React.FC<IMessagesPageProps> = (props) => {
|
||||||
|
const [messages, setMessages] = React.useState<IMessage[]>([]);
|
||||||
|
const [showAddMessage, setShowAddMessage] = React.useState(false);
|
||||||
|
|
||||||
|
const refreshMessages = () => {
|
||||||
|
props.module.service.getMessages(
|
||||||
|
(data) => {
|
||||||
|
setMessages(data);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
refreshMessages();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div className="d-flex flex-row-reverse mb-4">
|
||||||
|
{props.module.security.CanMessage && (
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
setShowAddMessage(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.module.resources.Add}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="messages">
|
||||||
|
{messages.map((message) => (
|
||||||
|
<Message
|
||||||
|
key={message.MessageId}
|
||||||
|
message={message}
|
||||||
|
module={props.module}
|
||||||
|
onDelete={() => {
|
||||||
|
setMessages(messages.filter((m) => m.MessageId !== message.MessageId));
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{showAddMessage && (
|
||||||
|
<CreateMessage
|
||||||
|
module={props.module}
|
||||||
|
shown={showAddMessage}
|
||||||
|
dismiss={() => setShowAddMessage(false)}
|
||||||
|
addNewMessage={(message) => {
|
||||||
|
setMessages([message, ...messages]);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MessagesPage;
|
||||||
35
Client/Js/InMemoriam/LinkState.ts
Normal file
35
Client/Js/InMemoriam/LinkState.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { Utils } from "./Utils";
|
||||||
|
|
||||||
|
function createHandler(
|
||||||
|
component: any,
|
||||||
|
key: string,
|
||||||
|
property: string,
|
||||||
|
type?: string
|
||||||
|
) {
|
||||||
|
return (e: any) => {
|
||||||
|
const el: any = e.target;
|
||||||
|
var value: any = el.type === "checkbox" ? el.checked : el.value;
|
||||||
|
if (type) {
|
||||||
|
switch (type) {
|
||||||
|
case "int":
|
||||||
|
if (value != "" && !Utils.isInt(value)) return;
|
||||||
|
if (value != "") value = parseInt(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var obj = component.state[key];
|
||||||
|
obj[property] = value;
|
||||||
|
component.setState({
|
||||||
|
[key]: obj
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function linkState(
|
||||||
|
component: any,
|
||||||
|
key: string,
|
||||||
|
property: string,
|
||||||
|
type?: string
|
||||||
|
) {
|
||||||
|
return createHandler(component, key, property, type);
|
||||||
|
}
|
||||||
|
|
||||||
31
Client/Js/InMemoriam/Models/IAppModule.ts
Normal file
31
Client/Js/InMemoriam/Models/IAppModule.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import DataService from "../Service";
|
||||||
|
import { IContextSecurity } from "./IContextSecurity";
|
||||||
|
|
||||||
|
export interface IAppModule {
|
||||||
|
moduleId: number;
|
||||||
|
tabId: number;
|
||||||
|
locale: string;
|
||||||
|
resources: any;
|
||||||
|
common: any;
|
||||||
|
security: IContextSecurity;
|
||||||
|
service: DataService;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AppModule implements IAppModule {
|
||||||
|
public moduleId: number;
|
||||||
|
public tabId: number;
|
||||||
|
public locale: string;
|
||||||
|
public resources: any;
|
||||||
|
public common: any;
|
||||||
|
public security: IContextSecurity;
|
||||||
|
public service: DataService;
|
||||||
|
constructor(moduleId: number, tabId: number, locale: string, resources: any, common: any, security: IContextSecurity, service: DataService) {
|
||||||
|
this.moduleId = moduleId;
|
||||||
|
this.tabId = tabId;
|
||||||
|
this.locale = locale;
|
||||||
|
this.resources = resources;
|
||||||
|
this.common = common;
|
||||||
|
this.security = security;
|
||||||
|
this.service = service;
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Client/Js/InMemoriam/Models/IContextSecurity.ts
Normal file
9
Client/Js/InMemoriam/Models/IContextSecurity.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export interface IContextSecurity {
|
||||||
|
UserId: number;
|
||||||
|
CanView: boolean;
|
||||||
|
CanEdit: boolean;
|
||||||
|
CanAdd: boolean;
|
||||||
|
CanMessage: boolean;
|
||||||
|
IsFamily: boolean;
|
||||||
|
IsAdmin: boolean;
|
||||||
|
}
|
||||||
62
Client/Js/InMemoriam/Models/IKeyedCollection.ts
Normal file
62
Client/Js/InMemoriam/Models/IKeyedCollection.ts
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
export interface IKeyedCollection<T> {
|
||||||
|
Add(key: string, value: T): void;
|
||||||
|
ContainsKey(key: string): boolean;
|
||||||
|
Count(): number;
|
||||||
|
Item(key: string): T;
|
||||||
|
Keys(): string[];
|
||||||
|
Remove(key: string): T;
|
||||||
|
Values(): T[];
|
||||||
|
}
|
||||||
|
export class KeyedCollection<T> implements IKeyedCollection<T> {
|
||||||
|
private items: { [index: string]: T } = {};
|
||||||
|
|
||||||
|
private count: number = 0;
|
||||||
|
|
||||||
|
public ContainsKey(key: string): boolean {
|
||||||
|
return this.items.hasOwnProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Count(): number {
|
||||||
|
return this.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Add(key: string, value: T) {
|
||||||
|
this.items[key] = value;
|
||||||
|
this.count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Remove(key: string): T {
|
||||||
|
var val = this.items[key];
|
||||||
|
delete this.items[key];
|
||||||
|
this.count--;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item(key: string): T {
|
||||||
|
return this.items[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Keys(): string[] {
|
||||||
|
var keySet: string[] = [];
|
||||||
|
|
||||||
|
for (var prop in this.items) {
|
||||||
|
if (this.items.hasOwnProperty(prop)) {
|
||||||
|
keySet.push(prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return keySet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Values(): T[] {
|
||||||
|
var values: T[] = [];
|
||||||
|
|
||||||
|
for (var prop in this.items) {
|
||||||
|
if (this.items.hasOwnProperty(prop)) {
|
||||||
|
values.push(this.items[prop]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
Client/Js/InMemoriam/Models/IMessage.ts
Normal file
24
Client/Js/InMemoriam/Models/IMessage.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
export interface IMessage {
|
||||||
|
MessageId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
Contents: string;
|
||||||
|
SenderName: string;
|
||||||
|
SenderEmail: string;
|
||||||
|
CreatedOn: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Message implements IMessage {
|
||||||
|
MessageId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
Contents: string;
|
||||||
|
SenderName: string;
|
||||||
|
SenderEmail: string;
|
||||||
|
CreatedOn: Date;
|
||||||
|
constructor() {
|
||||||
|
this.MessageId = -1;
|
||||||
|
this.ModuleId = -1;
|
||||||
|
this.Contents = "";
|
||||||
|
this.CreatedOn = new Date();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
56
Client/Js/InMemoriam/Models/IPicture.ts
Normal file
56
Client/Js/InMemoriam/Models/IPicture.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
export interface IPicture {
|
||||||
|
PictureId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
ImageIdentifier: any;
|
||||||
|
OriginalWidth: number;
|
||||||
|
OriginalHeight: number;
|
||||||
|
OriginalName: string;
|
||||||
|
Title: string;
|
||||||
|
Description: string;
|
||||||
|
PictureYear: number;
|
||||||
|
PictureMonth: number;
|
||||||
|
PictureDay: number;
|
||||||
|
Visibility: number;
|
||||||
|
CreatedByUserID: number;
|
||||||
|
CreatedOnDate: Date;
|
||||||
|
LastModifiedByUserID: number;
|
||||||
|
LastModifiedOnDate: Date;
|
||||||
|
CreatedByUser: string;
|
||||||
|
LastModifiedByUser: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Picture implements IPicture {
|
||||||
|
PictureId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
ImageIdentifier: any;
|
||||||
|
OriginalWidth: number;
|
||||||
|
OriginalHeight: number;
|
||||||
|
OriginalName: string;
|
||||||
|
Title: string;
|
||||||
|
Description: string;
|
||||||
|
PictureYear: number;
|
||||||
|
PictureMonth: number;
|
||||||
|
PictureDay: number;
|
||||||
|
Visibility: number;
|
||||||
|
CreatedByUserID: number;
|
||||||
|
CreatedOnDate: Date;
|
||||||
|
LastModifiedByUserID: number;
|
||||||
|
LastModifiedOnDate: Date;
|
||||||
|
CreatedByUser: string;
|
||||||
|
LastModifiedByUser: string;
|
||||||
|
constructor() {
|
||||||
|
this.PictureId = -1;
|
||||||
|
this.ModuleId = -1;
|
||||||
|
this.OriginalWidth = -1;
|
||||||
|
this.OriginalHeight = -1;
|
||||||
|
this.PictureYear = -1;
|
||||||
|
this.PictureMonth = -1;
|
||||||
|
this.PictureDay = -1;
|
||||||
|
this.Visibility = -1;
|
||||||
|
this.CreatedByUserID = -1;
|
||||||
|
this.CreatedOnDate = new Date();
|
||||||
|
this.LastModifiedByUserID = -1;
|
||||||
|
this.LastModifiedOnDate = new Date();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
45
Client/Js/InMemoriam/Models/IStory.ts
Normal file
45
Client/Js/InMemoriam/Models/IStory.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
export interface IStory {
|
||||||
|
StoryId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
Title: string;
|
||||||
|
Contents: string;
|
||||||
|
StoryYear: number;
|
||||||
|
StoryMonth: number;
|
||||||
|
StoryDay: number;
|
||||||
|
Visibility: number;
|
||||||
|
CreatedByUserID: number;
|
||||||
|
CreatedOnDate: Date;
|
||||||
|
LastModifiedByUserID: number;
|
||||||
|
LastModifiedOnDate: Date;
|
||||||
|
CreatedByUser: string;
|
||||||
|
LastModifiedByUser: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Story implements IStory {
|
||||||
|
StoryId: number;
|
||||||
|
ModuleId: number;
|
||||||
|
Title: string;
|
||||||
|
Contents: string;
|
||||||
|
StoryYear: number;
|
||||||
|
StoryMonth: number;
|
||||||
|
StoryDay: number;
|
||||||
|
Visibility: number;
|
||||||
|
CreatedByUserID: number;
|
||||||
|
CreatedOnDate: Date;
|
||||||
|
LastModifiedByUserID: number;
|
||||||
|
LastModifiedOnDate: Date;
|
||||||
|
CreatedByUser: string;
|
||||||
|
LastModifiedByUser: string;
|
||||||
|
constructor() {
|
||||||
|
this.StoryId = -1;
|
||||||
|
this.ModuleId = -1;
|
||||||
|
this.StoryYear = -1;
|
||||||
|
this.StoryMonth = -1;
|
||||||
|
this.StoryDay = -1;
|
||||||
|
this.Visibility = -1;
|
||||||
|
this.CreatedByUserID = -1;
|
||||||
|
this.CreatedOnDate = new Date();
|
||||||
|
this.LastModifiedByUserID = -1;
|
||||||
|
this.LastModifiedOnDate = new Date();
|
||||||
|
}
|
||||||
|
}
|
||||||
90
Client/Js/InMemoriam/Service.ts
Normal file
90
Client/Js/InMemoriam/Service.ts
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import { IMessage } from "./Models/IMessage";
|
||||||
|
import { IPicture } from "./Models/IPicture";
|
||||||
|
import { IStory } from "./Models/IStory";
|
||||||
|
|
||||||
|
export interface DnnServiceFramework extends JQueryStatic {
|
||||||
|
dnnSF(moduleId: number): DnnServiceFramework;
|
||||||
|
getServiceRoot(path: string): string;
|
||||||
|
setModuleHeaders(): void;
|
||||||
|
getTabId(): string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class DataService {
|
||||||
|
private moduleId: number = -1;
|
||||||
|
private dnn: DnnServiceFramework = <DnnServiceFramework>$;
|
||||||
|
public baseServicepath: string = this.dnn.dnnSF(this.moduleId).getServiceRoot('Bring2mind/InMemoriam');
|
||||||
|
public tabId: string = this.dnn.dnnSF(this.moduleId).getTabId();
|
||||||
|
constructor(mid: number) {
|
||||||
|
this.moduleId = mid;
|
||||||
|
};
|
||||||
|
private ajaxCall(type: string, servicePath: string, controller: string, action: string, id: any, headers: any, data: any, success: Function, fail?: Function, isUploadForm?: boolean)
|
||||||
|
: void {
|
||||||
|
var opts: JQuery.AjaxSettings = {
|
||||||
|
headers: headers,
|
||||||
|
type: type === "POSTFORM" ? "POST": type,
|
||||||
|
url: servicePath + controller + '/' + action + (id != undefined
|
||||||
|
? '/' + id
|
||||||
|
: ''),
|
||||||
|
beforeSend: this
|
||||||
|
.dnn
|
||||||
|
.dnnSF(this.moduleId)
|
||||||
|
.setModuleHeaders,
|
||||||
|
contentType: type === "POSTFORM" ? undefined : "application/json; charset=utf-8",
|
||||||
|
data: type == "POST" ? JSON.stringify(data) : data,
|
||||||
|
dataType: "json"
|
||||||
|
};
|
||||||
|
if (isUploadForm) {
|
||||||
|
opts.contentType = false;
|
||||||
|
opts.processData = false;
|
||||||
|
}
|
||||||
|
$.ajax(opts)
|
||||||
|
.done(function (retdata: any) {
|
||||||
|
if (success != undefined) {
|
||||||
|
success(retdata);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function (xhr: any, status: any) {
|
||||||
|
if (fail != undefined) {
|
||||||
|
fail(xhr.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
public deletePicture(pictureId: number, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Pictures', 'DeletePicture', pictureId, null, null, success, fail);
|
||||||
|
}
|
||||||
|
public editPicture(picture: IPicture, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Pictures', 'EditPicture', picture.PictureId, null, picture, success, fail, true)
|
||||||
|
}
|
||||||
|
public getPictures(success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('GET', this.baseServicepath, 'Pictures', 'GetPictures', null, null, null, success, fail);
|
||||||
|
}
|
||||||
|
public createPicture(file: File, title: string, description: string, visibility: number, pictureYear: number, pictureMonth: number, pictureDay: number, success: Function, fail: Function): void {
|
||||||
|
var formData = new FormData();
|
||||||
|
formData.append('file', file);
|
||||||
|
formData.append('title', title);
|
||||||
|
formData.append('description', description);
|
||||||
|
formData.append('visibility', visibility.toString());
|
||||||
|
formData.append('pictureYear', pictureYear.toString());
|
||||||
|
formData.append('pictureMonth', pictureMonth.toString());
|
||||||
|
formData.append('pictureDay', pictureDay.toString());
|
||||||
|
this.ajaxCall('POSTFORM', this.baseServicepath, 'Pictures', 'UploadPicture', null, null, formData, success, fail, true)
|
||||||
|
}
|
||||||
|
public getStories(success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('GET', this.baseServicepath, 'Stories', 'GetStories', null, null, null, success, fail);
|
||||||
|
}
|
||||||
|
public editStory(story: IStory, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Stories', 'EditStory', story.StoryId, null, story, success, fail, true)
|
||||||
|
}
|
||||||
|
public deleteStory(storyId: number, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Stories', 'DeleteStory', storyId, null, null, success, fail);
|
||||||
|
}
|
||||||
|
public addMessage(message: IMessage, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Messages', 'AddMessage', -1, null, message, success, fail, true)
|
||||||
|
}
|
||||||
|
public getMessages(success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('GET', this.baseServicepath, 'Messages', 'GetMessages', null, null, null, success, fail);
|
||||||
|
}
|
||||||
|
public deleteMessage(messageId: number, success: Function, fail: Function): void {
|
||||||
|
this.ajaxCall('POST', this.baseServicepath, 'Messages', 'DeleteMessage', messageId, null, null, success, fail);
|
||||||
|
}
|
||||||
|
}
|
||||||
69
Client/Js/InMemoriam/Utils.ts
Normal file
69
Client/Js/InMemoriam/Utils.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
export class Utils {
|
||||||
|
public static UnNull(input: Date | undefined, defaultValue: Date): Date {
|
||||||
|
if (input == undefined) {
|
||||||
|
return defaultValue;
|
||||||
|
} else {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static Merge(input: any, mergeObject: any, property: string): void {
|
||||||
|
if (input[property] == undefined) {
|
||||||
|
input[property] = mergeObject[property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static ArraySort(array: any[], sortProperty: string, sortDirection: string): any[] {
|
||||||
|
var res = array;
|
||||||
|
if (sortDirection == "asc") {
|
||||||
|
res.sort((a, b) => {
|
||||||
|
return a[sortProperty] > b[sortProperty] ? 1 : b[sortProperty] > a[sortProperty] ? -1 : 0;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.sort((a, b) => {
|
||||||
|
return a[sortProperty] > b[sortProperty] ? -1 : b[sortProperty] > a[sortProperty] ? 1 : 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
public static ArrayContains(
|
||||||
|
array: any[],
|
||||||
|
propertyName: string | null,
|
||||||
|
propertyValue: any
|
||||||
|
): boolean {
|
||||||
|
if (propertyName) {
|
||||||
|
for (var i = 0; i < array.length; i++) {
|
||||||
|
if (array[i][propertyName] == propertyValue) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < array.length; i++) {
|
||||||
|
if (array[i] == propertyValue) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public static UnNullStr(input: any): string {
|
||||||
|
if (input) return input;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
public static isInt(value: any): boolean {
|
||||||
|
return (
|
||||||
|
!isNaN(value) && parseInt(Number(value).toString()) == value && !isNaN(parseInt(value, 10))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
public static Round(value: number, decimals: number) {
|
||||||
|
switch (decimals) {
|
||||||
|
case 0:
|
||||||
|
return Math.round(value);
|
||||||
|
case 1:
|
||||||
|
return Math.round(value * 10) / 10;
|
||||||
|
case 2:
|
||||||
|
return Math.round(value * 100) / 100;
|
||||||
|
default:
|
||||||
|
var m = Math.pow(10, decimals);
|
||||||
|
return Math.round(value * m) / m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
22
Client/Js/InMemoriam/tsconfig.json
Normal file
22
Client/Js/InMemoriam/tsconfig.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es2015",
|
||||||
|
"module": "esnext",
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"sourceMap": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"esModuleInterop": false,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": false,
|
||||||
|
"noEmit": false
|
||||||
|
},
|
||||||
|
"include": ["**/*.ts", "**/*.tsx"],
|
||||||
|
"exclude": ["node_modules", "dist"],
|
||||||
|
"typeRoots": ["node_modules/@types", "Types"]
|
||||||
|
}
|
||||||
20
Client/Js/InMemoriam/webpack.config.js
Normal file
20
Client/Js/InMemoriam/webpack.config.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
var path = require("path"),
|
||||||
|
commonConfig = require("../../webpack.common.config");
|
||||||
|
|
||||||
|
var clientAppConfig = Object.assign({}, commonConfig, {
|
||||||
|
context: path.join(__dirname, "."),
|
||||||
|
entry: "./App.tsx",
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, "../../../Server/InMemoriam/js"),
|
||||||
|
filename: "inmemoriam.js"
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
extensions: [".js", ".ts", ".tsx"],
|
||||||
|
mainFields: ["module", "browser", "main"],
|
||||||
|
alias: {
|
||||||
|
app: path.resolve(__dirname, "src/app/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = clientAppConfig;
|
||||||
69
Client/webpack.common.config.js
Normal file
69
Client/webpack.common.config.js
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
var path = require("path"),
|
||||||
|
webpack = require("webpack"),
|
||||||
|
MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
|
|
||||||
|
var isProduction =
|
||||||
|
process.argv.indexOf("-p") >= 0 || process.env.NODE_ENV === "production";
|
||||||
|
var sourcePath = path.join(__dirname, ".");
|
||||||
|
|
||||||
|
var commonConfig = {
|
||||||
|
context: sourcePath,
|
||||||
|
target: "web",
|
||||||
|
mode: isProduction ? "production" : "development",
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.tsx?$/,
|
||||||
|
exclude: [/node_modules/, /_Development/],
|
||||||
|
use: {
|
||||||
|
loader: "ts-loader",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /.jsx?$/,
|
||||||
|
exclude: [/node_modules/, /_Development/],
|
||||||
|
use: {
|
||||||
|
loader: "babel-loader",
|
||||||
|
options: {
|
||||||
|
presets: ["@babel/preset-env", "@babel/preset-react"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(sa|sc|c)ss$/,
|
||||||
|
use: [
|
||||||
|
!isProduction ? "style-loader" : MiniCssExtractPlugin.loader,
|
||||||
|
"css-loader",
|
||||||
|
"postcss-loader",
|
||||||
|
"sass-loader",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(jpe?g|png|gif|svg)$/,
|
||||||
|
loader: "file-loader",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
externals: {
|
||||||
|
jquery: "jQuery",
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.EnvironmentPlugin({
|
||||||
|
NODE_ENV: "development", // use 'development' unless process.env.NODE_ENV is defined
|
||||||
|
DEBUG: false,
|
||||||
|
}),
|
||||||
|
new webpack.ProvidePlugin({
|
||||||
|
$: "jquery",
|
||||||
|
jQuery: "jquery",
|
||||||
|
"window.jQuery": "jquery",
|
||||||
|
}),
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
// Options similar to the same options in webpackOptions.output
|
||||||
|
// both options are optional
|
||||||
|
filename: "../module.css",
|
||||||
|
chunkFilename: "[id].css",
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = commonConfig;
|
||||||
6
Client/webpack.config.js
Normal file
6
Client/webpack.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
var InMemoriamAppConfigSkinCss = require("./Css/InMemoriam/webpack.config");
|
||||||
|
var InMemoriamAppConfigReact = require("./Js/InMemoriam/webpack.config");
|
||||||
|
module.exports = [
|
||||||
|
InMemoriamAppConfigSkinCss,
|
||||||
|
InMemoriamAppConfigReact,
|
||||||
|
];
|
||||||
10
License.md
Normal file
10
License.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Copyright (c) 2025 Bring2mind, All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
29
Server/Core/Bring2mind.InMemoriam.Core.csproj
Normal file
29
Server/Core/Bring2mind.InMemoriam.Core.csproj
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<AssemblyName>Bring2mind.InMemoriam.Core</AssemblyName>
|
||||||
|
<TargetFramework>net472</TargetFramework>
|
||||||
|
<OutputPath>..\..\bin</OutputPath>
|
||||||
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
||||||
|
<Authors>Peter Donker</Authors>
|
||||||
|
<Company>Bring2mind</Company>
|
||||||
|
<Product>inmemoriam</Product>
|
||||||
|
<Copyright>Copyright 2025 by Bring2mind</Copyright>
|
||||||
|
<PackageId>InMemoriam</PackageId>
|
||||||
|
<AssemblyVersion>1.0.2</AssemblyVersion>
|
||||||
|
<FileVersion>1.0.2</FileVersion>
|
||||||
|
<Description>In Memoriam module</Description>
|
||||||
|
<NeutralLanguage>en-US</NeutralLanguage>
|
||||||
|
<ApplicationIcon />
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<StartupObject />
|
||||||
|
<DebugType>Portable</DebugType>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="DotNetNuke.Core" Version="9.13.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
7
Server/Core/Common/Globals.cs
Normal file
7
Server/Core/Common/Globals.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Bring2mind.InMemoriam.Core.Common
|
||||||
|
{
|
||||||
|
public static class Globals
|
||||||
|
{
|
||||||
|
public const string uploadPath = @"InMemoriam\Pictures";
|
||||||
|
}
|
||||||
|
}
|
||||||
43
Server/Core/Common/Image.cs
Normal file
43
Server/Core/Common/Image.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Common
|
||||||
|
{
|
||||||
|
public class Image
|
||||||
|
{
|
||||||
|
public string ResizedFile { get; set; }
|
||||||
|
public bool ImageExists { get; set; }
|
||||||
|
private string Location { get; set; }
|
||||||
|
|
||||||
|
public Image(string location, string id, int width, int height, string method)
|
||||||
|
{
|
||||||
|
Location = location;
|
||||||
|
var filePath = Path.Combine(location, id + ".resources");
|
||||||
|
ImageExists = File.Exists(filePath);
|
||||||
|
if (ImageExists)
|
||||||
|
{
|
||||||
|
ResizedFile = $"{id}_{width}_{height}_{method}.jpg";
|
||||||
|
var m = ImageResizer.ResizeMethod.Stretch;
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case "b":
|
||||||
|
m = ImageResizer.ResizeMethod.Box;
|
||||||
|
break;
|
||||||
|
case "c":
|
||||||
|
m = ImageResizer.ResizeMethod.Crop;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ImageResizer.ResizeImage(filePath, $"{location}\\{ResizedFile}", width, height, m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyToStream(Stream s)
|
||||||
|
{
|
||||||
|
var imgFile = ImageExists ? string.Format("{0}\\{1}", Location, ResizedFile) : string.Format("{0}\\images\\no-content.png", DotNetNuke.Common.Globals.ApplicationMapPath);
|
||||||
|
using (var fs = new FileStream(imgFile, FileMode.Open, FileAccess.Read))
|
||||||
|
{
|
||||||
|
fs.CopyTo(s);
|
||||||
|
fs.Flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Server/Core/Common/ImageOrientation.cs
Normal file
15
Server/Core/Common/ImageOrientation.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
namespace Bring2mind.InMemoriam.Core.Common
|
||||||
|
{
|
||||||
|
public enum ImageOrientation
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
Normal = 1,
|
||||||
|
FlipHorizontal = 2,
|
||||||
|
Rotate180 = 3,
|
||||||
|
FlipVertical = 4,
|
||||||
|
Transpose = 5,
|
||||||
|
Rotate270 = 6,
|
||||||
|
Transverse = 7,
|
||||||
|
Rotate90 = 8
|
||||||
|
}
|
||||||
|
}
|
||||||
134
Server/Core/Common/ImageResizer.cs
Normal file
134
Server/Core/Common/ImageResizer.cs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Common
|
||||||
|
{
|
||||||
|
public class ImageResizer
|
||||||
|
{
|
||||||
|
public enum ResizeMethod
|
||||||
|
{
|
||||||
|
Box,
|
||||||
|
Crop,
|
||||||
|
Stretch
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ResizeImage(string source, string destination, int desiredWidth, int desiredHeight, ResizeMethod method)
|
||||||
|
{
|
||||||
|
var format = ImageFormat.Jpeg;
|
||||||
|
var target = Resize(source, desiredWidth, desiredHeight, method);
|
||||||
|
target.Save(destination, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static System.Drawing.Image Resize(string sourceImageMapPath, int desiredWidth, int desiredHeight, ResizeMethod method)
|
||||||
|
{
|
||||||
|
//throw error if bouning box is to small
|
||||||
|
if (desiredWidth < 4 || desiredHeight < 4)
|
||||||
|
throw new InvalidOperationException("Bounding Box of Resize Photo must be larger than 4X4 pixels.");
|
||||||
|
var original = Bitmap.FromFile(sourceImageMapPath);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var orientation = (ImageOrientation)original.GetPropertyItem(274).Value[0];
|
||||||
|
switch (orientation)
|
||||||
|
{
|
||||||
|
case ImageOrientation.FlipHorizontal:
|
||||||
|
original.RotateFlip(RotateFlipType.RotateNoneFlipX);
|
||||||
|
break;
|
||||||
|
case ImageOrientation.Rotate180:
|
||||||
|
original.RotateFlip(RotateFlipType.Rotate180FlipNone);
|
||||||
|
break;
|
||||||
|
case ImageOrientation.FlipVertical:
|
||||||
|
original.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
||||||
|
break;
|
||||||
|
case
|
||||||
|
ImageOrientation.Transpose:
|
||||||
|
original.RotateFlip(RotateFlipType.RotateNoneFlipXY);
|
||||||
|
break;
|
||||||
|
case ImageOrientation.Rotate270:
|
||||||
|
original.RotateFlip(RotateFlipType.Rotate90FlipNone);
|
||||||
|
break;
|
||||||
|
case
|
||||||
|
ImageOrientation.Transverse:
|
||||||
|
original.RotateFlip(RotateFlipType.Rotate90FlipXY);
|
||||||
|
break;
|
||||||
|
case ImageOrientation.Rotate90:
|
||||||
|
original.RotateFlip(RotateFlipType.Rotate270FlipNone);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//store image widths in variable for easier use
|
||||||
|
var oW = (decimal)original.Width;
|
||||||
|
var oH = (decimal)original.Height;
|
||||||
|
var dW = (decimal)desiredWidth;
|
||||||
|
var dH = (decimal)desiredHeight;
|
||||||
|
|
||||||
|
var scaleWidth = dW / oW;
|
||||||
|
var scaleHeight = dH / oH;
|
||||||
|
|
||||||
|
int tW = desiredWidth;
|
||||||
|
int tH = desiredHeight;
|
||||||
|
int tX = 0;
|
||||||
|
int tY = 0;
|
||||||
|
int tDX = desiredWidth;
|
||||||
|
int tDY = desiredHeight;
|
||||||
|
|
||||||
|
//check if image already fits
|
||||||
|
if (oW <= dW && oH <= dH)
|
||||||
|
return original; //image fits in bounding box, keep size (center with css) If we made it bigger it would stretch the image resulting in loss of quality.
|
||||||
|
|
||||||
|
//check for double squares or plain stretch resizing
|
||||||
|
if ((oW == oH && dW == dH) || method == ResizeMethod.Stretch)
|
||||||
|
{
|
||||||
|
// don't do anything
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case ResizeMethod.Crop:
|
||||||
|
var scaleMax = Math.Max(scaleHeight, scaleWidth);
|
||||||
|
if (scaleHeight > scaleWidth)
|
||||||
|
{
|
||||||
|
tX = -1 * Convert.ToInt32(((scaleMax * oW) - dW) / 2);
|
||||||
|
tDX = Convert.ToInt32(scaleMax * oW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tY = -1 * Convert.ToInt32(((scaleMax * oH) - dH) / 2);
|
||||||
|
tDY = Convert.ToInt32(scaleMax * oH);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
var scaleMin = Math.Min(scaleHeight, scaleWidth);
|
||||||
|
tW = Convert.ToInt32(oW * scaleMin);
|
||||||
|
tH = Convert.ToInt32(oH * scaleMin);
|
||||||
|
tDX = tW;
|
||||||
|
tDY = tH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var destImage = new Bitmap(tW, tH);
|
||||||
|
using (var graphics = Graphics.FromImage(destImage))
|
||||||
|
{
|
||||||
|
graphics.CompositingMode = CompositingMode.SourceCopy;
|
||||||
|
graphics.CompositingQuality = CompositingQuality.HighQuality;
|
||||||
|
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||||
|
graphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
||||||
|
graphics.DrawImage(original, tX, tY, tDX, tDY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return destImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Server/Core/Common/Visibility.cs
Normal file
9
Server/Core/Common/Visibility.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Bring2mind.InMemoriam.Core.Common
|
||||||
|
{
|
||||||
|
public enum Visibility
|
||||||
|
{
|
||||||
|
Public = 0,
|
||||||
|
Friends = 1,
|
||||||
|
Private = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
46
Server/Core/Data/AuditableEntity.cs
Normal file
46
Server/Core/Data/AuditableEntity.cs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Data
|
||||||
|
{
|
||||||
|
[DataContract]
|
||||||
|
public abstract class AuditableEntity
|
||||||
|
{
|
||||||
|
|
||||||
|
public void FillAuditFields(IDataReader dr)
|
||||||
|
{
|
||||||
|
CreatedByUserID = Convert.ToInt32(Null.SetNull(dr["CreatedByUserID"], CreatedByUserID));
|
||||||
|
CreatedOnDate = Convert.ToDateTime(Null.SetNull(dr["CreatedOnDate"], CreatedOnDate));
|
||||||
|
LastModifiedByUserID = Convert.ToInt32(Null.SetNull(dr["LastModifiedByUserID"], LastModifiedByUserID));
|
||||||
|
LastModifiedOnDate = Convert.ToDateTime(Null.SetNull(dr["LastModifiedOnDate"], LastModifiedOnDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAddingUser(int userId)
|
||||||
|
{
|
||||||
|
CreatedByUserID = userId;
|
||||||
|
CreatedOnDate = DateTime.Now;
|
||||||
|
SetModifyingUser(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetModifyingUser(int userId)
|
||||||
|
{
|
||||||
|
LastModifiedByUserID = userId;
|
||||||
|
LastModifiedOnDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Public Properties
|
||||||
|
[DataMember]
|
||||||
|
public int CreatedByUserID { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public DateTime CreatedOnDate { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int LastModifiedByUserID { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public DateTime LastModifiedOnDate { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
132
Server/Core/Data/RepositoryImpl.cs
Normal file
132
Server/Core/Data/RepositoryImpl.cs
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using DotNetNuke.Collections;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Data
|
||||||
|
{
|
||||||
|
public abstract class RepositoryImpl<T> : IRepository<T> where T : class
|
||||||
|
{
|
||||||
|
|
||||||
|
public virtual void Delete(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Delete(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Delete(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Delete(sqlCondition, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Find(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Find(sqlCondition, args);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> Find(int pageIndex, int pageSize, string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Find(pageIndex, pageSize, sqlCondition, args);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Get()
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Get();
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<T> Get<TScopeType>(TScopeType scopeValue)
|
||||||
|
{
|
||||||
|
IEnumerable<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.Get<TScopeType>(scopeValue);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual T GetById<TProperty>(TProperty id)
|
||||||
|
{
|
||||||
|
T item = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
item = repo.GetById<TProperty>(id);
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual T GetById<TProperty, TScopeType>(TProperty id, TScopeType scopeValue)
|
||||||
|
{
|
||||||
|
T item = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
item = repo.GetById<TProperty, TScopeType>(id, scopeValue);
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> GetPage(int pageIndex, int pageSize)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.GetPage(pageIndex, pageSize);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IPagedList<T> GetPage<TScopeType>(TScopeType scopeValue, int pageIndex, int pageSize)
|
||||||
|
{
|
||||||
|
IPagedList<T> list = null;
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
list = repo.GetPage<TScopeType>(scopeValue, pageIndex, pageSize);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Insert(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Insert(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Update(T item)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Update(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Update(string sqlCondition, params object[] args)
|
||||||
|
{
|
||||||
|
using (IDataContext db = DataContext.Instance()) {
|
||||||
|
IRepository<T> repo = db.GetRepository<T>();
|
||||||
|
repo.Update(sqlCondition, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
10
Server/Core/Data/Sprocs.cs
Normal file
10
Server/Core/Data/Sprocs.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Data
|
||||||
|
{
|
||||||
|
public class Sprocs
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
6
Server/Core/Models/Messages/Message.cs
Normal file
6
Server/Core/Models/Messages/Message.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Messages
|
||||||
|
{
|
||||||
|
public partial class Message
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
63
Server/Core/Models/Messages/Message_Declaration.cs
Normal file
63
Server/Core/Models/Messages/Message_Declaration.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using Bring2mind.InMemoriam.Core.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Messages
|
||||||
|
{
|
||||||
|
[TableName("B2M_InMemoriam_Messages")]
|
||||||
|
[PrimaryKey("MessageId", AutoIncrement = true)]
|
||||||
|
[DataContract]
|
||||||
|
[Scope("ModuleId")]
|
||||||
|
public partial class Message {
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public Message()
|
||||||
|
{
|
||||||
|
MessageId = -1;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
[DataMember]
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int ModuleId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string Contents { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string SenderName { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string SenderEmail { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public DateTime CreatedOn { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public void ReadMessage(Message message)
|
||||||
|
{
|
||||||
|
if (message.MessageId > -1)
|
||||||
|
MessageId = message.MessageId;
|
||||||
|
|
||||||
|
if (message.ModuleId > -1)
|
||||||
|
ModuleId = message.ModuleId;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(message.Contents))
|
||||||
|
Contents = message.Contents;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(message.SenderName))
|
||||||
|
SenderName = message.SenderName;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(message.SenderEmail))
|
||||||
|
SenderEmail = message.SenderEmail;
|
||||||
|
|
||||||
|
CreatedOn = message.CreatedOn;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
76
Server/Core/Models/Messages/Message_Interfaces.cs
Normal file
76
Server/Core/Models/Messages/Message_Interfaces.cs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using DotNetNuke.Entities.Modules;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Messages
|
||||||
|
{
|
||||||
|
public partial class Message : IHydratable, IPropertyAccess
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
|
||||||
|
public virtual void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
MessageId = Convert.ToInt32(Null.SetNull(dr["MessageId"], MessageId));
|
||||||
|
ModuleId = Convert.ToInt32(Null.SetNull(dr["ModuleId"], ModuleId));
|
||||||
|
Contents = Convert.ToString(Null.SetNull(dr["Contents"], Contents));
|
||||||
|
SenderName = Convert.ToString(Null.SetNull(dr["SenderName"], SenderName));
|
||||||
|
SenderEmail = Convert.ToString(Null.SetNull(dr["SenderEmail"], SenderEmail));
|
||||||
|
CreatedOn = (DateTime)(Null.SetNull(dr["CreatedOn"], CreatedOn));
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public int KeyID
|
||||||
|
{
|
||||||
|
get { return MessageId; }
|
||||||
|
set { MessageId = value; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public virtual string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower())
|
||||||
|
{
|
||||||
|
case "messageid": // Int
|
||||||
|
return MessageId.ToString(strFormat, formatProvider);
|
||||||
|
case "moduleid": // Int
|
||||||
|
return ModuleId.ToString(strFormat, formatProvider);
|
||||||
|
case "contents": // NVarCharMax
|
||||||
|
return PropertyAccess.FormatString(Contents, strFormat);
|
||||||
|
case "sendername": // NVarChar
|
||||||
|
if (SenderName == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(SenderName, strFormat);
|
||||||
|
case "senderemail": // NVarChar
|
||||||
|
if (SenderEmail == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(SenderEmail, strFormat);
|
||||||
|
case "createdon": // DateTime
|
||||||
|
return CreatedOn.ToString(strFormat, formatProvider);
|
||||||
|
default:
|
||||||
|
propertyNotFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Null.NullString;
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public CacheLevel Cacheability
|
||||||
|
{
|
||||||
|
get { return CacheLevel.fullyCacheable; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
94
Server/Core/Models/Pictures/PictureBase.cs
Normal file
94
Server/Core/Models/Pictures/PictureBase.cs
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using Bring2mind.InMemoriam.Core.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Pictures
|
||||||
|
{
|
||||||
|
[TableName("B2M_InMemoriam_Pictures")]
|
||||||
|
[PrimaryKey("PictureId", AutoIncrement = true)]
|
||||||
|
[DataContract]
|
||||||
|
[Scope("ModuleId")]
|
||||||
|
public partial class PictureBase : AuditableEntity
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public PictureBase()
|
||||||
|
{
|
||||||
|
PictureId = -1;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
[DataMember]
|
||||||
|
public int PictureId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int ModuleId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public Guid ImageIdentifier { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int OriginalWidth { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int OriginalHeight { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string OriginalName { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string Title { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string Description { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int PictureYear { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int PictureMonth { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int PictureDay { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int Visibility { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public void ReadPictureBase(PictureBase picture)
|
||||||
|
{
|
||||||
|
if (picture.PictureId > -1)
|
||||||
|
PictureId = picture.PictureId;
|
||||||
|
|
||||||
|
if (picture.ModuleId > -1)
|
||||||
|
ModuleId = picture.ModuleId;
|
||||||
|
|
||||||
|
ImageIdentifier = picture.ImageIdentifier;
|
||||||
|
|
||||||
|
if (picture.OriginalWidth > -1)
|
||||||
|
OriginalWidth = picture.OriginalWidth;
|
||||||
|
|
||||||
|
if (picture.OriginalHeight > -1)
|
||||||
|
OriginalHeight = picture.OriginalHeight;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(picture.OriginalName))
|
||||||
|
OriginalName = picture.OriginalName;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(picture.Title))
|
||||||
|
Title = picture.Title;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(picture.Description))
|
||||||
|
Description = picture.Description;
|
||||||
|
|
||||||
|
if (picture.PictureYear > -1)
|
||||||
|
PictureYear = picture.PictureYear;
|
||||||
|
|
||||||
|
if (picture.PictureMonth > -1)
|
||||||
|
PictureMonth = picture.PictureMonth;
|
||||||
|
|
||||||
|
if (picture.PictureDay > -1)
|
||||||
|
PictureDay = picture.PictureDay;
|
||||||
|
|
||||||
|
if (picture.Visibility > -1)
|
||||||
|
Visibility = picture.Visibility;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
20
Server/Core/Models/Pictures/PictureBaseMore.cs
Normal file
20
Server/Core/Models/Pictures/PictureBaseMore.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Bring2mind.InMemoriam.Core.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Pictures
|
||||||
|
{
|
||||||
|
public partial class PictureBase : AuditableEntity
|
||||||
|
{
|
||||||
|
public void ReadEditedPictureBase(PictureBase picture)
|
||||||
|
{
|
||||||
|
Title = picture.Title.Trim();
|
||||||
|
Description = picture.Description.Trim();
|
||||||
|
PictureYear = picture.PictureYear;
|
||||||
|
PictureMonth = picture.PictureMonth;
|
||||||
|
PictureDay = picture.PictureDay;
|
||||||
|
Visibility = picture.Visibility;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
99
Server/Core/Models/Pictures/PictureBase_Interfaces.cs
Normal file
99
Server/Core/Models/Pictures/PictureBase_Interfaces.cs
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using DotNetNuke.Entities.Modules;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Pictures
|
||||||
|
{
|
||||||
|
public partial class PictureBase : IHydratable, IPropertyAccess
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
|
||||||
|
public virtual void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
FillAuditFields(dr);
|
||||||
|
PictureId = Convert.ToInt32(Null.SetNull(dr["PictureId"], PictureId));
|
||||||
|
ModuleId = Convert.ToInt32(Null.SetNull(dr["ModuleId"], ModuleId));
|
||||||
|
ImageIdentifier = new Guid(Convert.ToString(Null.SetNull(dr["ImageIdentifier"], ImageIdentifier)));
|
||||||
|
OriginalWidth = Convert.ToInt32(Null.SetNull(dr["OriginalWidth"], OriginalWidth));
|
||||||
|
OriginalHeight = Convert.ToInt32(Null.SetNull(dr["OriginalHeight"], OriginalHeight));
|
||||||
|
OriginalName = Convert.ToString(Null.SetNull(dr["OriginalName"], OriginalName));
|
||||||
|
Title = Convert.ToString(Null.SetNull(dr["Title"], Title));
|
||||||
|
Description = Convert.ToString(Null.SetNull(dr["Description"], Description));
|
||||||
|
PictureYear = Convert.ToInt32(Null.SetNull(dr["PictureYear"], PictureYear));
|
||||||
|
PictureMonth = Convert.ToInt32(Null.SetNull(dr["PictureMonth"], PictureMonth));
|
||||||
|
PictureDay = Convert.ToInt32(Null.SetNull(dr["PictureDay"], PictureDay));
|
||||||
|
Visibility = Convert.ToInt32(Null.SetNull(dr["Visibility"], Visibility));
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public int KeyID
|
||||||
|
{
|
||||||
|
get { return PictureId; }
|
||||||
|
set { PictureId = value; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public virtual string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower())
|
||||||
|
{
|
||||||
|
case "pictureid": // Int
|
||||||
|
return PictureId.ToString(strFormat, formatProvider);
|
||||||
|
case "moduleid": // Int
|
||||||
|
return ModuleId.ToString(strFormat, formatProvider);
|
||||||
|
case "imageidentifier": // UniqueIdentifier
|
||||||
|
return ImageIdentifier.ToString(strFormat, formatProvider);
|
||||||
|
case "originalwidth": // Int
|
||||||
|
return OriginalWidth.ToString(strFormat, formatProvider);
|
||||||
|
case "originalheight": // Int
|
||||||
|
return OriginalHeight.ToString(strFormat, formatProvider);
|
||||||
|
case "originalname": // NVarChar
|
||||||
|
if (OriginalName == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(OriginalName, strFormat);
|
||||||
|
case "title": // NVarChar
|
||||||
|
if (Title == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(Title, strFormat);
|
||||||
|
case "description": // NVarCharMax
|
||||||
|
if (Description == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(Description, strFormat);
|
||||||
|
case "pictureyear": // Int
|
||||||
|
return PictureYear.ToString(strFormat, formatProvider);
|
||||||
|
case "picturemonth": // Int
|
||||||
|
return PictureMonth.ToString(strFormat, formatProvider);
|
||||||
|
case "pictureday": // Int
|
||||||
|
return PictureDay.ToString(strFormat, formatProvider);
|
||||||
|
case "visibility": // Int
|
||||||
|
return Visibility.ToString(strFormat, formatProvider);
|
||||||
|
default:
|
||||||
|
propertyNotFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Null.NullString;
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public CacheLevel Cacheability
|
||||||
|
{
|
||||||
|
get { return CacheLevel.fullyCacheable; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
76
Server/Core/Models/Pictures/Picture_Declaration.cs
Normal file
76
Server/Core/Models/Pictures/Picture_Declaration.cs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Pictures
|
||||||
|
{
|
||||||
|
|
||||||
|
[TableName("vw_B2M_InMemoriam_Pictures")]
|
||||||
|
[PrimaryKey("PictureId", AutoIncrement = true)]
|
||||||
|
[DataContract]
|
||||||
|
[Scope("ModuleId")]
|
||||||
|
public partial class Picture : PictureBase
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public Picture() : base()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
[DataMember]
|
||||||
|
public string CreatedByUser { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string LastModifiedByUser { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public PictureBase GetPictureBase()
|
||||||
|
{
|
||||||
|
PictureBase res = new PictureBase();
|
||||||
|
res.PictureId = PictureId;
|
||||||
|
res.ModuleId = ModuleId;
|
||||||
|
res.ImageIdentifier = ImageIdentifier;
|
||||||
|
res.OriginalWidth = OriginalWidth;
|
||||||
|
res.OriginalHeight = OriginalHeight;
|
||||||
|
res.OriginalName = OriginalName;
|
||||||
|
res.Title = Title;
|
||||||
|
res.Description = Description;
|
||||||
|
res.PictureYear = PictureYear;
|
||||||
|
res.PictureMonth = PictureMonth;
|
||||||
|
res.PictureDay = PictureDay;
|
||||||
|
res.Visibility = Visibility;
|
||||||
|
res.CreatedByUserID = CreatedByUserID;
|
||||||
|
res.CreatedOnDate = CreatedOnDate;
|
||||||
|
res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
public Picture Clone()
|
||||||
|
{
|
||||||
|
Picture res = new Picture();
|
||||||
|
res.PictureId = PictureId;
|
||||||
|
res.ModuleId = ModuleId;
|
||||||
|
res.ImageIdentifier = ImageIdentifier;
|
||||||
|
res.OriginalWidth = OriginalWidth;
|
||||||
|
res.OriginalHeight = OriginalHeight;
|
||||||
|
res.OriginalName = OriginalName;
|
||||||
|
res.Title = Title;
|
||||||
|
res.Description = Description;
|
||||||
|
res.PictureYear = PictureYear;
|
||||||
|
res.PictureMonth = PictureMonth;
|
||||||
|
res.PictureDay = PictureDay;
|
||||||
|
res.Visibility = Visibility;
|
||||||
|
res.CreatedByUser = CreatedByUser;
|
||||||
|
res.LastModifiedByUser = LastModifiedByUser;
|
||||||
|
res.CreatedByUserID = CreatedByUserID;
|
||||||
|
res.CreatedOnDate = CreatedOnDate;
|
||||||
|
res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Server/Core/Models/Pictures/Picture_Interfaces.cs
Normal file
48
Server/Core/Models/Pictures/Picture_Interfaces.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Pictures
|
||||||
|
{
|
||||||
|
|
||||||
|
[Serializable(), XmlRoot("Picture")]
|
||||||
|
public partial class Picture
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
public override void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
base.Fill(dr);
|
||||||
|
CreatedByUser = Convert.ToString(Null.SetNull(dr["CreatedByUser"], CreatedByUser));
|
||||||
|
LastModifiedByUser = Convert.ToString(Null.SetNull(dr["LastModifiedByUser"], LastModifiedByUser));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public override string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower()) {
|
||||||
|
case "createdbyuser": // NVarChar
|
||||||
|
if (CreatedByUser == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(CreatedByUser, strFormat);
|
||||||
|
case "lastmodifiedbyuser": // NVarChar
|
||||||
|
if (LastModifiedByUser == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(LastModifiedByUser, strFormat);
|
||||||
|
default:
|
||||||
|
return base.GetProperty(strPropertyName, strFormat, formatProvider, accessingUser, accessLevel, ref propertyNotFound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
75
Server/Core/Models/Stories/StoryBase.cs
Normal file
75
Server/Core/Models/Stories/StoryBase.cs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using Bring2mind.InMemoriam.Core.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Stories
|
||||||
|
{
|
||||||
|
[TableName("B2M_InMemoriam_Stories")]
|
||||||
|
[PrimaryKey("StoryId", AutoIncrement = true)]
|
||||||
|
[DataContract]
|
||||||
|
[Scope("ModuleId")]
|
||||||
|
public partial class StoryBase : AuditableEntity
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public StoryBase()
|
||||||
|
{
|
||||||
|
StoryId = -1;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
[DataMember]
|
||||||
|
public int StoryId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int ModuleId { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string Title { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string Contents { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int StoryYear { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int StoryMonth { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int StoryDay { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public int Visibility { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public void ReadStoryBase(StoryBase story)
|
||||||
|
{
|
||||||
|
if (story.StoryId > -1)
|
||||||
|
StoryId = story.StoryId;
|
||||||
|
|
||||||
|
if (story.ModuleId > -1)
|
||||||
|
ModuleId = story.ModuleId;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(story.Title))
|
||||||
|
Title = story.Title;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(story.Contents))
|
||||||
|
Contents = story.Contents;
|
||||||
|
|
||||||
|
if (story.StoryYear > -1)
|
||||||
|
StoryYear = story.StoryYear;
|
||||||
|
|
||||||
|
if (story.StoryMonth > -1)
|
||||||
|
StoryMonth = story.StoryMonth;
|
||||||
|
|
||||||
|
if (story.StoryDay > -1)
|
||||||
|
StoryDay = story.StoryDay;
|
||||||
|
|
||||||
|
if (story.Visibility > -1)
|
||||||
|
Visibility = story.Visibility;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
23
Server/Core/Models/Stories/StoryBaseMore.cs
Normal file
23
Server/Core/Models/Stories/StoryBaseMore.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using Bring2mind.InMemoriam.Core.Data;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Stories
|
||||||
|
{
|
||||||
|
public partial class StoryBase : AuditableEntity
|
||||||
|
{
|
||||||
|
public void ReadEditedStoryBase(StoryBase story)
|
||||||
|
{
|
||||||
|
Title = story.Title.Trim();
|
||||||
|
Contents = story.Contents.Trim();
|
||||||
|
StoryYear = story.StoryYear;
|
||||||
|
StoryMonth = story.StoryMonth;
|
||||||
|
StoryDay = story.StoryDay;
|
||||||
|
Visibility = story.Visibility;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
83
Server/Core/Models/Stories/StoryBase_Interfaces.cs
Normal file
83
Server/Core/Models/Stories/StoryBase_Interfaces.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
using DotNetNuke.Entities.Modules;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Stories
|
||||||
|
{
|
||||||
|
public partial class StoryBase : IHydratable, IPropertyAccess
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
|
||||||
|
public virtual void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
FillAuditFields(dr);
|
||||||
|
StoryId = Convert.ToInt32(Null.SetNull(dr["StoryId"], StoryId));
|
||||||
|
ModuleId = Convert.ToInt32(Null.SetNull(dr["ModuleId"], ModuleId));
|
||||||
|
Title = Convert.ToString(Null.SetNull(dr["Title"], Title));
|
||||||
|
Contents = Convert.ToString(Null.SetNull(dr["Contents"], Contents));
|
||||||
|
StoryYear = Convert.ToInt32(Null.SetNull(dr["StoryYear"], StoryYear));
|
||||||
|
StoryMonth = Convert.ToInt32(Null.SetNull(dr["StoryMonth"], StoryMonth));
|
||||||
|
StoryDay = Convert.ToInt32(Null.SetNull(dr["StoryDay"], StoryDay));
|
||||||
|
Visibility = Convert.ToInt32(Null.SetNull(dr["Visibility"], Visibility));
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public int KeyID
|
||||||
|
{
|
||||||
|
get { return StoryId; }
|
||||||
|
set { StoryId = value; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public virtual string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower())
|
||||||
|
{
|
||||||
|
case "storyid": // Int
|
||||||
|
return StoryId.ToString(strFormat, formatProvider);
|
||||||
|
case "moduleid": // Int
|
||||||
|
return ModuleId.ToString(strFormat, formatProvider);
|
||||||
|
case "title": // NVarChar
|
||||||
|
if (Title == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(Title, strFormat);
|
||||||
|
case "contents": // NVarCharMax
|
||||||
|
if (Contents == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(Contents, strFormat);
|
||||||
|
case "storyyear": // Int
|
||||||
|
return StoryYear.ToString(strFormat, formatProvider);
|
||||||
|
case "storymonth": // Int
|
||||||
|
return StoryMonth.ToString(strFormat, formatProvider);
|
||||||
|
case "storyday": // Int
|
||||||
|
return StoryDay.ToString(strFormat, formatProvider);
|
||||||
|
case "visibility": // Int
|
||||||
|
return Visibility.ToString(strFormat, formatProvider);
|
||||||
|
default:
|
||||||
|
propertyNotFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Null.NullString;
|
||||||
|
}
|
||||||
|
|
||||||
|
[IgnoreColumn()]
|
||||||
|
public CacheLevel Cacheability
|
||||||
|
{
|
||||||
|
get { return CacheLevel.fullyCacheable; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
68
Server/Core/Models/Stories/Story_Declaration.cs
Normal file
68
Server/Core/Models/Stories/Story_Declaration.cs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using DotNetNuke.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Stories
|
||||||
|
{
|
||||||
|
|
||||||
|
[TableName("vw_B2M_InMemoriam_Stories")]
|
||||||
|
[PrimaryKey("StoryId", AutoIncrement = true)]
|
||||||
|
[DataContract]
|
||||||
|
[Scope("ModuleId")]
|
||||||
|
public partial class Story : StoryBase
|
||||||
|
{
|
||||||
|
|
||||||
|
#region .ctor
|
||||||
|
public Story() : base()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
[DataMember]
|
||||||
|
public string CreatedByUser { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public string LastModifiedByUser { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public StoryBase GetStoryBase()
|
||||||
|
{
|
||||||
|
StoryBase res = new StoryBase();
|
||||||
|
res.StoryId = StoryId;
|
||||||
|
res.ModuleId = ModuleId;
|
||||||
|
res.Title = Title;
|
||||||
|
res.Contents = Contents;
|
||||||
|
res.StoryYear = StoryYear;
|
||||||
|
res.StoryMonth = StoryMonth;
|
||||||
|
res.StoryDay = StoryDay;
|
||||||
|
res.Visibility = Visibility;
|
||||||
|
res.CreatedByUserID = CreatedByUserID;
|
||||||
|
res.CreatedOnDate = CreatedOnDate;
|
||||||
|
res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
public Story Clone()
|
||||||
|
{
|
||||||
|
Story res = new Story();
|
||||||
|
res.StoryId = StoryId;
|
||||||
|
res.ModuleId = ModuleId;
|
||||||
|
res.Title = Title;
|
||||||
|
res.Contents = Contents;
|
||||||
|
res.StoryYear = StoryYear;
|
||||||
|
res.StoryMonth = StoryMonth;
|
||||||
|
res.StoryDay = StoryDay;
|
||||||
|
res.Visibility = Visibility;
|
||||||
|
res.CreatedByUser = CreatedByUser;
|
||||||
|
res.LastModifiedByUser = LastModifiedByUser;
|
||||||
|
res.CreatedByUserID = CreatedByUserID;
|
||||||
|
res.CreatedOnDate = CreatedOnDate;
|
||||||
|
res.LastModifiedByUserID = LastModifiedByUserID;
|
||||||
|
res.LastModifiedOnDate = LastModifiedOnDate;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Server/Core/Models/Stories/Story_Interfaces.cs
Normal file
48
Server/Core/Models/Stories/Story_Interfaces.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
using DotNetNuke.Common.Utilities;
|
||||||
|
using DotNetNuke.Services.Tokens;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Models.Stories
|
||||||
|
{
|
||||||
|
|
||||||
|
[Serializable(), XmlRoot("Story")]
|
||||||
|
public partial class Story
|
||||||
|
{
|
||||||
|
|
||||||
|
#region IHydratable
|
||||||
|
public override void Fill(IDataReader dr)
|
||||||
|
{
|
||||||
|
base.Fill(dr);
|
||||||
|
CreatedByUser = Convert.ToString(Null.SetNull(dr["CreatedByUser"], CreatedByUser));
|
||||||
|
LastModifiedByUser = Convert.ToString(Null.SetNull(dr["LastModifiedByUser"], LastModifiedByUser));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IPropertyAccess
|
||||||
|
public override string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
|
||||||
|
{
|
||||||
|
switch (strPropertyName.ToLower()) {
|
||||||
|
case "createdbyuser": // NVarChar
|
||||||
|
if (CreatedByUser == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(CreatedByUser, strFormat);
|
||||||
|
case "lastmodifiedbyuser": // NVarChar
|
||||||
|
if (LastModifiedByUser == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
return PropertyAccess.FormatString(LastModifiedByUser, strFormat);
|
||||||
|
default:
|
||||||
|
return base.GetProperty(strPropertyName, strFormat, formatProvider, accessingUser, accessLevel, ref propertyNotFound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
54
Server/Core/PicturesService.cs
Normal file
54
Server/Core/PicturesService.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using Bring2mind.InMemoriam.Core.Models.Pictures;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Web;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core
|
||||||
|
{
|
||||||
|
public class PicturesService
|
||||||
|
{
|
||||||
|
public static PictureBase UploadPicture(string portalMapPath, int moduleId, HttpPostedFile file)
|
||||||
|
{
|
||||||
|
var newGuid = Guid.NewGuid();
|
||||||
|
var filePath = Path.Combine(portalMapPath, Common.Globals.uploadPath, moduleId.ToString());
|
||||||
|
if (!Directory.Exists(filePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(filePath);
|
||||||
|
}
|
||||||
|
var fileName = Path.Combine(filePath, newGuid.ToString() + ".resources");
|
||||||
|
file.SaveAs(fileName);
|
||||||
|
|
||||||
|
var res = new PictureBase
|
||||||
|
{
|
||||||
|
ImageIdentifier = newGuid,
|
||||||
|
OriginalName = file.FileName,
|
||||||
|
OriginalWidth = 0,
|
||||||
|
OriginalHeight = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// detect image size
|
||||||
|
using (var img = System.Drawing.Image.FromFile(fileName))
|
||||||
|
{
|
||||||
|
res.OriginalHeight = img.Height;
|
||||||
|
res.OriginalWidth = img.Width;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeletePicture(string portalMapPath, int moduleId, Guid fileId)
|
||||||
|
{
|
||||||
|
var imagesDir = new DirectoryInfo(Path.Combine(portalMapPath, Common.Globals.uploadPath, moduleId.ToString()));
|
||||||
|
var files = imagesDir.GetFiles($"{fileId}*.jpg");
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
file.Delete();
|
||||||
|
}
|
||||||
|
var originalFile = Path.Combine(portalMapPath, Common.Globals.uploadPath, fileId.ToString() + ".resources");
|
||||||
|
if (File.Exists(originalFile))
|
||||||
|
{
|
||||||
|
File.Delete(originalFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Server/Core/Repositories/MessageRepository.cs
Normal file
18
Server/Core/Repositories/MessageRepository.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Messages;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
public partial class MessageRepository : ServiceLocator<IMessageRepository, MessageRepository>, IMessageRepository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public partial interface IMessageRepository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
84
Server/Core/Repositories/MessageRepository_Core.cs
Normal file
84
Server/Core/Repositories/MessageRepository_Core.cs
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Messages;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class MessageRepository : ServiceLocator<IMessageRepository, MessageRepository>, IMessageRepository
|
||||||
|
{
|
||||||
|
protected override Func<IMessageRepository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new MessageRepository();
|
||||||
|
}
|
||||||
|
public IEnumerable<Message> GetMessages(int moduleId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
return rep.Get(moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Message GetMessage(int moduleId, int messageId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
return rep.GetById(messageId, moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Message AddMessage(Message message)
|
||||||
|
{
|
||||||
|
Requires.NotNull(message);
|
||||||
|
Requires.PropertyNotNegative(message, "ModuleId");
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
rep.Insert(message);
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
public void DeleteMessage(Message message)
|
||||||
|
{
|
||||||
|
Requires.NotNull(message);
|
||||||
|
Requires.PropertyNotNegative(message, "MessageId");
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
rep.Delete(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void DeleteMessage(int moduleId, int messageId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
rep.Delete("WHERE ModuleId = @0 AND MessageId = @1", moduleId, messageId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void UpdateMessage(Message message)
|
||||||
|
{
|
||||||
|
Requires.NotNull(message);
|
||||||
|
Requires.PropertyNotNegative(message, "MessageId");
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Message>();
|
||||||
|
rep.Update(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public partial interface IMessageRepository
|
||||||
|
{
|
||||||
|
IEnumerable<Message> GetMessages(int moduleId);
|
||||||
|
Message GetMessage(int moduleId, int messageId);
|
||||||
|
Message AddMessage(Message message);
|
||||||
|
void DeleteMessage(Message message);
|
||||||
|
void DeleteMessage(int moduleId, int messageId);
|
||||||
|
void UpdateMessage(Message message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
26
Server/Core/Repositories/PictureRepository.cs
Normal file
26
Server/Core/Repositories/PictureRepository.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using Bring2mind.InMemoriam.Core.Models.Pictures;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
public partial class PictureRepository : ServiceLocator<IPictureRepository, PictureRepository>, IPictureRepository
|
||||||
|
{
|
||||||
|
public IEnumerable<Picture> GetPictures(int moduleId, int userId, string sortBy, string sortOrder)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Picture>();
|
||||||
|
var sql = userId == -1 ? "WHERE ModuleId=@0 AND Visibility=0" : "WHERE ModuleId=@0 AND (CreatedByUserID=@1 OR Visibility<2)";
|
||||||
|
sql += " ORDER BY " + sortBy + " " + sortOrder;
|
||||||
|
return rep.Find(sql, moduleId, userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public partial interface IPictureRepository
|
||||||
|
{
|
||||||
|
IEnumerable<Picture> GetPictures(int moduleId, int userId, string sortBy, string sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
90
Server/Core/Repositories/PictureRepository_Core.cs
Normal file
90
Server/Core/Repositories/PictureRepository_Core.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Pictures;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class PictureRepository : ServiceLocator<IPictureRepository, PictureRepository>, IPictureRepository
|
||||||
|
{
|
||||||
|
protected override Func<IPictureRepository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new PictureRepository();
|
||||||
|
}
|
||||||
|
public IEnumerable<Picture> GetPictures(int moduleId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Picture>();
|
||||||
|
return rep.Get(moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Picture GetPicture(int moduleId, int pictureId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Picture>();
|
||||||
|
return rep.GetById(pictureId, moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public PictureBase AddPicture(PictureBase picture, int userId)
|
||||||
|
{
|
||||||
|
Requires.NotNull(picture);
|
||||||
|
Requires.PropertyNotNegative(picture, "ModuleId");
|
||||||
|
picture.CreatedByUserID = userId;
|
||||||
|
picture.CreatedOnDate = DateTime.Now;
|
||||||
|
picture.LastModifiedByUserID = userId;
|
||||||
|
picture.LastModifiedOnDate = DateTime.Now;
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<PictureBase>();
|
||||||
|
rep.Insert(picture);
|
||||||
|
}
|
||||||
|
return picture;
|
||||||
|
}
|
||||||
|
public void DeletePicture(PictureBase picture)
|
||||||
|
{
|
||||||
|
Requires.NotNull(picture);
|
||||||
|
Requires.PropertyNotNegative(picture, "PictureId");
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<PictureBase>();
|
||||||
|
rep.Delete(picture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void DeletePicture(int moduleId, int pictureId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<PictureBase>();
|
||||||
|
rep.Delete("WHERE ModuleId = @0 AND PictureId = @1", moduleId, pictureId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void UpdatePicture(PictureBase picture, int userId)
|
||||||
|
{
|
||||||
|
Requires.NotNull(picture);
|
||||||
|
Requires.PropertyNotNegative(picture, "PictureId");
|
||||||
|
picture.LastModifiedByUserID = userId;
|
||||||
|
picture.LastModifiedOnDate = DateTime.Now;
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<PictureBase>();
|
||||||
|
rep.Update(picture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public partial interface IPictureRepository
|
||||||
|
{
|
||||||
|
IEnumerable<Picture> GetPictures(int moduleId);
|
||||||
|
Picture GetPicture(int moduleId, int pictureId);
|
||||||
|
PictureBase AddPicture(PictureBase picture, int userId);
|
||||||
|
void DeletePicture(PictureBase picture);
|
||||||
|
void DeletePicture(int moduleId, int pictureId);
|
||||||
|
void UpdatePicture(PictureBase picture, int userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
18
Server/Core/Repositories/StoryRepository.cs
Normal file
18
Server/Core/Repositories/StoryRepository.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Stories;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
public partial class StoryRepository : ServiceLocator<IStoryRepository, StoryRepository>, IStoryRepository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public partial interface IStoryRepository
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
90
Server/Core/Repositories/StoryRepository_Core.cs
Normal file
90
Server/Core/Repositories/StoryRepository_Core.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using DotNetNuke.Common;
|
||||||
|
using DotNetNuke.Data;
|
||||||
|
using DotNetNuke.Framework;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Stories;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Core.Repositories
|
||||||
|
{
|
||||||
|
|
||||||
|
public partial class StoryRepository : ServiceLocator<IStoryRepository, StoryRepository>, IStoryRepository
|
||||||
|
{
|
||||||
|
protected override Func<IStoryRepository> GetFactory()
|
||||||
|
{
|
||||||
|
return () => new StoryRepository();
|
||||||
|
}
|
||||||
|
public IEnumerable<Story> GetStories(int moduleId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Story>();
|
||||||
|
return rep.Get(moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Story GetStory(int moduleId, int storyId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<Story>();
|
||||||
|
return rep.GetById(storyId, moduleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public StoryBase AddStory(StoryBase story, int userId)
|
||||||
|
{
|
||||||
|
Requires.NotNull(story);
|
||||||
|
Requires.PropertyNotNegative(story, "ModuleId");
|
||||||
|
story.CreatedByUserID = userId;
|
||||||
|
story.CreatedOnDate = DateTime.Now;
|
||||||
|
story.LastModifiedByUserID = userId;
|
||||||
|
story.LastModifiedOnDate = DateTime.Now;
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<StoryBase>();
|
||||||
|
rep.Insert(story);
|
||||||
|
}
|
||||||
|
return story;
|
||||||
|
}
|
||||||
|
public void DeleteStory(StoryBase story)
|
||||||
|
{
|
||||||
|
Requires.NotNull(story);
|
||||||
|
Requires.PropertyNotNegative(story, "StoryId");
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<StoryBase>();
|
||||||
|
rep.Delete(story);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void DeleteStory(int moduleId, int storyId)
|
||||||
|
{
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<StoryBase>();
|
||||||
|
rep.Delete("WHERE ModuleId = @0 AND StoryId = @1", moduleId, storyId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void UpdateStory(StoryBase story, int userId)
|
||||||
|
{
|
||||||
|
Requires.NotNull(story);
|
||||||
|
Requires.PropertyNotNegative(story, "StoryId");
|
||||||
|
story.LastModifiedByUserID = userId;
|
||||||
|
story.LastModifiedOnDate = DateTime.Now;
|
||||||
|
using (var context = DataContext.Instance())
|
||||||
|
{
|
||||||
|
var rep = context.GetRepository<StoryBase>();
|
||||||
|
rep.Update(story);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public partial interface IStoryRepository
|
||||||
|
{
|
||||||
|
IEnumerable<Story> GetStories(int moduleId);
|
||||||
|
Story GetStory(int moduleId, int storyId);
|
||||||
|
StoryBase AddStory(StoryBase story, int userId);
|
||||||
|
void DeleteStory(StoryBase story);
|
||||||
|
void DeleteStory(int moduleId, int storyId);
|
||||||
|
void UpdateStory(StoryBase story, int userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
48
Server/InMemoriam/Api/MessagesController.cs
Normal file
48
Server/InMemoriam/Api/MessagesController.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using Bring2mind.InMemoriam.Common;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Messages;
|
||||||
|
using Bring2mind.InMemoriam.Core.Repositories;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Web.Http;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Api
|
||||||
|
{
|
||||||
|
public class MessagesController : InMemoriamApiController
|
||||||
|
{
|
||||||
|
[HttpGet]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.View)]
|
||||||
|
public HttpResponseMessage GetMessages()
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, MessageRepository.Instance.GetMessages(ActiveModule.ModuleID).OrderByDescending(m => m.CreatedOn));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddMessage)]
|
||||||
|
public HttpResponseMessage AddMessage(int id, [FromBody] string data)
|
||||||
|
{
|
||||||
|
var message = Newtonsoft.Json.JsonConvert.DeserializeObject<Message>(data);
|
||||||
|
if (message == null || string.IsNullOrEmpty(message.Contents.Trim()))
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid message data");
|
||||||
|
}
|
||||||
|
message.CreatedOn = System.DateTime.Now;
|
||||||
|
message.ModuleId = ActiveModule.ModuleID;
|
||||||
|
message = MessageRepository.Instance.AddMessage(message);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, MessageRepository.Instance.GetMessage(this.ActiveModule.ModuleID, message.MessageId));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.Family)]
|
||||||
|
public HttpResponseMessage DeleteMessage(int id)
|
||||||
|
{
|
||||||
|
var message = MessageRepository.Instance.GetMessage(ActiveModule.ModuleID, id);
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.NotFound, "Message not found");
|
||||||
|
}
|
||||||
|
MessageRepository.Instance.DeleteMessage(message);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
109
Server/InMemoriam/Api/PicturesController.cs
Normal file
109
Server/InMemoriam/Api/PicturesController.cs
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
using Bring2mind.InMemoriam.Common;
|
||||||
|
using Bring2mind.InMemoriam.Core;
|
||||||
|
using Bring2mind.InMemoriam.Core.Common;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Pictures;
|
||||||
|
using Bring2mind.InMemoriam.Core.Repositories;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Http;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Api
|
||||||
|
{
|
||||||
|
public class PicturesController : InMemoriamApiController
|
||||||
|
{
|
||||||
|
[HttpGet]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.View)]
|
||||||
|
public HttpResponseMessage Get(string id, int width, int height, string method)
|
||||||
|
{
|
||||||
|
var i = new Image(
|
||||||
|
Path.Combine(PortalSettings.HomeDirectoryMapPath, Globals.uploadPath, ActiveModule.ModuleID.ToString()),
|
||||||
|
id, width, height, method);
|
||||||
|
if (!i.ImageExists)
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.NotFound);
|
||||||
|
}
|
||||||
|
var res = new HttpResponseMessage(HttpStatusCode.OK);
|
||||||
|
var mem = new MemoryStream();
|
||||||
|
i.CopyToStream(mem);
|
||||||
|
mem.Seek(0, SeekOrigin.Begin);
|
||||||
|
res.Content = new StreamContent(mem);
|
||||||
|
res.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.View)]
|
||||||
|
public HttpResponseMessage GetPictures()
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, PictureRepository.Instance.GetPictures(ActiveModule.ModuleID, UserInfo.UserID, "CreatedOnDate", "DESC"));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddContent)]
|
||||||
|
public HttpResponseMessage UploadPicture()
|
||||||
|
{
|
||||||
|
var context = HttpContext.Current;
|
||||||
|
var file = context.Request.Files[0];
|
||||||
|
var title = context.Request.Form["title"];
|
||||||
|
var description = context.Request.Form["description"];
|
||||||
|
var visiblity = int.Parse(context.Request.Form["visibility"]);
|
||||||
|
var pictureYear = int.Parse(context.Request.Form["pictureYear"]);
|
||||||
|
var pictureMonth = int.Parse(context.Request.Form["pictureMonth"]);
|
||||||
|
var pictureDay = int.Parse(context.Request.Form["pictureDay"]);
|
||||||
|
|
||||||
|
var pic = PicturesService.UploadPicture(PortalSettings.HomeDirectoryMapPath, ActiveModule.ModuleID, file);
|
||||||
|
|
||||||
|
pic.ModuleId = ActiveModule.ModuleID;
|
||||||
|
pic.Title = title;
|
||||||
|
pic.Description = description;
|
||||||
|
pic.Visibility = visiblity;
|
||||||
|
pic.PictureYear = pictureYear;
|
||||||
|
pic.PictureMonth = pictureMonth;
|
||||||
|
pic.PictureDay = pictureDay;
|
||||||
|
|
||||||
|
var id = PictureRepository.Instance.AddPicture(pic, UserInfo.UserID).PictureId;
|
||||||
|
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, PictureRepository.Instance.GetPicture(ActiveModule.ModuleID, id));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddContent)]
|
||||||
|
public HttpResponseMessage EditPicture(int id, [FromBody] string serializedData)
|
||||||
|
{
|
||||||
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<PictureBase>(serializedData);
|
||||||
|
var original = PictureRepository.Instance.GetPicture(ActiveModule.ModuleID, data.PictureId);
|
||||||
|
if (original == null)
|
||||||
|
{
|
||||||
|
return ServiceError("Picture not found.");
|
||||||
|
}
|
||||||
|
if (!this.InMemoriamModuleContext.Security.IsFamily && original.CreatedByUserID != UserInfo.UserID)
|
||||||
|
{
|
||||||
|
return AccessViolation("You do not have permission to edit this picture.");
|
||||||
|
}
|
||||||
|
original.ReadEditedPictureBase(data);
|
||||||
|
PictureRepository.Instance.UpdatePicture(original.GetPictureBase(), UserInfo.UserID);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, PictureRepository.Instance.GetPicture(PortalSettings.PortalId, data.PictureId));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddContent)]
|
||||||
|
public HttpResponseMessage DeletePicture(int id)
|
||||||
|
{
|
||||||
|
var original = PictureRepository.Instance.GetPicture(ActiveModule.ModuleID, id);
|
||||||
|
if (original == null)
|
||||||
|
{
|
||||||
|
return ServiceError("Picture not found.");
|
||||||
|
}
|
||||||
|
if (!this.InMemoriamModuleContext.Security.IsFamily && original.CreatedByUserID != UserInfo.UserID)
|
||||||
|
{
|
||||||
|
return AccessViolation("You do not have permission to edit this picture.");
|
||||||
|
}
|
||||||
|
PictureRepository.Instance.DeletePicture(ActiveModule.ModuleID, id);
|
||||||
|
PicturesService.DeletePicture(PortalSettings.HomeDirectoryMapPath, ActiveModule.ModuleID, original.ImageIdentifier);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
70
Server/InMemoriam/Api/StoriesController.cs
Normal file
70
Server/InMemoriam/Api/StoriesController.cs
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
using Bring2mind.InMemoriam.Common;
|
||||||
|
using Bring2mind.InMemoriam.Core.Models.Stories;
|
||||||
|
using Bring2mind.InMemoriam.Core.Repositories;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Web.Http;
|
||||||
|
|
||||||
|
namespace Bring2mind.InMemoriam.Api
|
||||||
|
{
|
||||||
|
public class StoriesController : InMemoriamApiController
|
||||||
|
{
|
||||||
|
[HttpGet]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.View)]
|
||||||
|
public HttpResponseMessage GetStories()
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, StoryRepository.Instance.GetStories(ActiveModule.ModuleID).OrderByDescending(s => s.CreatedOnDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddContent)]
|
||||||
|
public HttpResponseMessage EditStory(int id, [FromBody] string data)
|
||||||
|
{
|
||||||
|
var story = Newtonsoft.Json.JsonConvert.DeserializeObject<StoryBase>(data);
|
||||||
|
if (story == null || string.IsNullOrEmpty(story.Title.Trim()) || string.IsNullOrEmpty(story.Contents.Trim()))
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid story data");
|
||||||
|
}
|
||||||
|
if (id == -1)
|
||||||
|
{
|
||||||
|
story.ModuleId = ActiveModule.ModuleID;
|
||||||
|
story = StoryRepository.Instance.AddStory(story, UserInfo.UserID);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, StoryRepository.Instance.GetStory(ActiveModule.ModuleID, story.StoryId));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var originalStory = StoryRepository.Instance.GetStory(ActiveModule.ModuleID, id);
|
||||||
|
if (originalStory == null)
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.NotFound, "Story not found");
|
||||||
|
}
|
||||||
|
if (!this.InMemoriamModuleContext.Security.IsFamily && originalStory.CreatedByUserID != UserInfo.UserID)
|
||||||
|
{
|
||||||
|
return AccessViolation("You are not allowed to edit this story");
|
||||||
|
}
|
||||||
|
originalStory.ReadEditedStoryBase(story);
|
||||||
|
StoryRepository.Instance.UpdateStory(originalStory, UserInfo.UserID);
|
||||||
|
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, StoryRepository.Instance.GetStory(ActiveModule.ModuleID, id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[InMemoriamAuthorize(SecurityAccessLevel.AddContent)]
|
||||||
|
public HttpResponseMessage DeleteStory(int id)
|
||||||
|
{
|
||||||
|
var story = StoryRepository.Instance.GetStory(ActiveModule.ModuleID, id);
|
||||||
|
if (story == null)
|
||||||
|
{
|
||||||
|
return Request.CreateResponse(HttpStatusCode.NotFound, "Story not found");
|
||||||
|
}
|
||||||
|
if (!this.InMemoriamModuleContext.Security.IsFamily && story.CreatedByUserID != UserInfo.UserID)
|
||||||
|
{
|
||||||
|
return AccessViolation("You are not allowed to delete this story");
|
||||||
|
}
|
||||||
|
StoryRepository.Instance.DeleteStory(ActiveModule.ModuleID, story.StoryId);
|
||||||
|
return Request.CreateResponse(HttpStatusCode.OK, "Story deleted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
192
Server/InMemoriam/App_LocalResources/ClientResources.resx
Normal file
192
Server/InMemoriam/App_LocalResources/ClientResources.resx
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Add" xml:space="preserve">
|
||||||
|
<value>Add</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddImage" xml:space="preserve">
|
||||||
|
<value>Add Picture</value>
|
||||||
|
</data>
|
||||||
|
<data name="By" xml:space="preserve">
|
||||||
|
<value>by</value>
|
||||||
|
</data>
|
||||||
|
<data name="Cancel" xml:space="preserve">
|
||||||
|
<value>Cancel</value>
|
||||||
|
</data>
|
||||||
|
<data name="Contents" xml:space="preserve">
|
||||||
|
<value>Contents</value>
|
||||||
|
</data>
|
||||||
|
<data name="Created" xml:space="preserve">
|
||||||
|
<value>Created</value>
|
||||||
|
</data>
|
||||||
|
<data name="Date" xml:space="preserve">
|
||||||
|
<value>Date</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve">
|
||||||
|
<value>Day</value>
|
||||||
|
</data>
|
||||||
|
<data name="Delete" xml:space="preserve">
|
||||||
|
<value>Delete</value>
|
||||||
|
</data>
|
||||||
|
<data name="DeleteConfirm" xml:space="preserve">
|
||||||
|
<value>Do you wish to delete this?</value>
|
||||||
|
</data>
|
||||||
|
<data name="Description" xml:space="preserve">
|
||||||
|
<value>Description</value>
|
||||||
|
</data>
|
||||||
|
<data name="Edit" xml:space="preserve">
|
||||||
|
<value>Edit</value>
|
||||||
|
</data>
|
||||||
|
<data name="EditStory" xml:space="preserve">
|
||||||
|
<value>Edit Story</value>
|
||||||
|
</data>
|
||||||
|
<data name="Friends" xml:space="preserve">
|
||||||
|
<value>Friends</value>
|
||||||
|
</data>
|
||||||
|
<data name="Month" xml:space="preserve">
|
||||||
|
<value>Month</value>
|
||||||
|
</data>
|
||||||
|
<data name="Private" xml:space="preserve">
|
||||||
|
<value>Private (to you and family)</value>
|
||||||
|
</data>
|
||||||
|
<data name="Public" xml:space="preserve">
|
||||||
|
<value>Public</value>
|
||||||
|
</data>
|
||||||
|
<data name="Save" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectJpg" xml:space="preserve">
|
||||||
|
<value>Select jpg file</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderEmail" xml:space="preserve">
|
||||||
|
<value>Sender Email (not publically visible)</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderName" xml:space="preserve">
|
||||||
|
<value>Sender Name</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title" xml:space="preserve">
|
||||||
|
<value>Title</value>
|
||||||
|
</data>
|
||||||
|
<data name="Visibility" xml:space="preserve">
|
||||||
|
<value>Visibility</value>
|
||||||
|
</data>
|
||||||
|
<data name="Year" xml:space="preserve">
|
||||||
|
<value>Year</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
129
Server/InMemoriam/App_LocalResources/Home.resx
Normal file
129
Server/InMemoriam/App_LocalResources/Home.resx
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="InPictures.Text" xml:space="preserve">
|
||||||
|
<value>In Pictures</value>
|
||||||
|
</data>
|
||||||
|
<data name="InWords.Text" xml:space="preserve">
|
||||||
|
<value>In Words</value>
|
||||||
|
</data>
|
||||||
|
<data name="Messages.Text" xml:space="preserve">
|
||||||
|
<value>Condolences</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
129
Server/InMemoriam/App_LocalResources/Settings.resx
Normal file
129
Server/InMemoriam/App_LocalResources/Settings.resx
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="BasicSettings.Text" xml:space="preserve">
|
||||||
|
<value>Basic Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="View.Help" xml:space="preserve">
|
||||||
|
<value>Select view to load for this module</value>
|
||||||
|
</data>
|
||||||
|
<data name="View.Text" xml:space="preserve">
|
||||||
|
<value>View</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Add" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Toevoegen</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddImage" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Afbeelding toevoegen</value>
|
||||||
|
</data>
|
||||||
|
<data name="By" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>door</value>
|
||||||
|
</data>
|
||||||
|
<data name="Cancel" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Annuleren</value>
|
||||||
|
</data>
|
||||||
|
<data name="Contents" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Inhoud</value>
|
||||||
|
</data>
|
||||||
|
<data name="Created" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Gemaakt</value>
|
||||||
|
</data>
|
||||||
|
<data name="Date" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Datum</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Dag</value>
|
||||||
|
</data>
|
||||||
|
<data name="Delete" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Verwijderen</value>
|
||||||
|
</data>
|
||||||
|
<data name="DeleteConfirm" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Wilt u dit verwijderen?</value>
|
||||||
|
</data>
|
||||||
|
<data name="Description" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Beschrijving</value>
|
||||||
|
</data>
|
||||||
|
<data name="Edit" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Bewerking</value>
|
||||||
|
</data>
|
||||||
|
<data name="EditStory" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Verhaal bewerken</value>
|
||||||
|
</data>
|
||||||
|
<data name="Friends" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Vrienden</value>
|
||||||
|
</data>
|
||||||
|
<data name="Month" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Maand</value>
|
||||||
|
</data>
|
||||||
|
<data name="Private" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Privé (voor jou en je familie)</value>
|
||||||
|
</data>
|
||||||
|
<data name="Public" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Openbaar</value>
|
||||||
|
</data>
|
||||||
|
<data name="Save" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Redden</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectJpg" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Selecteer jpg-bestand</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderEmail" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>E-mail van de afzender (niet openbaar zichtbaar)</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderName" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Naam van de afzender</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Titel</value>
|
||||||
|
</data>
|
||||||
|
<data name="Visibility" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Zichtbaarheid</value>
|
||||||
|
</data>
|
||||||
|
<data name="Year" xml:space="preserve" lastModified="2025-02-12 23:39:47">
|
||||||
|
<value>Jaar</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Add" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Добавлять</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddImage" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Добавить картинку</value>
|
||||||
|
</data>
|
||||||
|
<data name="By" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>к</value>
|
||||||
|
</data>
|
||||||
|
<data name="Cancel" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Отмена</value>
|
||||||
|
</data>
|
||||||
|
<data name="Contents" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Содержание</value>
|
||||||
|
</data>
|
||||||
|
<data name="Created" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Созданный</value>
|
||||||
|
</data>
|
||||||
|
<data name="Date" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Дата</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>День</value>
|
||||||
|
</data>
|
||||||
|
<data name="Delete" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Удалить</value>
|
||||||
|
</data>
|
||||||
|
<data name="DeleteConfirm" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Вы хотите это удалить?</value>
|
||||||
|
</data>
|
||||||
|
<data name="Description" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Описание</value>
|
||||||
|
</data>
|
||||||
|
<data name="Edit" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Редактировать</value>
|
||||||
|
</data>
|
||||||
|
<data name="EditStory" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Редактировать историю</value>
|
||||||
|
</data>
|
||||||
|
<data name="Friends" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Друзья</value>
|
||||||
|
</data>
|
||||||
|
<data name="Month" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Месяц</value>
|
||||||
|
</data>
|
||||||
|
<data name="Private" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Конфиденциально (для вас и вашей семьи)</value>
|
||||||
|
</data>
|
||||||
|
<data name="Public" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Публичный</value>
|
||||||
|
</data>
|
||||||
|
<data name="Save" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Сохранять</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectJpg" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Выберите файл jpg</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderEmail" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Адрес электронной почты отправителя (не виден публично)</value>
|
||||||
|
</data>
|
||||||
|
<data name="SenderName" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Имя отправителя</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Заголовок</value>
|
||||||
|
</data>
|
||||||
|
<data name="Visibility" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Видимость</value>
|
||||||
|
</data>
|
||||||
|
<data name="Year" xml:space="preserve" lastModified="2025-02-12 23:41:06">
|
||||||
|
<value>Год</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user