diff --git a/.gitignore b/.gitignore
index 9672f5877..442f8578a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@
packages
# NPM packages
+ngClient/npm-debug.log
ngClient/node_modules
# Bower packages
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85d551fc3..b6dc60f60 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,16 @@
### Changelog
+**0.59.0**
+
+* Contributors page
+https://github.com/forCrowd/WealthEconomy/issues/69
+* Sticky footer
+* Disqus minor fix
+* Menu minor layout fix
+* npm jshint package missing fix
+* Smtp settings initial port value fix
+* DatabaseConfig InitializeDatabase fix
+
**0.58.0**
* Description field for resource pool
diff --git a/DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs b/DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs
deleted file mode 100644
index b72b383af..000000000
--- a/DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-namespace forCrowd.WealthEconomy.DataObjects.Migrations
-{
- using System.CodeDom.Compiler;
- using System.Data.Entity.Migrations;
- using System.Data.Entity.Migrations.Infrastructure;
- using System.Resources;
-
- [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
- public sealed partial class Initial_Manual : IMigrationMetadata
- {
- private readonly ResourceManager Resources = new ResourceManager(typeof(Initial_Manual));
-
- string IMigrationMetadata.Id
- {
- get { return "201603261149481_Initial_Manual"; }
- }
-
- string IMigrationMetadata.Source
- {
- get { return null; }
- }
-
- string IMigrationMetadata.Target
- {
- get { return Resources.GetString("Target"); }
- }
- }
-}
diff --git a/DataObjects/Migrations/201603261149481_Initial_Manual.cs b/DataObjects/Migrations/201603261149481_Initial_Manual.cs
deleted file mode 100644
index df21d43e8..000000000
--- a/DataObjects/Migrations/201603261149481_Initial_Manual.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-namespace forCrowd.WealthEconomy.DataObjects.Migrations
-{
- using System.Data.Entity.Migrations;
- using System.Text;
-
- public partial class Initial_Manual : DbMigration
- {
- public override void Up()
- {
- // ResourcePool ResourcePoolRateTotal
- Sql(PrepareDropFunctionBlock("ResourcePool", "ResourcePoolRateTotal", "getResourcePoolRateTotal"));
- Sql(PrepareGetResourcePoolRateTotalFunctionBlock());
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN ResourcePoolRateTotal;");
- Sql("ALTER TABLE dbo.ResourcePool ADD ResourcePoolRateTotal AS dbo.getResourcePoolRateTotal(Id);");
-
- // ResourcePool ResourcePoolRateCount
- Sql(PrepareDropFunctionBlock("ResourcePool", "ResourcePoolRateCount", "getResourcePoolRateCount"));
- Sql(PrepareGetResourcePoolRateCountFunctionBlock());
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN ResourcePoolRateCount;");
- Sql("ALTER TABLE dbo.ResourcePool ADD ResourcePoolRateCount AS dbo.getResourcePoolRateCount(Id);");
-
- // ResourcePool RatingCount
- Sql(PrepareDropFunctionBlock("ResourcePool", "RatingCount", "getResourcePoolRatingCount"));
- Sql(PrepareGetResourcePoolRatingCountFunctionBlock());
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN RatingCount;");
- Sql("ALTER TABLE dbo.ResourcePool ADD RatingCount AS dbo.getResourcePoolRatingCount(Id);");
-
- // ElementField IndexRatingTotal
- Sql(PrepareDropFunctionBlock("ElementField", "IndexRatingTotal", "getElementFieldIndexRatingTotal"));
- Sql(PrepareGetElementFieldIndexRatingTotalFunctionBlock());
- Sql("ALTER TABLE dbo.ElementField DROP COLUMN IndexRatingTotal;");
- Sql("ALTER TABLE dbo.ElementField ADD IndexRatingTotal AS dbo.getElementFieldIndexRatingTotal(Id);");
-
- // ElementField IndexRatingCount
- Sql(PrepareDropFunctionBlock("ElementField", "IndexRatingCount", "getElementFieldIndexRatingCount"));
- Sql(PrepareGetElementFieldIndexRatingCountFunctionBlock());
- Sql("ALTER TABLE dbo.ElementField DROP COLUMN IndexRatingCount;");
- Sql("ALTER TABLE dbo.ElementField ADD IndexRatingCount AS dbo.getElementFieldIndexRatingCount(Id);");
-
- // ElementCell StringValue
- Sql(PrepareDropFunctionBlock("ElementCell", "StringValue", "getElementCellStringValue"));
- Sql(PrepareGetElementCellStringValueFunctionBlock());
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN StringValue;");
- Sql("ALTER TABLE dbo.ElementCell ADD StringValue AS dbo.getElementCellStringValue(Id);");
-
- // ElementCell NumericValueTotal
- Sql(PrepareDropFunctionBlock("ElementCell", "NumericValueTotal", "getElementCellNumericValueTotal"));
- Sql(PrepareGetElementCellNumericValueTotalFunctionBlock());
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN NumericValueTotal;");
- Sql("ALTER TABLE dbo.ElementCell ADD NumericValueTotal AS dbo.getElementCellNumericValueTotal(Id);");
-
- // ElementCell NumericValueCount
- Sql(PrepareDropFunctionBlock("ElementCell", "NumericValueCount", "getElementCellNumericValueCount"));
- Sql(PrepareGetElementCellNumericValueCountFunctionBlock());
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN NumericValueCount;");
- Sql("ALTER TABLE dbo.ElementCell ADD NumericValueCount AS dbo.getElementCellNumericValueCount(Id);");
- }
-
- public override void Down()
- {
- // ResourcePool ResourcePoolRateTotal
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN ResourcePoolRateTotal;");
- Sql("ALTER TABLE dbo.ResourcePool ADD ResourcePoolRateTotal [decimal](18,2);");
- Sql("DROP FUNCTION dbo.getResourcePoolRateTotal;");
-
- // ResourcePool ResourcePoolRateCount
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN ResourcePoolRateCount;");
- Sql("ALTER TABLE dbo.ResourcePool ADD ResourcePoolRateCount int;");
- Sql("DROP FUNCTION dbo.getResourcePoolRateCount;");
-
- // ResourcePool RatingCount
- Sql("ALTER TABLE dbo.ResourcePool DROP COLUMN RatingCount;");
- Sql("ALTER TABLE dbo.ResourcePool ADD RatingCount int;");
- Sql("DROP FUNCTION dbo.getResourcePoolRatingCount;");
-
- // ElementField IndexRatingTotal
- Sql("ALTER TABLE dbo.ElementField DROP COLUMN IndexRatingTotal;");
- Sql("ALTER TABLE dbo.ElementField ADD IndexRatingTotal [decimal](18,2);");
- Sql("DROP FUNCTION dbo.getElementFieldIndexRatingTotal;");
-
- // ElementField IndexRatingCount
- Sql("ALTER TABLE dbo.ElementField DROP COLUMN IndexRatingCount;");
- Sql("ALTER TABLE dbo.ElementField ADD IndexRatingCount int;");
- Sql("DROP FUNCTION dbo.getElementFieldIndexRatingCount;");
-
- // ElementCell StringValue
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN StringValue;");
- Sql("ALTER TABLE dbo.ElementCell ADD StringValue [nvarchar](MAX);");
- Sql("DROP FUNCTION dbo.getElementCellStringValue;");
-
- // ElementCell NumericValueTotal
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN NumericValueTotal;");
- Sql("ALTER TABLE dbo.ElementCell ADD NumericValueTotal [decimal](18,2);");
- Sql("DROP FUNCTION dbo.getElementCellNumericValueTotal;");
-
- // ElementCell NumericValueCount
- Sql("ALTER TABLE dbo.ElementCell DROP COLUMN NumericValueCount;");
- Sql("ALTER TABLE dbo.ElementCell ADD NumericValueCount int;");
- Sql("DROP FUNCTION dbo.getElementCellNumericValueCount;");
- }
-
- string PrepareGetResourcePoolRateTotalFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getResourcePoolRateTotal(@resourcePoolId int)");
- sbOutput.AppendLine("RETURNS decimal");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result decimal");
- sbOutput.AppendLine(" SELECT @result = ISNULL(SUM(ResourcePoolRate), 0) FROM UserResourcePool WHERE ResourcePoolId = @resourcePoolId AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetResourcePoolRateCountFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getResourcePoolRateCount(@resourcePoolId int)");
- sbOutput.AppendLine("RETURNS int");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result int");
- sbOutput.AppendLine(" SELECT @result = COUNT(ResourcePoolRate) FROM UserResourcePool WHERE ResourcePoolId = @resourcePoolId AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetResourcePoolRatingCountFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getResourcePoolRatingCount(@resourcePoolId int)");
- sbOutput.AppendLine("RETURNS int");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result int");
- sbOutput.AppendLine(" SELECT @result = COUNT(Id) FROM [User] WHERE DeletedOn IS NULL AND Id IN (");
- sbOutput.AppendLine(" SELECT T1.UserId");
- sbOutput.AppendLine(" FROM UserElementCell T1");
- sbOutput.AppendLine(" JOIN ElementCell T2 ON T1.ElementCellId = T2.Id");
- sbOutput.AppendLine(" JOIN ElementField T3 ON T2.ElementFieldId = T3.Id");
- sbOutput.AppendLine(" JOIN Element T4 ON T3.ElementId = T4.Id");
- sbOutput.AppendLine(" WHERE T4.ResourcePoolId = @ResourcePoolId");
- sbOutput.AppendLine(" AND T3.IndexEnabled = 1");
- sbOutput.AppendLine(" AND T1.DeletedOn IS NULL");
- sbOutput.AppendLine(" UNION ALL");
- sbOutput.AppendLine(" SELECT T1.UserId");
- sbOutput.AppendLine(" FROM UserElementField T1");
- sbOutput.AppendLine(" JOIN ElementField T2 ON T1.ElementFieldId = T2.Id");
- sbOutput.AppendLine(" JOIN Element T3 ON T2.ElementId = T3.Id");
- sbOutput.AppendLine(" WHERE T3.ResourcePoolId = @ResourcePoolId");
- sbOutput.AppendLine(" AND T1.DeletedOn IS NULL");
- sbOutput.AppendLine(" UNION ALL");
- sbOutput.AppendLine(" SELECT T1.UserId");
- sbOutput.AppendLine(" FROM UserResourcePool T1");
- sbOutput.AppendLine(" JOIN ResourcePool T2 ON T1.ResourcePoolId = T2.Id");
- sbOutput.AppendLine(" WHERE T1.ResourcePoolId = @ResourcePoolId");
- sbOutput.AppendLine(" AND T2.UseFixedResourcePoolRate = 0");
- sbOutput.AppendLine(" AND T1.DeletedOn IS NULL");
- sbOutput.AppendLine(" )");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetElementFieldIndexRatingTotalFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getElementFieldIndexRatingTotal(@elementFieldId int)");
- sbOutput.AppendLine("RETURNS decimal");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result decimal");
- sbOutput.AppendLine(" SELECT @result = ISNULL(SUM(Rating), 0) FROM UserElementField WHERE ElementFieldId = @elementFieldId AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetElementFieldIndexRatingCountFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getElementFieldIndexRatingCount(@elementFieldId int)");
- sbOutput.AppendLine("RETURNS int");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result int");
- sbOutput.AppendLine(" SELECT @result = COUNT(Rating) FROM UserElementField WHERE ElementFieldId = @elementFieldId AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetElementCellStringValueFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getElementCellStringValue(@elementCellId int)");
- sbOutput.AppendLine("RETURNS nvarchar(MAX)");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result nvarchar(MAX)");
- sbOutput.AppendLine(" SELECT @result = StringValue FROM UserElementCell WHERE ElementCellId = @elementCellId AND NOT StringValue IS NULL AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetElementCellNumericValueTotalFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getElementCellNumericValueTotal(@elementCellId int)");
- sbOutput.AppendLine("RETURNS decimal");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result decimal");
- sbOutput.AppendLine(" SELECT @result = ");
- sbOutput.AppendLine(" CASE T3.DataType");
- sbOutput.AppendLine(" WHEN 1 THEN NULL -- String");
- sbOutput.AppendLine(" WHEN 2 THEN ISNULL(SUM(CAST(T1.BooleanValue AS decimal)), 0) -- Boolean");
- sbOutput.AppendLine(" WHEN 3 THEN ISNULL(SUM(CAST(T1.IntegerValue AS decimal)), 0) -- Integer");
- sbOutput.AppendLine(" WHEN 4 THEN ISNULL(SUM(T1.DecimalValue), 0) -- Decimal");
- sbOutput.AppendLine(" WHEN 5 THEN ISNULL(SUM(CAST(T1.DateTimeValue AS decimal)), 0) -- DateTime");
- sbOutput.AppendLine(" WHEN 6 THEN NULL -- Element");
- sbOutput.AppendLine(" WHEN 11 THEN ISNULL(SUM(T1.DecimalValue), 0) -- DirectIncome");
- sbOutput.AppendLine(" WHEN 12 THEN NULL -- Multiplier");
- sbOutput.AppendLine(" END");
- sbOutput.AppendLine(" FROM UserElementCell T1");
- sbOutput.AppendLine(" JOIN ElementCell T2 ON T1.ElementCellId = T2.Id");
- sbOutput.AppendLine(" JOIN ElementField T3 ON T2.ElementFieldId = T3.Id");
- sbOutput.AppendLine(" WHERE T1.ElementCellId = @elementCellId AND T1.DeletedOn IS NULL");
- sbOutput.AppendLine(" GROUP By T3.DataType");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareGetElementCellNumericValueCountFunctionBlock()
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendLine("CREATE FUNCTION dbo.getElementCellNumericValueCount(@elementCellId int)");
- sbOutput.AppendLine("RETURNS int");
- sbOutput.AppendLine("AS");
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendLine(" DECLARE @result int");
- sbOutput.AppendLine(" SELECT @result = COUNT(DecimalValue) FROM UserElementCell WHERE ElementCellId = @elementCellId AND NOT DecimalValue IS NULL AND DeletedOn IS NULL");
- sbOutput.AppendLine(" RETURN @result");
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
-
- string PrepareDropFunctionBlock(string tableName, string columnName, string functionName)
- {
- var sbOutput = new StringBuilder();
- sbOutput.AppendFormat("IF object_id(N'{0}', N'FN') IS NOT NULL", functionName).AppendLine();
- sbOutput.AppendLine("BEGIN");
- sbOutput.AppendFormat(" IF COLUMNPROPERTY(object_id('{0}'), '{1}', 'IsComputed') = 1", tableName, columnName).AppendLine();
- sbOutput.AppendLine(" BEGIN");
- sbOutput.AppendFormat(" ALTER TABLE dbo.{0} DROP COLUMN {1};", tableName, columnName).AppendLine();
- sbOutput.AppendFormat(" ALTER TABLE dbo.{0} ADD {1} [decimal](18,2);", tableName, columnName).AppendLine();
- sbOutput.AppendLine(" END");
- sbOutput.AppendFormat(" DROP FUNCTION {0}", functionName).AppendLine();
- sbOutput.AppendLine("END");
- return sbOutput.ToString();
- }
- }
-}
diff --git a/DataObjects/Migrations/201603261149481_Initial_Manual.resx b/DataObjects/Migrations/201603261149481_Initial_Manual.resx
deleted file mode 100644
index debe35231..000000000
--- a/DataObjects/Migrations/201603261149481_Initial_Manual.resx
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- H4sIAAAAAAAEAO09y27kOJL3BfYfEnnaHdQ4bTd60FOwZ+B22TNGV5WNctXs3AyVkra1rUeOpKyysdgv28N+0v7CUs/kI4IPiVIqe3QxnCIZjAgGI4JkBPl///O/Z39+icLFN5JmQRKfL0+OjpcLEvvJOoifzpfb/PH3Py3//Kd//Zezq3X0svhbU++Hoh5tGWfny+c837xdrTL/mURedhQFfppkyWN+5CfRylsnq9Pj4z+uTk5WhIJYUliLxdmnbZwHESl/0J+XSeyTTb71wg/JmoRZ/Z2W3JdQFx+9iGQbzyfny8ckvUyT7+uj/yBemD9f+UmcRK9HP2+zICZZdvv1P4mfZ8vFRRh4FLt7Ej4uF14cJ7mXU9zffsnIfZ4m8dP9hn7wws+vG0LrPXphRmqa3u6qm5J3fFqQt9o1bED52yxPIkuAJz/U/FqJzTtxfdnyk3L0inI+fy2oLrl6vrwKSUTifLkQ+3p7GaZFPVOeH9WQ3izM6r9p5en46MfTo+Oj4zeLy22Yb1NyHpNtnnrhm8Xd9msY+L+Q18/JryQ+j7dhyJJDCaJl3Af66S5NNiTNXz+Rx5rIm/VyseLbrcSGbTOmTUX/TZz/cLpcfKSde19D0koLw6v7PEnJX0hMUi8n6zsvz0kaFzBIyW+pd6GvTyRLtqlP7pIk1PerhlX8bSBQUaczebn44L28J/FT/ny+/JFO3evghaybDzXQL3FA5z1tk6dbYt3pTfbBC+JWlqref6bUEC+2BnaZkoKLt3ED6B39+TmI7NGi+iR4DJyAekdCgiClGdvkey3oLV+C2EupTBR6b5umVOG+fihZX44LN1o/wYPVQRQvk2izzYk8ET5634KnsqmAeD2a1wEJ1/eEjuonEpb1sudgU6nWI7bOQzv812kSfUpCAUZT/vDZS58KeJ8TRaX7ckJYY3uTk0iDbFFFgStbjKHK1bHF9M5LDdn6IFaVkBVqtLgI+IrVGrJMUWb1E4gwW6FhjIAxUkViMVYPYvPZamfPTKxcyQB3pq4EN9s7e3vXTKNDNHVU73tFl602f83tgdBJQ2WCrDFGqFtTJ7ak629euCWStdVY6nhNXq7iAtd1X0Ndwrr0Qn9bKYTebCkB3idp3p/BFMhtuiZpf3w+Udrip89U9MPW9hM/iIqfdyn9r148UVt973sF7NNeBhnH4TLZ7ryrWlLcdTS7XVNyu9y5W4hPAPtkllhekjDUODFFlQfe/koIS3Uwx0uuaOt9CZrXrfuFYI15aaY4U32fmnjjYj2U7cqKEhXq2i78smJY3bllBbTZK+vslZXD2tc1YxZKfUFVnh3n6wDOHv3XyNtzZy8/biOSBn6J2N68AxaJYd0D0WWFRnZ2MA7HwaiNgmvDjXgbuIXvsMFjurvTeifKTZ66lsleT1O1p9NhREPlM2hI4CopKeBr9vBAVC6fUO2BM++g+yFWUzkfUl0Xrkc1Fq5cjwLa7HpMdUPodJgdodmuTcmuudr6RwwZeDzgftXc3YwZ4C3aC7uTC1PsOxgwFe6wqeuk+gWb4kD9CxCnaAIKFGUzAFZlKOliOJqeHKwfGxSms35U91XvpHfbmM/JE0m5pkbLqnq5yTXUL0G1hxylseCBGlqQ2R5OyR5WGm4YZ13U1yaOvc2SwwjvqiKOcPFbi2lZqbdRcWRJpmg+pr6CuMku4iR+jZJt1vdY869edudl2fcklU9INaaGWpWQ0CEseT24tbkO0ix3cwiu0cPBeh2SMXp6741D0cckJ9ngAzRbwjEtoWj/Ii8IFUN8+uMfHAxx2Qul/zFIo/4RFY3eoSroeXDpvCd00Khqvc+9aDN4b3fPSUw+bqOvu5iMMfpyNjSfvyfXnk9F0lHwzPvE/zXZ5lfxuph/X3Lfdjq2AJygc+H71LG4psJM1tBBkiW4wo3R7saZzT9dz6gHeRl6QZShPuRDU867jvVn0GNsymx92ffJUxArMGnKBUyqzzAmdVmfSE5sE4eLwBS9a6lQHcDJOd/GSFI4Cm7VxQKzyq8wr6qiLguQDmceRssR3SlHJ7Z1DhNRoLyroA8L6Yy0iVCK9UCk9cIJ1+p1kFRAKPWCo9VfCWteAtovAWdve4/etotN31Ly2dDf4RZmRU8DbQl329EqMQKV2q4EtG5Mce/9q9KpcKTGSlhTVGMlYvTzt6AMDzc4D2kqU/BG9eGjFr2yFDBDBfPkFJnf/c6xOTLH7tyJ/pgNwBQOHpR6rpRxUM/tSkA9xxT30nN8LltvVceCm6K2m7rT5mLeqxXWQFE/+4k1uomD4toCy8Nee11cYs7K9icvl0+0LeGK8PYWNS0iMmzk9Jy89U9j+q6Y1Ge3adKiSdSlU/c21pa7gEr8UKs9yM4Qb+EVO0TcD+1OEfej946RYzdEBDlFV8QiAk28EGUfIWguL2XBLKlz0z3bgUnYAe2FGY6UFrRQ0qs4Jwu5DpvxWmzd7GIVwF2pVArq0FUpJWFvKrTue97UOXyNVk4qTBfQwoeqhqADmgJ47relbjVTARHUSE0Bjo2D/SU32meqmmfq+0mzutjjIeC+I36K2QsHjrSTmwsc2X2V16+7Ile5Rq5uHxNBTlFN2GcbtddO7DHdyMnVF9V237zC+00ouO63KChvzTG/jEeRuKK4usdlko1NjJgWW2v/6iLLEj8o0QM43ybz8vRexeuFyY1YlaESb9aiMka1YrChepAidL78ncRPDfx2K1GCL4I+WYr68Tau5tLiwq8ujL70Mt9byxOJ8mvNf6EqlRQ5soFXBKRnVJ8HcS7r3yD2g40XGhAgtDX0Bwvc2l7EkndkQ+LClTMYH5PumYsDZCzazgTO6Rh1tmKkzkgY5btSNAKjuDhFEpoqI89aJhWXqpnJ/YnURx8JQ9EZT8pQpltIGuKmjCtu3D0GGjGALzWQJKC6B8VayODbkg9H70H4jyeQ0NgckNaDLqmwkBfp1gcjoXQqOkb44WJtppldyafAr/2IqcAUG2mtb4zbu8TyF5OYCARyS4mRvB4fHcmG1KSbvYsdSPXIUgeyxAQH5LrCvQif6qYFTC6Mrl3YSYZQ3caSq3qyk8H9W3UDWkYQYIOxs9Cb8DU8I4ouk5qgkiEoT4EX0DpLyk40gfwGAew0xVDGeyTJk8fBpGN0w3YsKWvScVWyIOXmjigIMCaISBpKemfhEhgxkmQJRB+EWDH5BqrxhJIP+CGtc6PslBeQtHAQykvGeyQRk8fhIKSsyeBXqgwxnX9/yku4PKCbpHdXXjwjxlJePNGTFyssVhwbWG3g+G6Q+VjDUcRO+/qXdsvQkQBq2DSCMGpYYYKBOjx6HwKqNLCKSFAzoVSZWcWdD1O3tCjqY0vhwdlbPHRaZfcM4qh5kekqk4aZJnvQyJ2Ntpackcy4dgwPRn/CQfTGIqVaqziTWzt96sxD3KdiVDJ68sqRiXNEDSYQ9MhoojJ8eRyfUA6xFOUYQMaVHyhxYQyjK1FspK3ADI4xtVQb3q9UHHKsf5fRxIBCVnNoWe2uwES0x1Jc4hgcjnzprZ+cveFIvg5r1QCiPaZ8HZRBLJEt0NZszpVVprA3VyEyvkGUuTDWxhxH8UEIFB7XrRpagyBv8EDfOijZLEbcOAp0CgpPS85IwqodQxM8JhFKCkf4G4uUyhA7k9s9LT9RHPYhZAdnbdloF1OZAh5qGSS2ab8CJaEwrjxJTJ68ODWh0cJD7Nhow9UV8ZrdYjXRV9+7phP1idREiB1BstTcMEFAjNEcR8yuyjwz2ianLUha48JlzhaF5CUHcnXpdKjTdbM6W1kUlgI45QMvwcvFVZvdJoqgJG4ghFqUMDB1sRmsSotioKpSM0hVwDMGqSrVQJK0uwRNqmEAMUPgGDVuHoYAIdShXQZgmlcdQDB1kIUGDL+RLwHiiw1Q0sCTq5jALBfXCLByvaojEgFg1Fj2N1XyA08TRlHA8273ZixTFZiAcE4WZEPghNSWOHHaS2rRMANVBigv0njqzTkj5zzi3NHkR0IE4RmSMlGQWjCDiTMKFpXO3OKfHkYZhWf2QfSAuX0yKZAe1oIbQ4TAV46NeANm7+hoEhN43HBKzNcxE8+eTBMeV1bzTJHwhBIHpzz15Bic4DQYw8S1DwddZpmqOk6fohXENo0zYwx6FOaxj1LA/MJyQyQ6gOwQgSuN16VhCJAPIgCSYHSkvn0gDCYdTFiQ9/OFlAUdrigAhFiYax0pZi/nh4nGwukltIGAegHzxj3W0A+E0A813g1GyHhDMd7ycAlR3vbjLQRnG3GtA8XoXdQy9UahyBwhumBkhijVesMI5qCOCnDLqYY/mrmBx3D15skYc0RxZy08awwjNaVpoI/VFCg05pkaOsA/5YrYARtV+tZGtMD67tk1tJgxIWzQXEMC3PhpIYe4seNZ7TeoppUcmSayD4LRVRja8CpMCOD4K3mYpAgsE6wVYKDJ4JpwpfTDgUEwxkppNyd8FE+jxgdxNIBwFdlN4ANW7N0MPs5kQPHGgyXUazBddIX66Fi3c6TbFLSAPvweEngobMQ+g8mDH+s7Y9cYc0o6djZY4ZtzRz6gdrSmH5o1yBEqvmOkPGy1OW7V++M2h6v9J1dzw2R78teWna3u/WcSefWHs1Vx9yjZ5FsvLK4eDbOm4IO32QTxU7ZrWX9Z3G88nxJx+fv75eIlCuPsfPmc55u3q1VWgs6OosBPkyx5zI/8JFp562R1enz8x9XJySqqYKx8TueL55RtT3mSek9EKC2uMF2T6yDN8nde7n31intPL9eRVA0850SOWJou+aNMeQib85amfvF/1cbwRmME9I6/15TkokZJPQEkS2pJ2xZX7HopcBf5ZRJuoxg/BMdbi4lDLCRdUhEOtbo2m4VVfTGHcJN9oOPbTjOOQL7IHCZz0TALj/lsDou9apgFxn43h8bcNswCYz5bjChzATE3msx3GdrZShBMKWxBmhWCmhInmc0UxJwhV/MQhG8+GZHmw8xIJnaEBaIIKcFh9Z+Hhe4tuC4IZvvVHBIQG8OCNAidwWF/qd93rF+RZOEKRRYaKF6Tl6u4uHdbHE+uxBLipRf62+p2apmvcA3LHu6TNEdA74osxo22uU3L95u58dp9tsSvuk6+fipTQpEr7QS5fpcSgVyXzlbj8K0Gco7pymhA4M1tBtx6UJPRht8DdgMNzddCbS6ahIwRcgclDrN6QwVQ01yBhYHbRiQN/LIdoFGA4m6wAZ0CFHc3hgCPDe/7xPuYFddUFVcZYjKc4oLAmysuuPU/g687T5jJTRhxI3KASaPpwmDiaCEoli2pKPvNN+tJ1NyqC0wk7MJdHKZrO/1zkoTEiwGAfImNw5+TJ5ICEPkSm0lWPmwFQORLrBbP5ZtREEi+aFZSB66koNNNJ6qpoz4ay4LfZBdxEr9GyTYTd2mZAnN4f/WyOy/LviepgBZXYKHIKKNCQjlSvv4n6DKhzBxqeSwhOxzMZ4tJGKzXIZGBsd/Nob33IMR2Xy38qSQnwpjWn2Zl5UJZoeY88gJhGVt/soRxmcSPQRqJu5dimTnUZv7RqfjMw+RLbJbB/jYt1FbuRRtx+csVWWD5nMSELs6/ijuWXEEneAhH4RrmPXz+nlx7PlXi4G6zXGqhDRL/12SbX8Xrwt/4kvuCWpCLO8AGcBbLzKFe+D41gNdURMka2HQBiq1OCVJZN+6+TsqhQGPxnXgVVc5nN9cCaTuMfzFbEHsL4mZZWQ6zfI7EfLaEBayC2O+Tmn1oZoST2VelSnebfUhbXEvT6vTbt0A6wROKLCxi3eYX8ioYQrZgdHmdNcXUFsaa7Ijec0kF32A6qZsPY8/cyLo08yxnnOwF2a4Ob+KguKgE3H5jS+xjONhR+USnLhzOIdfqFvNWtAUODpEq3fsAfFmkikUfWLjDHOmg4tohaVApsWkgj6SnJtWDGFYfDhPFqtZEfTTQPNOmOdOQNCU3UwxIdzOdWmDTgadUfYc2P3Dwvdo4lFnQJyfogwl5RwG3E+55N0kPy+1ukvlaYf8xIoPlEej6MFTk3fIJnIaJOA4SrZYa0PJjnpcHYCakFEKxStt7/aX93aYQ1ul7XF5hyYEiS7CkPKtTCcV8vqrKctFsG54v71+znERHRYWj+3+El2FQpng1FT54cfBIsrw8rz9fnh6fnC4XF2HgZVXGZ52p+Fa85NQodfHkhyJ1kayjldjcPgGygJJla24dxKghfkYKyYq/kFdxhBs5Ut10e7YSG54BprO6RDIomFrqp78QOubFHLvz8pykcVGLlHguFx+3YVic31El6YWZfHGlZg3GdCVdOlvmY5wv/6ts+nZx8/cHvvWbRZla8nZxvPhva0Qq81R1H3/zUv/ZK67C9l7ek/gpfz5f/nhsDVPIOayAfw1ya0CMSquArOnPPCgwtoTE6rOeoBhthkMq7wbWyQCjySpI1LZ+a74gEneZRJttXhwTK9Fm9ZzJtIKerzjUucUERNtNq7bh5GbULoWwgktdhteSKks4QN6gHYskABirTCaAkG0I6gkTOHyKYXd1AycU9uO4kEnYc/h2aYQOsOKSB2tVVsXuFk4E/S8rvYGTn+gUpR4aLT61UkvGQ8ftwOsVQ9e+ZmsyljWRA/sP3Zi0iz0Ldfnl79yVrTyk1tiUmWqtFj15s7jJvsTBP7YUwGc67B0MkJADNzDGpw4w5vIkeMv5b5H38u/OVQGQ6rgnBQgkRg6nAZEsyX4uAC8OHdyAWS+PpZflbMVD18uTdfJPO3j580QYfCJId7VBT/ykF8xmWL133GHWYLvO+JOAcOqhfq41PdnNhKpVr2kg4N1pJlaNe6Gh9x/sRJVPs+yxLmVzKxnm2IHhEypN/RTLPvgMy34zfdZjo+ix34gl53Ifu2/ecCmPnaesmOXoQJkweY7Gm4ImcNmUR6eAd/mPTsHW+ZAOODrrl676BbDgVbak0pP9gy0JYtZk91nN50o6kB0hU9IBRC5T0i08JyyUUyK7wwJyIPsJu5j72B01INkR9LiMgO3SHMWJod1Cq1uWn6GtMXxm9fUHgFTDg3UKZhXvTsXvbXXIZD+6sPpM+qM1OKuJBGQNmk0kTZIg0OJOlQRovKegn64CZgpzf3L6k72VZqlwDHt/0juroKFXsXgWzMEarg7i+oUP6Kpl94ES4vRYEJycDnADDwB77oQPsr3O51ra76OZjj+SctndtUXyK/d0YolkYg53ajmHh/xW9L388tw0jl/UWY8TPn+ZTBgxpu6c69d5lo4zS6U8M/eTDsyPnPJkqxG2nGRlq3klMm2Z7yrvE1yBzNLibuus2x5wIUx72gPmH8ebhnelzpecsMLvEfu7C2+pW/ezPHWO6OxTTUxjYHOTeYUSkKVGNKSHF4XHMBt82fc5qfLYhnmwCQOf9ksHXkrgvo0r1i0u/GqSX3qZ761lPlHc1xoMaj0io1EX8Lj8TuqCKgFSvOcZeMVxcJanXiCn5N6lQewHGy8UqBfqGdrfgrAWoljyjmxIXBhWiEyT/hSPbZytWugCn3Vc4F4tNRIjKTxfJ0p2A3kiDaQEsIqelOFV34eUC/PBciMcyDsXtnZuXAEpIr0PR82UcekAFtX334iSQR4amqyOYUWomAPSa9D9xnFYidqfejIe5v1oJ+xltNElq3roewDBOj46mrT9mqqAGD6hN4qgCGkaDygt/QZ2IB0kJZkw2EhlQ4qa8dj3FDX9q2CWKS8jilkZVvQAxNPz4ykN4oiyVAX2iQjUXweRH+QtpUEEB3tdwWLPaSxZeYDemZgFZRYUUVDKcLtpK5UqyFFEoP568LKCPRoxQVl5gJ7PmAVlFhRWULggvNp1Uq2b+CgbZuz4gjGX5CbbTI4ESHNB+1BLLaOudDesjy9OkzVTnYT4wHSQtaju3V5xsqOI4J6mMpJDEAXZHkG2xlZPBm9WTFRPSfLmQlfhe4NTEI4xnZ/DUj4F3qUA4L5yGcbFaZjyw3iaRex/93EYTQK/IjCMsJj2hT18MZ7GKAQFiOib5WSWE0lOJuv97kNORjU+pnKyd4/3AXgFZhaSWUig40ouwG+Q0KzB5AjFRy78TcR3GTxTM9EgL0nehl8W7Vs4xlQ61kIxFeVTxkqMJgt7im3YgyQYBzXsVRBqZOvIqlJ6DUKrTLblzUKq5mBxTUTVOIJxxb9R1eR4iO9JSXJRP3vFC9NycdUmOIgyUr1Idb5cf03oqFc5Em2hJCwg+FoysD7qYkVHdQ2z3iqlhHVWlSr6qiqYdVUFJmJdVaWKrqoKmq4kdSt1J9WAupQqGXSL9IV3YAS1DlQBQddlGPy62KCT+uAa7KQuwzqpizWd8HvEUj98MdQVX8OAJE2PchWMQPuey1Um3GNZhPZUluo4CUPHIRtBlR1W1bxRqCC5ltAzo6BhzddmaCyYqoAKhDM5YGvekosqY4XtlhvDlK140szJlhOXcNI1SU79yYAgsJqUBQCqxs5s4NJzcA7gWTwux561VWxb0Ag5IbmJ+jejHMwR6EvInseez37Q8EGRKnGAbFDF9gOMME4F6EuKepnLwNA5TN1YwsShI1zAItWBBb6ArZZUzvNqm8FOVTfymtBphDYwsvogCGNCfRHasGBgB+RxzmzbDPZTO45bHZ2KjRsUvDp5wrBoSoBIo8BLDn3IGy8pUHnXXe15X+IxudUE3fQc4U4s6ijAeLgaItKG8W2Oxxxbx7UMHZo1Kg02rDSMTToTRwRJPhJlxI83szKtxhlYecpEiq3QlXDH8WzjXrBxhANjDoU0pYjCsRwuRHNg0uroAszAArEHB0AUfhqudvF1x+eOF/3YXpDo57vaBYEPbk1YMoho74n03TGlwXpvSMJHWNohh3L4il95fDfJLb/mEqz2yKktO1tV+6b1B/ozT1LviXxI1iTMyq9nq0/buLjWq/r1jmTB0w7EGYUZE5874mrr3MSPSXPoJmDUVBGvJyO5t/Zy7yLNg0fPz2lx8WhMebdaeS148XTRV7K+iW+3+WabU5JJ9DXknmYoTuxU/Z+tJJzPbjfFr8wFCRTNoLgJ7Tb+eRsUw1TjfQ1cToaAKI4C6xvPirHMi5vPnl5bSB+T2BBQzb72BPMziTYhBZbdxvfeN9IFNzoB35Mnz3/dvVWBAdEPBM/2s3eB95R6UVbD2LWnP6kMr6OXP/0/dca4JxVtAQA=
-
-
- dbo
-
-
\ No newline at end of file
diff --git a/SolutionItems/Properties/AssemblyInfo.cs b/SolutionItems/Properties/AssemblyInfo.cs
index fe716ca86..bdd41d9a0 100644
--- a/SolutionItems/Properties/AssemblyInfo.cs
+++ b/SolutionItems/Properties/AssemblyInfo.cs
@@ -30,5 +30,5 @@
//
// AssemblyFileVersion is not in use for the moment
//
-[assembly: AssemblyVersion("0.58.0")]
+[assembly: AssemblyVersion("0.59.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/WebApi/App_Start/DatabaseConfig.cs b/WebApi/App_Start/DatabaseConfig.cs
index e120e6740..69bbe0d02 100644
--- a/WebApi/App_Start/DatabaseConfig.cs
+++ b/WebApi/App_Start/DatabaseConfig.cs
@@ -6,7 +6,7 @@ public static class DatabaseConfig
{
public static void Initialize()
{
- //DbUtility.InitializeDatabase();
+ DbUtility.InitializeDatabase();
}
}
}
diff --git a/WebApi/Configs/Setup/system.net.mailSettings.smtp.config b/WebApi/Configs/Setup/system.net.mailSettings.smtp.config
index c448efebb..598326f51 100644
--- a/WebApi/Configs/Setup/system.net.mailSettings.smtp.config
+++ b/WebApi/Configs/Setup/system.net.mailSettings.smtp.config
@@ -1,4 +1,4 @@
-
+
diff --git a/ngClient/_system/css/main.css b/ngClient/_system/css/main.css
index c26f5015f..0665bd6fa 100644
--- a/ngClient/_system/css/main.css
+++ b/ngClient/_system/css/main.css
@@ -1,5 +1,11 @@
-body {
- font-size: 15px;
+html {
+ position: relative;
+ min-height: 100%;
+}
+
+body {
+ /* Margin bottom by footer height */
+ margin-bottom: 90px;
padding-top: 50px;
padding-bottom: 20px;
}
@@ -11,6 +17,23 @@ textarea {
max-width: 280px;
}
+hr {
+ border-color: #ddd;
+}
+
+.footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ /* Set the fixed height of the footer here */
+ height: 90px;
+}
+
+.footer .contacts a:hover,
+.footer .contacts a:focus {
+ text-decoration: none;
+}
+
.btn-link:hover,
.btn-link:focus {
text-decoration: none;
@@ -54,47 +77,9 @@ textarea {
/* #endregion */
-.versionText {
- border-top: 1px solid #333;
- font-size: 90%;
- margin-top: 20px;
- padding: 20px 0;
-}
-
-/* Brand styling - Probably css class names can be better, parent child structure? */
-.brandLink,
-.brandLink > a,
-.brandLink > a:focus,
-.brandLink > a:hover {
- text-decoration: none;
- line-height: 1em;
-}
-
-.brandLinkImage {
- margin-right: 10px;
- float: left;
-}
-
-.brandLinkText {
- font-family: 'Century Gothic';
- text-decoration: none;
- line-height: 1em;
-}
-
-.brandLinkPrimary {
- color: #b08b5f;
- font-size: 16px;
-}
-
-.brandLinkSecondary {
- color: #2B2A28;
- font-size: 11px;
-}
-
/* Set padding to keep content from hitting the edges */
.body-content {
- padding-left: 15px;
- padding-right: 15px;
+ padding: 20px 15px;
}
.bg-info {
@@ -457,6 +442,10 @@ input[type="checkbox"].input-validation-error {
}
/* Margin Spaces */
+.g-mt-10 {
+ margin-top: 5px;
+}
+
.g-mt-10 {
margin-top: 10px;
}
@@ -497,6 +486,10 @@ input[type="checkbox"].input-validation-error {
margin-top: 100px;
}
+.g-mb-10 {
+ margin-bottom: 5px;
+}
+
.g-mb-10 {
margin-bottom: 10px;
}
@@ -573,6 +566,10 @@ input[type="checkbox"].input-validation-error {
margin-bottom: 100px;
}
+.g-ml-5 {
+ margin-left: 5px;
+}
+
.g-ml-10 {
margin-left: 10px;
}
@@ -613,6 +610,10 @@ input[type="checkbox"].input-validation-error {
margin-left: 100px;
}
+.g-mr-5 {
+ margin-right: 5px;
+}
+
.g-mr-10 {
margin-right: 10px;
}
@@ -759,3 +760,44 @@ input[type="checkbox"].input-validation-error {
}
/* #endregion */
+
+/* #region table-contributors */
+
+.table-contributors {
+ border-left: none;
+}
+
+ .table-contributors thead {
+ border-bottom: solid 1px #ddd;
+ }
+
+ .table-contributors tbody tr {
+ height: 6em;
+ }
+
+ .table-contributors td {
+ vertical-align: middle !important;
+ }
+
+ .table-contributors td span {
+ display: block;
+ }
+
+ .table-contributors .nickname {
+ font-style: italic;
+ }
+
+ .table-contributors ul {
+ margin: 0;
+ }
+
+ .table-contributors a:active,
+ .table-contributors a:hover {
+ text-decoration: none;
+ }
+
+ .table-contributors td small {
+ font-style: italic;
+ }
+
+/* #endregion */
diff --git a/ngClient/_system/images/forCrowd_Logo_142x30.jpg b/ngClient/_system/images/forCrowd_Logo_142x30.jpg
new file mode 100644
index 000000000..5eda17fa3
Binary files /dev/null and b/ngClient/_system/images/forCrowd_Logo_142x30.jpg differ
diff --git a/ngClient/_system/js/app/config/route.js b/ngClient/_system/js/app/config/route.js
index 7208f85f4..f121bed52 100644
--- a/ngClient/_system/js/app/config/route.js
+++ b/ngClient/_system/js/app/config/route.js
@@ -27,6 +27,7 @@
.when('/_system/content/prologue', { title: 'Prologue', templateUrl: '/_system/views/content/prologue.html?v=0.51.0', enableDisqus: true, resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } })
.when('/_system/content/reason', { title: 'Reason', templateUrl: '/_system/views/content/reason.html?v=0.58.0', enableDisqus: true, resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } })
.when('/_system/content/totalCostIndex', { title: 'Total Cost Index', templateUrl: '/_system/views/content/totalCostIndex.html?v=0.49.0', enableDisqus: true, resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } })
+ .when('/_system/content/contributors', { title: 'Contributors', templateUrl: '/_system/views/content/contributors.html?v=0.59.0', enableDisqus: true, resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } })
/* Account */
.when('/_system/account', { title: 'Account', templateUrl: '/_system/views/account/account.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } })
diff --git a/ngClient/_system/js/app/controllers/content/ContributorsController.js b/ngClient/_system/js/app/controllers/content/ContributorsController.js
new file mode 100644
index 000000000..dc0d72637
--- /dev/null
+++ b/ngClient/_system/js/app/controllers/content/ContributorsController.js
@@ -0,0 +1,20 @@
+(function () {
+ 'use strict';
+
+ var controllerId = 'ContributorsController';
+ angular.module('main')
+ .controller(controllerId, ['logger', ContributorsController]);
+
+ function ContributorsController(logger) {
+
+ // Logger
+ logger = logger.forSource(controllerId);
+
+ var vm = this;
+ vm.getDate = getDate;
+
+ function getDate(day, month, year) {
+ return new Date(year, month - 1, day);
+ }
+ }
+})();
diff --git a/ngClient/_system/js/app/controllers/content/DefaultController.js b/ngClient/_system/js/app/controllers/content/DefaultController.js
index 9c4fcbee1..c1c7c31da 100644
--- a/ngClient/_system/js/app/controllers/content/DefaultController.js
+++ b/ngClient/_system/js/app/controllers/content/DefaultController.js
@@ -146,8 +146,8 @@
vm.displayFooterIcons = $location.path() === '/';
// Load related disqus
- if (typeof current.enableDisqus !== 'undefined' && current.enableDisqus) {
- vm.disqusConfig.disqus_identifier = disqusShortname + $location.path().replace(/\//g, '_');
+ if (typeof current.enableDisqus !== 'undefined' && current.enableDisqus && vm.disqusConfig.disqus_shortname !== '') {
+ vm.disqusConfig.disqus_identifier = vm.disqusConfig.disqus_shortname + $location.path().replace(/\//g, '_');
vm.disqusConfig.disqus_url = $location.absUrl().substring(0, $location.absUrl().length - $location.url().length + $location.path().length);
} else {
vm.disqusConfig.disqus_identifier = '';
diff --git a/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.js b/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.js
index 9fb952fb3..afacf661f 100644
--- a/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.js
+++ b/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.js
@@ -392,7 +392,7 @@
return {
restrict: 'E',
- templateUrl: '/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html?v=0.58.0b',
+ templateUrl: '/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html?v=0.58.0',
scope: {
config: '='
},
diff --git a/ngClient/_system/views/content/contributors.html b/ngClient/_system/views/content/contributors.html
new file mode 100644
index 000000000..5ce660cb7
--- /dev/null
+++ b/ngClient/_system/views/content/contributors.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ Contributors
+
+
+ This is a fun attempt on welcoming new contributors. For details, click here.
+ If you have a question or an issue, please feel free to contact us on twitter or send an email to contact@forcrowd.org.
+
+
+ Here is the list of contributors to this project.
+