diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b63df563..efd81f30f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ ### Changelog +**0.55.0** + +* Auto register with guest account +https://github.com/forCrowd/WealthEconomy/issues/61 + * login.html & register.html was updated accordingly + * registerLogin.html was removed +* Allow login with email address +https://github.com/forCrowd/WealthEconomy/issues/62 +* Both Profile (/[username]) and New CMRP (/[username]/new) routes now correctly check 'username' for both against local (currentUser) & remote +* README.md updates +* favicon.ico update +* New css definitions + **0.54.0** * Ignore 'anonymous users' in 'Reset Password' case diff --git a/Facade/RoleManager.cs b/Facade/RoleManager.cs index 5e1658d93..3d6c83fc3 100644 --- a/Facade/RoleManager.cs +++ b/Facade/RoleManager.cs @@ -1,7 +1,6 @@ namespace forCrowd.WealthEconomy.Facade { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.DataObjects; + using BusinessObjects; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; diff --git a/README.md b/README.md index 8e59bf162..456772a49 100644 --- a/README.md +++ b/README.md @@ -5,27 +5,44 @@ An experimental, open source crowd investment platform ---- +## Setup -#### Setup +### Build and run -To build and run the project: * If you don't already have it installed, download and install [node.js](https://nodejs.org/) * Open the solution with Visual Studio, it will restore node & bower packages * Build the solution and restore nuget packages -* Optional: Update the files under "WebApi\Configs" and "ngClient\js\appSettings" folders with your own settings +* Optional: Update the files under "WebApi\Configs" and "ngClient\\_system\js\appSettings" folders with your own settings * Run both "WebApi" and "ngClient" projects * Navigate to [http://localhost:15002/](http://localhost:15002/) with your browser +### Deployment + +Configuration files are excluded from deploy (Build Action: 'None'). +When deploying the project, update following configuration files with your own settings and manually copy them: +* WebApi\googleanalytics.js +* WebApi\Web.config +* WebApi\Configs\\*.config +* ngClient\Web.config +* ngClient\\_system\js\appSettings\appSettings.js + +### Jasmine tests + +To be able add "Jasmine" tests under "ngClient.Tests" folder into "Test Explorer" window, install the following extension: +* [Chutzpah Test Adapter for the Test Explorer](https://visualstudiogallery.msdn.microsoft.com/f8741f04-bae4-4900-81c7-7c9bfb9ed1fe) + +### T4 files + To be able run Entity Framework related T4 files (.tt files that include "EF6.Utility.ttinclude" file): * After restoring nuget packages, find and copy "EntityFramework.dll" and "EntityFramework.SqlServer.dll" files under "[Solution Folder]\packages" folder * Go to "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" folder * Optional: Take a backup of the existing files * Paste these two files into this folder -To be able add "Jasmine" tests under "ngClient.Tests" folder into "Test Explorer" window, install the following extension: -* [Chutzpah Test Adapter for the Test Explorer](https://visualstudiogallery.msdn.microsoft.com/f8741f04-bae4-4900-81c7-7c9bfb9ed1fe) +## Changelog + +See [Changelog.md](/CHANGELOG.md) for a detailed list. ---- +## License -#### [Changelog](/CHANGELOG.md) +Wealth Economy is licensed under [MIT license](/LICENSE). diff --git a/SolutionItems/Documents/Todo.md b/SolutionItems/Documents/Todo.md index c2fed4ae1..397012bd7 100644 --- a/SolutionItems/Documents/Todo.md +++ b/SolutionItems/Documents/Todo.md @@ -1,13 +1,11 @@ *** HOT *** -* try auto register again -* anonymous -> guest -* deployment details? * field - rating edit in manage.html? * warmup script for live?! * cmrp list? -> search page * content for editor? new content or new resourcepool - content in a content? or page as a new entity? * route update (_system/) +* application manager - allows admin to update appSettings & restarts the app? * expand('User' - brings all user info ?!?!? http://stackoverflow.com/questions/10781309/asp-net-mvc-4-webapi-manually-handle-odata-queries @@ -165,6 +163,7 @@ Or in some cases, it should do it automatically (like in resourcePoolEditor samp * New Features * Misc + * isAnonymous -> add as a guest role * permissions - instead of enableresourcepooladdition field to control whether user can enter userresourcepoolrate, handle it with permissions - if the user has a right to enter or not? same goes for FieldIndex ratings * Database performance: Suggests to create a separate username field with index http://blogs.msdn.com/b/webdev/archive/2015/02/11/improve-performance-by-optimizing-queries-for-asp-net-identity-and-other-membership-providers.aspx * __migrationhistory createdon field error - it seems there is not much to do, it also might be about glimpse? diff --git a/SolutionItems/Properties/AssemblyInfo.cs b/SolutionItems/Properties/AssemblyInfo.cs index 9c0c7d18c..068f39ab6 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.54.0")] +[assembly: AssemblyVersion("0.55.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WebApi/Controllers/OData/Generated/ElementCellController.cs b/WebApi/Controllers/OData/Generated/ElementCellController.cs index f22973c84..00969b1d1 100644 --- a/WebApi/Controllers/OData/Generated/ElementCellController.cs +++ b/WebApi/Controllers/OData/Generated/ElementCellController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/ElementController.cs b/WebApi/Controllers/OData/Generated/ElementController.cs index 3e7615215..1c15969fa 100644 --- a/WebApi/Controllers/OData/Generated/ElementController.cs +++ b/WebApi/Controllers/OData/Generated/ElementController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/ElementFieldController.cs b/WebApi/Controllers/OData/Generated/ElementFieldController.cs index b3735051c..e3665d15a 100644 --- a/WebApi/Controllers/OData/Generated/ElementFieldController.cs +++ b/WebApi/Controllers/OData/Generated/ElementFieldController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/ElementItemController.cs b/WebApi/Controllers/OData/Generated/ElementItemController.cs index 71a6cfb86..3fa656cc9 100644 --- a/WebApi/Controllers/OData/Generated/ElementItemController.cs +++ b/WebApi/Controllers/OData/Generated/ElementItemController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/ODataController.tt b/WebApi/Controllers/OData/Generated/ODataController.tt index 17464456a..ed8c33d87 100644 --- a/WebApi/Controllers/OData/Generated/ODataController.tt +++ b/WebApi/Controllers/OData/Generated/ODataController.tt @@ -67,8 +67,8 @@ foreach (var entitySet in container.BaseEntitySets.OfType()) <#= codeStringGenerator.WriteHeader() #> namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/ResourcePoolController.cs b/WebApi/Controllers/OData/Generated/ResourcePoolController.cs index ea6b659ef..e06de350c 100644 --- a/WebApi/Controllers/OData/Generated/ResourcePoolController.cs +++ b/WebApi/Controllers/OData/Generated/ResourcePoolController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/RolesController.cs b/WebApi/Controllers/OData/Generated/RolesController.cs index db9963743..9b5d2f160 100644 --- a/WebApi/Controllers/OData/Generated/RolesController.cs +++ b/WebApi/Controllers/OData/Generated/RolesController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserClaimsController.cs b/WebApi/Controllers/OData/Generated/UserClaimsController.cs index ef51360f9..f5789a593 100644 --- a/WebApi/Controllers/OData/Generated/UserClaimsController.cs +++ b/WebApi/Controllers/OData/Generated/UserClaimsController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserElementCellController.cs b/WebApi/Controllers/OData/Generated/UserElementCellController.cs index 894c3a957..9aa859d44 100644 --- a/WebApi/Controllers/OData/Generated/UserElementCellController.cs +++ b/WebApi/Controllers/OData/Generated/UserElementCellController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserElementFieldController.cs b/WebApi/Controllers/OData/Generated/UserElementFieldController.cs index 784e34939..a86adbac3 100644 --- a/WebApi/Controllers/OData/Generated/UserElementFieldController.cs +++ b/WebApi/Controllers/OData/Generated/UserElementFieldController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserLoginsController.cs b/WebApi/Controllers/OData/Generated/UserLoginsController.cs index 47786b128..e2a7bed72 100644 --- a/WebApi/Controllers/OData/Generated/UserLoginsController.cs +++ b/WebApi/Controllers/OData/Generated/UserLoginsController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs b/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs index f0d96cf5a..6fd01b60d 100644 --- a/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs +++ b/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UserRolesController.cs b/WebApi/Controllers/OData/Generated/UserRolesController.cs index a29012734..b764451ad 100644 --- a/WebApi/Controllers/OData/Generated/UserRolesController.cs +++ b/WebApi/Controllers/OData/Generated/UserRolesController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Controllers/OData/Generated/UsersController.cs b/WebApi/Controllers/OData/Generated/UsersController.cs index 4e5134421..7dbfbda7b 100644 --- a/WebApi/Controllers/OData/Generated/UsersController.cs +++ b/WebApi/Controllers/OData/Generated/UsersController.cs @@ -9,8 +9,8 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData { - using forCrowd.WealthEconomy.BusinessObjects; - using forCrowd.WealthEconomy.Facade; + using BusinessObjects; + using Facade; using Results; using System; using System.Data.Entity; diff --git a/WebApi/Providers/ApplicationOAuthProvider.cs b/WebApi/Providers/ApplicationOAuthProvider.cs index c3b85a088..105653592 100644 --- a/WebApi/Providers/ApplicationOAuthProvider.cs +++ b/WebApi/Providers/ApplicationOAuthProvider.cs @@ -46,12 +46,28 @@ public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwner } else { - user = await userManager.FindAsync(context.UserName, context.Password); + user = await userManager.FindAsync(userName, password); if (user == null) { - context.SetError("invalid_grant", "The username or password is incorrect."); - return; + // User can also login with email address + user = await userManager.FindByEmailAsync(userName); + + if (user == null) + { + context.SetError("invalid_grant", "The username or password is incorrect."); + return; + } + else + { + var result = await userManager.CheckPasswordAsync(user, password); + + if (!result) + { + context.SetError("invalid_grant", "The username or password is incorrect."); + return; + } + } } } @@ -72,7 +88,7 @@ public override async Task TokenEndpoint(OAuthTokenEndpointContext context) { context.Properties.ExpiresUtc = DateTime.UtcNow.AddYears(1); } - + foreach (var property in context.Properties.Dictionary) { context.AdditionalResponseParameters.Add(property.Key, property.Value); diff --git a/WebApi/default.aspx b/WebApi/default.aspx index 59e66fe65..7289ecafc 100644 --- a/WebApi/default.aspx +++ b/WebApi/default.aspx @@ -1,8 +1,10 @@  - Wealth Economy API + + + diff --git a/WebApi/favicon.ico b/WebApi/favicon.ico index a3a799985..e39936209 100644 Binary files a/WebApi/favicon.ico and b/WebApi/favicon.ico differ diff --git a/ngClient/_system/css/main.css b/ngClient/_system/css/main.css index bbc3503bd..90e88d78e 100644 --- a/ngClient/_system/css/main.css +++ b/ngClient/_system/css/main.css @@ -147,16 +147,472 @@ input[type="checkbox"].input-validation-error { } /* Project level custom helpers / SH 24 Jan. '14 */ -.buffer-top { - margin-top: 15px; + +/* Spaces +------------------------------------*/ +.g-no-mb { + margin-bottom: 0; +} + +.g-no-padding { + padding: 0; +} + +.g-no-left-padding { + padding-left: 0; +} + +.g-no-side-padding { + padding-left: 0; + padding-right: 0; +} + +/* Padding Spaces */ +.g-padding-5 { + padding: 5px; +} + +.g-padding-10 { + padding: 10px; +} + +.g-padding-15 { + padding: 15px; +} + +.g-padding-20 { + padding: 20px; +} + +.g-padding-25 { + padding: 25px; +} + +.g-padding-30 { + padding: 30px; +} + +.g-padding-35 { + padding: 35px; +} + +.g-padding-40 { + padding: 40px; +} + +.g-padding-45 { + padding: 45px; +} + +.g-padding-50 { + padding: 50px; +} + +.g-pt-10 { + padding-top: 10px; +} + +.g-pt-20 { + padding-top: 20px; +} + +.g-pt-30 { + padding-top: 30px; +} + +.g-pt-35 { + padding-top: 35px; +} + +.g-pt-40 { + padding-top: 40px; +} + +.g-pt-50 { + padding-top: 50px; +} + +.g-pt-60 { + padding-top: 60px; +} + +.g-pt-70 { + padding-top: 70px; +} + +.g-pt-80 { + padding-top: 80px; +} + +.g-pt-85 { + padding-top: 80px; +} + +.g-pt-90 { + padding-top: 90px; +} + +.g-pt-100 { + padding-top: 100px; +} + +.g-pt-110 { + padding-top: 110px; +} + +.g-pt-120 { + padding-top: 120px; +} + +.g-pt-130 { + padding-top: 130px; +} + +.g-pt-140 { + padding-top: 140px; +} + +.g-pt-150 { + padding-top: 150px; +} + +.g-pt-160 { + padding-top: 160px; +} + +.g-pt-170 { + padding-top: 170px; +} + +.g-pb-0 { + padding-bottom: 0px; +} + +.g-pb-10 { + padding-bottom: 10px; +} + +.g-pb-20 { + padding-bottom: 20px; +} + +.g-pb-30 { + padding-bottom: 30px; +} + +.g-pb-40 { + padding-bottom: 40px; +} + +.g-pb-50 { + padding-bottom: 50px; +} + +.g-pb-60 { + padding-bottom: 60px; +} + +.g-pb-70 { + padding-bottom: 70px; +} + +.g-pb-75 { + padding-bottom: 75px; +} + +.g-pb-80 { + padding-bottom: 80px; +} + +.g-pb-90 { + padding-bottom: 90px; +} + +.g-pb-100 { + padding-bottom: 100px; +} + +.g-pl-10 { + padding-left: 10px; +} + +.g-pl-20 { + padding-left: 20px; +} + +.g-pl-30 { + padding-left: 30px; +} + +.g-pl-40 { + padding-left: 40px; +} + +.g-pl-50 { + padding-left: 50px; +} + +.g-pl-60 { + padding-left: 60px; +} + +.g-pl-70 { + padding-left: 70px; +} + +.g-pl-80 { + padding-left: 80px; +} + +.g-pl-90 { + padding-left: 90px; +} + +.g-pl-100 { + padding-left: 100px; +} + +.g-pr-10 { + padding-right: 10px; +} + +.g-pr-20 { + padding-right: 20px; } -.buffer-left { - margin-left: 15px; +.g-pr-30 { + padding-right: 30px; } +.g-pr-40 { + padding-right: 40px; +} + +.g-pr-50 { + padding-right: 50px; +} + +.g-pr-60 { + padding-right: 60px; +} + +.g-pr-70 { + padding-right: 70px; +} + +.g-pr-80 { + padding-right: 80px; +} + +.g-pr-90 { + padding-right: 90px; +} + +.g-pr-100 { + padding-right: 100px; +} + +/* Margin Spaces */ +.g-mt-10 { + margin-top: 10px; +} + +.g-mt-20 { + margin-top: 20px; +} + +.g-mt-30 { + margin-top: 30px; +} + +.g-mt-40 { + margin-top: 40px; +} + +.g-mt-50 { + margin-top: 50px; +} + +.g-mt-60 { + margin-top: 60px; +} + +.g-mt-70 { + margin-top: 70px; +} + +.g-mt-80 { + margin-top: 80px; +} + +.g-mt-90 { + margin-top: 90px; +} + +.g-mt-100 { + margin-top: 100px; +} + +.g-mb-10 { + margin-bottom: 10px; +} + +.g-mb-15 { + margin-bottom: 15px; +} + +.g-mb-20 { + margin-bottom: 20px; +} + +.g-mb-25 { + margin-bottom: 25px; +} + +.g-mb-30 { + margin-bottom: 30px; +} + +.g-mb-35 { + margin-bottom: 35px; +} + +.g-mb-40 { + margin-bottom: 40px; +} + +.g-mb-45 { + margin-bottom: 45px; +} + +.g-mb-50 { + margin-bottom: 50px; +} + +.g-mb-55 { + margin-bottom: 55px; +} + +.g-mb-60 { + margin-bottom: 60px; +} + +.g-mb-65 { + margin-bottom: 65px; +} + +.g-mb-70 { + margin-bottom: 70px; +} + +.g-mb-75 { + margin-bottom: 75px; +} + +.g-mb-80 { + margin-bottom: 80px; +} + +.g-mb-85 { + margin-bottom: 85px; +} + +.g-mb-90 { + margin-bottom: 90px; +} + +.g-mb-95 { + margin-bottom: 95px; +} + +.g-mb-100 { + margin-bottom: 100px; +} + +.g-ml-10 { + margin-left: 10px; +} + +.g-ml-20 { + margin-left: 20px; +} + +.g-ml-30 { + margin-left: 30px; +} + +.g-ml-40 { + margin-left: 40px; +} + +.g-ml-50 { + margin-left: 50px; +} + +.g-ml-60 { + margin-left: 60px; +} + +.g-ml-70 { + margin-left: 70px; +} + +.g-ml-80 { + margin-left: 80px; +} + +.g-ml-90 { + margin-left: 90px; +} + +.g-ml-100 { + margin-left: 100px; +} + +.g-mr-10 { + margin-right: 10px; +} + +.g-mr-20 { + margin-right: 20px; +} + +.g-mr-30 { + margin-right: 30px; +} + +.g-mr-40 { + margin-right: 40px; +} + +.g-mr-50 { + margin-right: 50px; +} + +.g-mr-60 { + margin-right: 60px; +} + +.g-mr-70 { + margin-right: 70px; +} + +.g-mr-80 { + margin-right: 80px; +} + +.g-mr-90 { + margin-right: 90px; +} + +.g-mr-100 { + margin-right: 100px; +} + +/* Misc */ + .vcenter { display: inline-block; vertical-align: middle; float: none; -} \ No newline at end of file +} diff --git a/ngClient/_system/js/app/config/route.js b/ngClient/_system/js/app/config/route.js index e371d9f45..fb556db9b 100644 --- a/ngClient/_system/js/app/config/route.js +++ b/ngClient/_system/js/app/config/route.js @@ -29,24 +29,24 @@ .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] } }) /* CMRP List */ - .when('/_system/resourcePool', { title: 'CMRP List', templateUrl: '/_system/views/resourcePool/resourcePoolList.html?v=0.51.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/resourcePool', { title: 'CMRP List', templateUrl: '/_system/views/resourcePool/resourcePoolList.html?v=0.55.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) /* Account */ - .when('/_system/account', { title: 'Account', templateUrl: '/_system/views/account/account.html?v=0.51.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/accountEdit', { title: 'Account Edit', templateUrl: '/_system/views/account/accountEdit.html?v=0.51.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/addPassword', { title: 'Add Password', templateUrl: '/_system/views/account/addPassword.html?v=0.52.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/changeEmail', { title: 'Change Email', templateUrl: '/_system/views/account/changeEmail.html?v=0.52.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/changePassword', { title: 'Change Password', templateUrl: '/_system/views/account/changePassword.html?v=0.52.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/changeUserName', { title: 'Change Username', templateUrl: '/_system/views/account/changeUsername.html?v=0.52.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .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] } }) + .when('/_system/account/accountEdit', { title: 'Account Edit', templateUrl: '/_system/views/account/accountEdit.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/addPassword', { title: 'Add Password', templateUrl: '/_system/views/account/addPassword.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/changeEmail', { title: 'Change Email', templateUrl: '/_system/views/account/changeEmail.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/changePassword', { title: 'Change Password', templateUrl: '/_system/views/account/changePassword.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/changeUserName', { title: 'Change Username', templateUrl: '/_system/views/account/changeUsername.html?v=0.55.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) .when('/_system/account/confirmEmail', { title: 'Confirm Email', templateUrl: '/_system/views/account/confirmEmail.html?v=0.51.0', accessType: 'authenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/login', { title: 'Login', templateUrl: '/_system/views/account/login.html?v=0.51.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/register', { title: 'Register', templateUrl: '/_system/views/account/register.html?v=0.53.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/_system/account/resetPassword', { title: 'Reset Password', templateUrl: '/_system/views/account/resetPassword.html?v=0.52.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/login', { title: 'Login', templateUrl: '/_system/views/account/login.html?v=0.55.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/register', { title: 'Register', templateUrl: '/_system/views/account/register.html?v=0.55.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/_system/account/resetPassword', { title: 'Reset Password', templateUrl: '/_system/views/account/resetPassword.html?v=0.55.0', accessType: 'unauthenticatedRequired', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) /* User */ .when('/:userName', { title: 'Profile', templateUrl: '/_system/views/account/profile.html?v=0.51.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/:userName/new', { title: 'New CMRP', templateUrl: '/_system/views/resourcePool/resourcePoolManage.html?v=0.53.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) - .when('/:userName/:resourcePoolKey/edit', { title: 'Edit CMRP', templateUrl: '/_system/views/resourcePool/resourcePoolManage.html?v=0.53.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/:userName/new', { title: 'New CMRP', templateUrl: '/_system/views/resourcePool/resourcePoolManage.html?v=0.55.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) + .when('/:userName/:resourcePoolKey/edit', { title: 'Edit CMRP', templateUrl: '/_system/views/resourcePool/resourcePoolManage.html?v=0.55.0', resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) .when('/:userName/:resourcePoolKey', { title: 'View CMRP', templateUrl: '/_system/views/resourcePool/resourcePoolView.html?v=0.49.0', enableDisqus: true, resolve: { validateAccess: ['dataContext', 'locationHistory', 'logger', '$location', '$q', '$route', validateAccess] } }) /* Otherwise */ @@ -83,7 +83,7 @@ if ($route.current.accessType !== 'undefined') { // Invalid access cases - if (($route.current.accessType === 'unauthenticatedRequired' && currentUser.isAuthenticated()) || + if (($route.current.accessType === 'unauthenticatedRequired' && currentUser.isAuthenticated() && !currentUser.IsAnonymous) || ($route.current.accessType === 'authenticatedRequired' && !currentUser.isAuthenticated())) { deferred.reject({ accessType: $route.current.accessType }); } diff --git a/ngClient/_system/js/app/controllers/account/LoginController.js b/ngClient/_system/js/app/controllers/account/LoginController.js index 5ea9ca9a6..cc3462ef4 100644 --- a/ngClient/_system/js/app/controllers/account/LoginController.js +++ b/ngClient/_system/js/app/controllers/account/LoginController.js @@ -12,7 +12,6 @@ vm.isSaving = false; vm.isSaveDisabled = isSaveDisabled; vm.login = login; - vm.navigateToResetPassword = navigateToResetPassword; vm.password = ''; vm.rememberMe = true; vm.showHeader = typeof $scope.showHeader !== 'undefined' ? $scope.showHeader : true; @@ -85,10 +84,5 @@ } } } - - function navigateToResetPassword() { - $rootScope.$broadcast('LoginController_redirected'); - $location.url('/_system/account/resetPassword'); - } } })(); diff --git a/ngClient/_system/js/app/controllers/account/ProfileController.js b/ngClient/_system/js/app/controllers/account/ProfileController.js index 370d51412..5c42c9b6f 100644 --- a/ngClient/_system/js/app/controllers/account/ProfileController.js +++ b/ngClient/_system/js/app/controllers/account/ProfileController.js @@ -21,21 +21,29 @@ _init(); function _init() { - dataContext.getUser(userName) - .then(function (user) { - - // Not found, navigate to 404 - if (user === null) { - var invalidUrl = '/' + userName; - $location.url('/_system/content/notFound?url=' + invalidUrl); - return; - } - vm.user = user; - dataContext.getCurrentUser() - .then(function (currentUser) { - vm.currentUser = currentUser; - }); + dataContext.getCurrentUser() + .then(function (currentUser) { + vm.currentUser = currentUser; + + // If userName equals to current user + if (userName === currentUser.UserName) { + vm.user = currentUser; + } else { + + // If not, then check it against remote + dataContext.getUser(userName) + .then(function (user) { + + // Not found, navigate to 404 + if (user === null) { + $location.url('/_system/content/notFound?url=' + $location.url()); + return; + } + + vm.user = user; + }); + } }); } diff --git a/ngClient/_system/js/app/controllers/account/RegisterController.js b/ngClient/_system/js/app/controllers/account/RegisterController.js index d2b6945cd..7d8049313 100644 --- a/ngClient/_system/js/app/controllers/account/RegisterController.js +++ b/ngClient/_system/js/app/controllers/account/RegisterController.js @@ -17,56 +17,29 @@ Password: '', ConfirmPassword: '' }; - vm.IsAnonymous = false; - vm.IsAnonymousChanged = IsAnonymousChanged; vm.isSaving = false; vm.isSaveDisabled = isSaveDisabled; vm.register = register; vm.rememberMe = true; vm.showHeader = typeof $scope.showHeader !== 'undefined' ? $scope.showHeader : true; - function IsAnonymousChanged() { - vm.bindingModel.UserName = vm.IsAnonymous ? dataContext.getUniqueUserName() : ''; - vm.bindingModel.Email = vm.IsAnonymous ? dataContext.getUniqueEmail() : ''; - } - function isSaveDisabled() { return vm.isSaving; } function register() { - if (vm.IsAnonymous) { - - vm.isSaving = true; - - dataContext.registerAnonymous(vm.bindingModel, vm.rememberMe) - .then(function () { - logger.logSuccess('You have been registered!', null, true); - $rootScope.$broadcast('RegisterController_userRegistered'); - if ($location.path() === '/_system/account/register') { - $location.url(locationHistory.previousItem().url()); - } - }) - .catch(failed) - .finally(function () { - vm.isSaving = false; - }); - } else { - - vm.isSaving = true; - - dataContext.register(vm.bindingModel, vm.rememberMe) - .then(function () { - logger.logSuccess('You have been registered!', null, true); - $rootScope.$broadcast('RegisterController_userRegistered'); - $location.url('/_system/account/confirmEmail'); - }) - .catch(failed) - .finally(function () { - vm.isSaving = false; - }); - } + vm.isSaving = true; + + dataContext.register(vm.bindingModel, vm.rememberMe) + .then(function () { + logger.logSuccess('You have been registered!', null, true); + $location.url('/_system/account/confirmEmail'); + }) + .catch(failed) + .finally(function () { + vm.isSaving = false; + }); function failed(response) { if (typeof response.error_description !== 'undefined') { diff --git a/ngClient/_system/js/app/controllers/content/DefaultController.js b/ngClient/_system/js/app/controllers/content/DefaultController.js index 07da51808..4e580ecf8 100644 --- a/ngClient/_system/js/app/controllers/content/DefaultController.js +++ b/ngClient/_system/js/app/controllers/content/DefaultController.js @@ -13,7 +13,6 @@ // View model var vm = this; vm.applicationInfo = null; - vm.createNew = createNew; vm.currentUser = { Email: '', isAuthenticated: function () { return false; }, HasPassword: false }; vm.currentDate = new Date(); vm.currentUserText = currentUserText; @@ -24,13 +23,15 @@ disqus_identifier: '', disqus_url: '' }; + vm.guestAccountInfoVisible = false; vm.logout = logout; + vm.openGuestAccountInfo = openGuestAccountInfo; vm.toggleBankTransfer = toggleBankTransfer; - var isRegisterLoginModalOpened = false; // Events $scope.$on('dataContext_currentUserChanged', currentUserChanged); - $scope.$on('unauthenticatedUserInteracted', openRegisterLoginModal); + $scope.$on('dataContext_currentUserEmailAddressChanged', currentUserEmailAddressChanged); + $scope.$on('guestAccountCreated', guestAccountCreated); $scope.$on('$locationChangeStart', locationChangeStart); $scope.$on('$routeChangeSuccess', routeChangeSuccess); @@ -42,29 +43,25 @@ getApplicationInfo(); } - function createNew() { - if (vm.currentUser.isAuthenticated()) { - $location.url('/' + vm.currentUser.UserName + '/new'); - } else { - $rootScope.$broadcast('unauthenticatedUserInteracted', true); - } - } - function currentUserChanged(event, newUser) { vm.currentUser = newUser; - isRegisterLoginModalOpened = false; + vm.guestAccountInfoVisible = newUser.isAuthenticated() && newUser.IsAnonymous; } function currentUserText() { var userText = vm.currentUser.UserName; if (vm.currentUser.IsAnonymous) { - userText += ' (Anonymous)'; + userText += ' (Guest)'; } return userText; } + function currentUserEmailAddressChanged() { + vm.guestAccountInfoVisible = false; + } + function getApplicationInfo() { applicationFactory.getApplicationInfo() .then(function (applicationInfo) { @@ -73,6 +70,10 @@ }); } + function guestAccountCreated() { + vm.guestAccountInfoVisible = true; + } + function logout() { dataContext.logout() .then(function () { @@ -80,38 +81,6 @@ }); } - function openRegisterLoginModal(event, forceOpen) { - forceOpen = typeof forceOpen !== 'undefined' ? forceOpen : false; - - if (!isRegisterLoginModalOpened || forceOpen) { - - isRegisterLoginModalOpened = true; - - var modalInstance = $uibModal.open({ - backdrop: 'static', - controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) { - $scope.$on('dataContext_currentUserChanged', closeModal); - $scope.$on('LoginController_redirected', closeModal); - $scope.$on('RegisterController_userRegistered', closeModal); - - function closeModal() { - $uibModalInstance.close(); - } - }], - keyboard: false, - size: 'lg', - templateUrl: '/_system/views/account/registerLogin.html?v=0.51.0' - }); - - modalInstance.result - .then(function () { - //isRegisterLoginModalOpened = false; - }, function () { - //isRegisterLoginModalOpened = false; - }); - } - } - function locationChangeStart(event, newUrl, oldUrl) { if (dataContext.hasChanges()) { @@ -149,6 +118,25 @@ } } + function openGuestAccountInfo() { + + var modalInstance = $uibModal.open({ + controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) { + + var vm = this; + vm.close = closeModal; + + $scope.$on('dataContext_currentUserChanged', closeModal); + + function closeModal() { + $uibModalInstance.close(); + } + }], + controllerAs: 'vm', + templateUrl: '/_system/views/account/guestAccountInfo.html?v=0.55.0' + }); + } + function routeChangeSuccess(event, current, previous) { // Footer icons diff --git a/ngClient/_system/js/app/controllers/content/obsolete/ClosingNotesController.js b/ngClient/_system/js/app/controllers/content/obsolete/ClosingNotesController.js index 5963587d1..e7397c6c5 100644 --- a/ngClient/_system/js/app/controllers/content/obsolete/ClosingNotesController.js +++ b/ngClient/_system/js/app/controllers/content/obsolete/ClosingNotesController.js @@ -12,7 +12,6 @@ // View model var vm = this; - vm.createNew = createNew; vm.currentUser = { isAuthenticated: function () { return false; } }; $scope.$on('dataContext_currentUserChanged', currentUserChanged); @@ -30,14 +29,6 @@ }); } - function createNew() { - if (vm.currentUser.isAuthenticated()) { - $location.url('/' + vm.currentUser.UserName + '/new'); - } else { - $rootScope.$broadcast('unauthenticatedUserInteracted', true); - } - } - function currentUserChanged(event, newUser) { vm.currentUser = newUser; } diff --git a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolListController.js b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolListController.js index d0e25436d..4e73a2a21 100644 --- a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolListController.js +++ b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolListController.js @@ -11,7 +11,6 @@ logger = logger.forSource(controllerId); var vm = this; - vm.createNew = createNew; vm.currentUser = { Id: 0 }; vm.resourcePoolSet = []; @@ -33,14 +32,6 @@ }); } - function createNew() { - if (vm.currentUser.isAuthenticated()) { - $location.url('/' + vm.currentUser.UserName + '/new'); - } else { - $rootScope.$broadcast('unauthenticatedUserInteracted', true); - } - } - function currentUserChanged(event, newUser) { vm.currentUser = newUser; } diff --git a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolManageController.js b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolManageController.js index e73ff97ae..bb592bdc2 100644 --- a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolManageController.js +++ b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolManageController.js @@ -70,14 +70,30 @@ function _init() { if (vm.isNew) { - resourcePoolFactory.createResourcePoolBasic() - .then(function (resourcePool) { - vm.resourcePool = resourcePool; - // Title - // TODO viewTitle was also set in route.js? - $rootScope.viewTitle = vm.resourcePool.Name; + dataContext.getCurrentUser() + .then(function (currentUser) { + vm.currentUser = currentUser; + + // If userName equals to current user + if (vm.userName === currentUser.UserName) { + vm.user = currentUser; + + resourcePoolFactory.createResourcePoolBasic() + .then(function (resourcePool) { + vm.resourcePool = resourcePool; + + // Title + // TODO viewTitle was also set in route.js? + $rootScope.viewTitle = vm.resourcePool.Name; + }); + + } else { + $location.url('/_system/content/notFound?url=' + $location.url()); + return; + } }); + } else { var resourcePoolUniqueKey = { userName: vm.userName, resourcePoolKey: vm.resourcePoolKey }; @@ -87,8 +103,7 @@ // Not found, navigate to 404 if (resourcePool === null) { - var invalidUrl = '/' + vm.userName + '/' + vm.resourcePoolKey; - $location.url('/_system/content/notFound?url=' + invalidUrl); + $location.url('/_system/content/notFound?url=' + $location.url()); return; } diff --git a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolViewController.js b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolViewController.js index bed736ee0..773ac9504 100644 --- a/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolViewController.js +++ b/ngClient/_system/js/app/controllers/resourcePool/ResourcePoolViewController.js @@ -26,8 +26,7 @@ // Not found, navigate to 404 if (resourcePool === null) { - var invalidUrl = '/' + vm.editorConfig.userName + '/' + vm.editorConfig.resourcePoolKey; - $location.url('/_system/content/notFound?url=' + invalidUrl); + $location.url('/_system/content/notFound?url=' + $location.url()); return; } diff --git a/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html b/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html index aad55174e..362c4ae8c 100644 --- a/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html +++ b/ngClient/_system/js/app/directives/resourcePoolEditor/resourcePoolEditor.html @@ -9,7 +9,7 @@ -
+
diff --git a/ngClient/_system/views/account/addPassword.html b/ngClient/_system/views/account/addPassword.html index 662729eb2..ee7aeb35c 100644 --- a/ngClient/_system/views/account/addPassword.html +++ b/ngClient/_system/views/account/addPassword.html @@ -5,19 +5,19 @@

