diff --git a/src/Umbraco.Web.UI.Client/gruntFile.js b/src/Umbraco.Web.UI.Client/gruntFile.js index 3a71a94331..44b59d29d1 100644 --- a/src/Umbraco.Web.UI.Client/gruntFile.js +++ b/src/Umbraco.Web.UI.Client/gruntFile.js @@ -89,7 +89,7 @@ module.exports = function (grunt) { }, installer: { - files: [{ dest: '<%= distdir %>/views/install', src : '*.html', expand: true, cwd: 'src/installer/steps' }] + files: [{ dest: '<%= distdir %>/views/install', src : '**/*.html', expand: true, cwd: 'src/installer/steps' }] }, vendor: { diff --git a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg index 4a48ed831a..7985a510b7 100644 Binary files a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg and b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg differ diff --git a/src/Umbraco.Web.UI.Client/src/installer/installer.html b/src/Umbraco.Web.UI.Client/src/installer/installer.html index 5af94e2a23..1d421db01e 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/installer.html +++ b/src/Umbraco.Web.UI.Client/src/installer/installer.html @@ -14,16 +14,12 @@
- -
-        {{installer | json}}
-    
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/installer/installer.service.js b/src/Umbraco.Web.UI.Client/src/installer/installer.service.js index 1852b5e749..ca5e0e4fd4 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/installer.service.js +++ b/src/Umbraco.Web.UI.Client/src/installer/installer.service.js @@ -1,56 +1,68 @@ -angular.module("umbraco.install").factory('installerService', function($q, $timeout){ +angular.module("umbraco.install").factory('installerService', function($q, $timeout, $http, $location){ var _status = { index: 0, current: undefined, - steps: undefined + steps: undefined, + loading: true + }; + + + var _installerModel = { + DatabaseConfigure: {dbType: 0}, + StarterKitDownload: "69e44beb-15ff-4cee-8b64-0a7dae498657" }; - var _installerModel = {}; var service = { status : _status, + + getPackages : function(){ + return $http.get(Umbraco.Sys.ServerVariables.installApiBaseUrl + "GetPackages"); + }, + getSteps : function(){ - var deferred = $q.defer(); - var s = [ - { - name: "User", - view: "user", - description: "Configuring your user account", - completed: false - }, - { - name: "Database", - view: "database", - description: "Setting up the system database", - completed: false - }, - { - name: "Packages", - view: "packages", - description: "Installing a staterkit", - completed: false - } - ]; - - deferred.resolve(s); - return deferred.promise; + return $http.get(Umbraco.Sys.ServerVariables.installApiBaseUrl + "GetSetup"); }, init : function(){ - + service.status.loading = true; if(!_status.all){ - service.getSteps().then(function(steps){ - service.status.steps = steps; + service.getSteps().then(function(response){ + service.status.steps = response.data.steps; service.status.index = 0; - service.gotoStep(0); + service.findNextStep(); + + $timeout(function(){ + service.status.loading = false; + service.status.installing = true; + }, 2000); }); } - }, gotoStep : function(index){ var step = service.status.steps[index]; + if(step.view.indexOf(".html") < 0){ + step.view = step.view + ".html"; + } + if(step.view.indexOf("/") < 0){ + step.view = "views/install/" + step.view; + } + if(!step.model){ + step.model = {}; + } + service.status.index = index; + service.status.current = step; + }, + + findNextStep : function(){ + var step = _.find(service.status.steps, function(step, index){ + if(step.view && index >= service.status.index){ + service.status.index = index; + return true; + } + }); if(step.view.indexOf(".html") < 0){ step.view = step.view + ".html"; @@ -64,9 +76,8 @@ angular.module("umbraco.install").factory('installerService', function($q, $time step.model = {}; } - service.status.index = index; service.status.current = step; - }, + }, storeCurrentStep : function(){ _installerModel[service.status.current.name] = service.status.current.model; @@ -75,7 +86,7 @@ angular.module("umbraco.install").factory('installerService', function($q, $time forward : function(){ service.storeCurrentStep(); service.status.index++; - service.gotoStep(service.status.index); + service.findNextStep(); }, backwards : function(){ @@ -86,15 +97,36 @@ angular.module("umbraco.install").factory('installerService', function($q, $time install : function(){ service.storeCurrentStep(); service.status.current = undefined; + service.status.feedback = []; + service.status.loading = true; - - _.each(service.status.steps, function(step){ - $timeout(function(){ - step.completed = true; - }, 2000); - }); + var _feedback = 0; + service.status.feedback = service.status.steps[0].description; - //post the installer model to somewhere... + function processInstallStep(){ + $http.post(Umbraco.Sys.ServerVariables.installApiBaseUrl + "PostPerformInstall", + _installerModel).then(function(response){ + if(!response.data.complete){ + _feedback++; + + var step = service.status.steps[_feedback]; + if(step){ + service.status.feedback = step.description; + } + + processInstallStep(); + }else{ + service.status.done = true; + service.status.feedback = undefined; + service.status.loading = false; + service.complete(); + } + }); + } + processInstallStep(); + }, + complete : function(){ + window.location.href = Umbraco.Sys.ServerVariables.umbracoBaseUrl; } }; diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js b/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js index 7ee3a29383..98f9f7fc3a 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js @@ -1,3 +1,7 @@ -angular.module("umbraco.install").controller("Umbraco.Installer.DataBaseController", function(){ - alert("we are in your database"); +angular.module("umbraco.install").controller("Umbraco.Installer.DataBaseController", function($scope, installerService){ + $scope.validateAndForward = function(){ + if(this.myForm.$valid){ + installerService.forward(); + } + }; }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html index 4c0b1d98f0..fff2c33d1d 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html @@ -1,5 +1,97 @@
- - - + +

Configure your database

+

+ Enter connection and authentication details for the database you want to install umbraco on +

+ +
+ +
+ +
+ +
+
+ +
+ +
+ + + + Enter a valid database connection string. +
+
+ +
+ +
+
+ +
+ + Enter the domain or IP your database server is located +
+
+ +
+ +
+ + Enter the name of the database +
+
+
+ +
+
+ +
+ + Enter the database user name +
+
+ +
+ +
+ + Enter the database password +
+
+ +
+ +
+ +
+
+
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/packages.html b/src/Umbraco.Web.UI.Client/src/installer/steps/packages.html deleted file mode 100644 index ed769e7484..0000000000 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/packages.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.controller.js b/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.controller.js new file mode 100644 index 0000000000..a70e9cd809 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.controller.js @@ -0,0 +1,11 @@ +angular.module("umbraco.install").controller("Umbraco.Installer.PackagesController", function($scope, installerService){ + + installerService.getPackages().then(function(response){ + $scope.packages = response.data; + }); + + $scope.setPackageAndContinue = function(package){ + + installerService.install(); + }; +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.html b/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.html new file mode 100644 index 0000000000..62dd4518d6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/starterkit.html @@ -0,0 +1,17 @@ +
+

Install a starter website

+

+ Installing a starter website helps you learn how Umbraco works, and gives you a solid + a simple foundation to build ontop of. +

+ + + + No thanks, I do not want to install a starter website +
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/user.controller.js b/src/Umbraco.Web.UI.Client/src/installer/steps/user.controller.js index 441c3177a8..133552a9f4 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/user.controller.js +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/user.controller.js @@ -4,9 +4,10 @@ angular.module("umbraco.install").controller("Umbraco.Install.UserController", f installerService.install(); }; - $scope.validateAndForward = function(){ - installerService.forward(); + if(this.myForm.$valid){ + installerService.forward(); + } }; }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html index f88b875911..e7ddcb3a70 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html @@ -31,18 +31,19 @@ Atleast 8 characters long + +
+
+ + + + Customize +
+
+ - -
- -
- Customize -
- - - \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/less/installer.less b/src/Umbraco.Web.UI.Client/src/less/installer.less index 28630898e5..952649076c 100644 --- a/src/Umbraco.Web.UI.Client/src/less/installer.less +++ b/src/Umbraco.Web.UI.Client/src/less/installer.less @@ -10,6 +10,13 @@ @import "../../lib/bootstrap/less/grid.less"; @import "../../lib/bootstrap/less/layouts.less"; +@import "../../lib/bootstrap/less/thumbnails.less"; +@import "../../lib/bootstrap/less/media.less"; + + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { + display: none !important; +} html { @@ -39,13 +46,30 @@ body { position: absolute; top: 20px; left: 20px; - opacity: 0.8 + opacity: 0.8; + z-index: 777; } #installer{ margin: auto; - background: rgba(255, 255, 255, 1); - height: 400px; + background: white; + min-height: 400px; + min-width: 500px; + max-width: 700px; + + height: 500px; + + padding: 40px; +} + +#overlay{ + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: @blackLight; + z-index: 666; } input.ng-dirty.ng-invalid{border-color: #b94a48; color: #b94a48;} @@ -66,8 +90,29 @@ input.ng-dirty.ng-invalid{border-color: #b94a48; color: #b94a48;} top: 0; left: 0; bottom: 0; right: 0; } + +.fade-hide, .fade-show { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; +} +.fade-hide { + opacity:1; +} +.fade-hide.fade-hide-active { + opacity:0; +} +.fade-show { + opacity:0; +} +.fade-show.fade-show-active { + opacity:1; +} + + .umb-loader{ -background-color: @blue; +background-color: white; margin-top:0; margin-left:-100%; -moz-animation-name:bounce_loadingProgressG; @@ -150,5 +195,9 @@ height:1px; //loader defaults .umb-loader{ - height: 10px; margin: 10px 10px 10px 10px; + height: 5px; + position: absolute; + bottom: 0; + left: 0; + right: 0; } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Views/Install/Index.cshtml b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Views/Install/Index.cshtml index d4d1bf55e6..a4f7a942b1 100644 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Views/Install/Index.cshtml +++ b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Views/Install/Index.cshtml @@ -13,7 +13,6 @@ Install Umbraco - @@ -21,8 +20,14 @@
-
-
+
+ +
+
+

{{installer.feedback}}...

- - - - - - - - - - - -
- Hello @ViewBag.UmbracoBaseFolder -
- - - + \ No newline at end of file diff --git a/src/Umbraco.Web/Install/Controllers/InstallApiController.cs b/src/Umbraco.Web/Install/Controllers/InstallApiController.cs index 05658e3fd0..9c476da61f 100644 --- a/src/Umbraco.Web/Install/Controllers/InstallApiController.cs +++ b/src/Umbraco.Web/Install/Controllers/InstallApiController.cs @@ -93,6 +93,19 @@ namespace Umbraco.Web.Install.Controllers throw new NotImplementedException(); } + public IEnumerable GetPackages() + { + var r = new org.umbraco.our.Repository(); + var modules = r.Modules(); + + List retval = new List(); + + foreach (var package in modules) + retval.Add(new Package() { Id = package.RepoGuid, Name = package.Text, Thumbnail = package.Thumbnail }); + + return retval; + } + /// /// Does the install /// @@ -116,6 +129,7 @@ namespace Umbraco.Web.Install.Controllers //if it is not complete, then we need to execute it if (stepStatus.Value.IsComplete == false) { + JToken instruction = null; if (step.View.IsNullOrWhiteSpace() == false) { @@ -133,10 +147,11 @@ namespace Umbraco.Web.Install.Controllers //update the status InstallStatusTracker.SetComplete(step.Name, setupData); + return Json(new { complete = false, - stepCompleted = step.Name + stepCompleted = step.Name }, HttpStatusCode.OK); } catch (InstallException iex) diff --git a/src/Umbraco.Web/Install/Controllers/InstallController.cs b/src/Umbraco.Web/Install/Controllers/InstallController.cs index e6fdcd6c1e..9642b7973c 100644 --- a/src/Umbraco.Web/Install/Controllers/InstallController.cs +++ b/src/Umbraco.Web/Install/Controllers/InstallController.cs @@ -66,7 +66,7 @@ namespace Umbraco.Web.Install.Controllers ViewBag.InstallApiBaseUrl = Url.GetUmbracoApiService("GetSetup", "InstallApi", "install").TrimEnd("GetSetup"); //get the base umbraco folder - ViewBag.UmbracoBaseFolder = SystemDirectories.Umbraco; + ViewBag.UmbracoBaseFolder = IOHelper.ResolveUrl(SystemDirectories.Umbraco); return View(); } diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs b/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs index b5bbbe3a91..83b85b4201 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs @@ -13,7 +13,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("DatabaseConfigure", "database")] + [InstallSetupStep("DatabaseConfigure", "database", "Configuring your database connection")] internal class DatabaseConfigureStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs index a901bba842..9b6790e8c1 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs @@ -8,7 +8,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("DatabaseInstall", "")] + [InstallSetupStep("DatabaseInstall", "", "Installing database tables and default system data")] internal class DatabaseInstallStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs b/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs index 83d3279a11..e7cf551bb1 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs @@ -7,7 +7,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("DatabaseUpgrade", "")] + [InstallSetupStep("DatabaseUpgrade", "", "Upgrading your database to the latest version")] internal class DatabaseUpgradeStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; diff --git a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs b/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs index 7babeaa2f8..7367002ea4 100644 --- a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs @@ -8,7 +8,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("Permissions", "")] + [InstallSetupStep("Permissions", "", "Ensuring your file permissions are set correctly")] internal class FilePermissionsStep : InstallSetupStep { public override IDictionary Execute(object model) diff --git a/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs b/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs index 611a14be1b..a0ebef694d 100644 --- a/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs @@ -10,7 +10,7 @@ using GlobalSettings = umbraco.GlobalSettings; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("UmbracoVersion", "")] + [InstallSetupStep("UmbracoVersion", "", "Wrapping up the system configuration")] internal class SetUmbracoVersionStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs index 9766fda371..4a01fcd6be 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs @@ -7,7 +7,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("StarterKitCleanup", "")] + [InstallSetupStep("StarterKitCleanup", "", "Cleaning up temporary files")] internal class StarterKitCleanupStep : InstallSetupStep { private readonly InstallStatus _status; diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs index 58891e0992..f53d3b32eb 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs @@ -6,7 +6,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("StarterKitDownload", "starterKit")] + [InstallSetupStep("StarterKitDownload", "starterKit", "Downloading a starter website from our.umbraco.org, hold tight, this could take a little while")] internal class StarterKitDownloadStep : InstallSetupStep { private readonly InstallStatus _status; diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs index 8deda42115..b7297f81fc 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs @@ -7,7 +7,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("StarterKitInstall", "")] + [InstallSetupStep("StarterKitInstall", "", "Installing a starter website to help you get off to a great start")] internal class StarterKitInstallStep : InstallSetupStep { private readonly InstallStatus _status; diff --git a/src/Umbraco.Web/Install/InstallSteps/UserStep.cs b/src/Umbraco.Web/Install/InstallSteps/UserStep.cs index f63dd63a08..150a8b4396 100644 --- a/src/Umbraco.Web/Install/InstallSteps/UserStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/UserStep.cs @@ -8,7 +8,7 @@ using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps { - [InstallSetupStep("User", "user")] + [InstallSetupStep("User", "user", "Saving your user credentials")] internal class UserStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; diff --git a/src/Umbraco.Web/Install/Models/InstallSetupStep.cs b/src/Umbraco.Web/Install/Models/InstallSetupStep.cs index 5349ccbc50..7365b77a70 100644 --- a/src/Umbraco.Web/Install/Models/InstallSetupStep.cs +++ b/src/Umbraco.Web/Install/Models/InstallSetupStep.cs @@ -58,6 +58,7 @@ namespace Umbraco.Web.Install.Models } Name = att.Name; View = att.View; + Description = att.Description; } [DataMember(Name = "name")] @@ -66,6 +67,9 @@ namespace Umbraco.Web.Install.Models [DataMember(Name = "view")] public virtual string View { get; private set; } + [DataMember(Name = "description")] + public string Description { get; private set; } + /// /// Defines what order this step needs to execute on the server side since the /// steps might be shown out of order on the front-end diff --git a/src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs b/src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs index e14eece2b3..6684c1c369 100644 --- a/src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs +++ b/src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs @@ -4,13 +4,15 @@ namespace Umbraco.Web.Install.Models { public sealed class InstallSetupStepAttribute : Attribute { - public InstallSetupStepAttribute(string name, string view) + public InstallSetupStepAttribute(string name, string view, string description) { Name = name; View = view; + Description = description; } public string Name { get; private set; } public string View { get; private set; } + public string Description { get; private set; } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Install/Models/Package.cs b/src/Umbraco.Web/Install/Models/Package.cs new file mode 100644 index 0000000000..c30e0db16f --- /dev/null +++ b/src/Umbraco.Web/Install/Models/Package.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Umbraco.Web.Install.Models +{ + [DataContract(Name = "package")] + public class Package + { + [DataMember(Name = "name")] + public string Name { get; set; } + [DataMember(Name = "thumbnail")] + public string Thumbnail { get; set; } + [DataMember(Name = "id")] + public Guid Id { get; set; } + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 62d5c21188..767439f612 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -319,6 +319,7 @@ +