Add Password


- -
+ +
- -
+ +
-
+
diff --git a/ngClient/_system/views/account/changeEmail.html b/ngClient/_system/views/account/changeEmail.html index be27551e1..1d5648a52 100644 --- a/ngClient/_system/views/account/changeEmail.html +++ b/ngClient/_system/views/account/changeEmail.html @@ -5,13 +5,13 @@

Change Email


- -
+ +
-
+
diff --git a/ngClient/_system/views/account/changePassword.html b/ngClient/_system/views/account/changePassword.html index ddeb7ce82..58da1789d 100644 --- a/ngClient/_system/views/account/changePassword.html +++ b/ngClient/_system/views/account/changePassword.html @@ -5,25 +5,25 @@

Change Password


- -
+ +
- -
+ +
- -
+ +
-
+
diff --git a/ngClient/_system/views/account/changeUserName.html b/ngClient/_system/views/account/changeUserName.html index ee528c295..9a5f71014 100644 --- a/ngClient/_system/views/account/changeUserName.html +++ b/ngClient/_system/views/account/changeUserName.html @@ -10,13 +10,13 @@

Set your username


- -
+ +
-
+
diff --git a/ngClient/_system/views/account/guestAccountInfo.html b/ngClient/_system/views/account/guestAccountInfo.html new file mode 100644 index 000000000..20b70f8fc --- /dev/null +++ b/ngClient/_system/views/account/guestAccountInfo.html @@ -0,0 +1,33 @@ +
+ + + +
diff --git a/ngClient/_system/views/account/login.html b/ngClient/_system/views/account/login.html index 5dab799aa..a4f5e20bf 100644 --- a/ngClient/_system/views/account/login.html +++ b/ngClient/_system/views/account/login.html @@ -1,25 +1,25 @@ 

Login

-
+

Use a local account to log in


- -
+ +
- -
+ +
-
+
-
+
diff --git a/ngClient/_system/views/account/register.html b/ngClient/_system/views/account/register.html index 46148b795..5bccc50bd 100644 --- a/ngClient/_system/views/account/register.html +++ b/ngClient/_system/views/account/register.html @@ -1,39 +1,27 @@ 

Register

-
+

Create a new local account


-
-
- -
+ +
+
- -
- + +
+
- -
- -
-
-
- -
+ +
Password must be at least 6 characters long,
@@ -41,14 +29,14 @@

Create a new local account

-
- -
+
+ +
-
+
-
+
@@ -67,6 +55,6 @@

Create a new local account

-
+
diff --git a/ngClient/_system/views/account/registerLogin.html b/ngClient/_system/views/account/registerLogin.html deleted file mode 100644 index f626c305b..000000000 --- a/ngClient/_system/views/account/registerLogin.html +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/ngClient/_system/views/account/resetPassword.html b/ngClient/_system/views/account/resetPassword.html index f16d7d2ca..1e6a76713 100644 --- a/ngClient/_system/views/account/resetPassword.html +++ b/ngClient/_system/views/account/resetPassword.html @@ -5,13 +5,13 @@

Reset Password

Reset password of your local account


- -
+ +
-
+
@@ -33,19 +33,19 @@

Reset password of your local account


- -
+ +
- -
+ +
-
+
diff --git a/ngClient/_system/views/content/obsolete/closingNotes.html b/ngClient/_system/views/content/obsolete/closingNotes.html index 6f37611db..9eb858f90 100644 --- a/ngClient/_system/views/content/obsolete/closingNotes.html +++ b/ngClient/_system/views/content/obsolete/closingNotes.html @@ -7,7 +7,7 @@

Make Your Own Kind of CMRP

Now it's possible to create your own simulations, would you like to try?
- Create a new CMRP + Create New

diff --git a/ngClient/_system/views/content/obsolete/conclusion.html b/ngClient/_system/views/content/obsolete/conclusion.html index 7c359db6c..2a5bef937 100644 --- a/ngClient/_system/views/content/obsolete/conclusion.html +++ b/ngClient/_system/views/content/obsolete/conclusion.html @@ -61,7 +61,7 @@

Impossible Task

- -
-

+

Create New @@ -146,7 +146,7 @@

-
+
 
@@ -258,7 +258,7 @@

-

+

Create New @@ -310,7 +310,7 @@

-
+
 
@@ -350,7 +350,7 @@

-

+

Create New @@ -390,7 +390,7 @@

-
+
 
@@ -461,7 +461,7 @@

-

+

 

diff --git a/ngClient/default.aspx b/ngClient/default.aspx index 3e55ac6fb..d96ce1bd4 100644 --- a/ngClient/default.aspx +++ b/ngClient/default.aspx @@ -1,17 +1,16 @@  + - - + + - - - +