Nibble

Archive for the 'Package' Category


Extending UI-O-Matic v2 with custom List Actions 1

Something that we’ve just added to UI-O-Matic v2 is the ability to plug in additional actions. So by default you get CRUD but now you will also be able to plug in third party ones!

Example

Let’s say you want to provide export functionality to your clients, here is how do do that (this is currently run on the latest source so still subject to change)

Defining the action

Step 1 is that we’ll need to define our action, each action consist of a name, alias and a view it will open

1 [UIOMaticAction("export","Export", "~/App_Plugins/UIOMaticAddons/export.html")] 2 public class ExportAction { }

Next we add the our model (if we take the previous example we can just add the new Action by adding it to the ListActions parameter of our UIOMatic attribute)

1 [TableName("ContactEntries")] 2 [PrimaryKey("Id", autoIncrement = true)] 3 [UIOMatic("contactentries", "Contact Entries", "Contact Entry", 4 FolderIcon = "icon-users", 5 SortColumn = "Created", SortOrder = "desc", 6 RenderType = UIOMaticRenderType.List, 7 ListActions = new[]{ typeof(ExportAction)})] 8 public class ContactEntry

The Angular View and Controller

As you see we pointed the new action to ~/App_Plugins/UIOMaticAddons/export.html so we now have to build that dialog

1 <div ng-controller="uioMaticAddons.ExportController"> 2 <p ng-show="loading">Generating Export…</p> 3 <a href="{{file}}" ng-hide="loading" target="_blank">Download export here</a> 4 </div>

 

1 angular.module("umbraco").controller("uioMaticAddons.ExportController", 2 function ($scope, uioMaticExportResource) { 3 $scope.loading = true; 4 uioMaticExportResource.getExport($scope.dialogData.typeAlias).then(function (response) { 5 $scope.file = response.data; 6 $scope.loading = false; 7 }); 8 });

 

As you can see here we just call a resource and provide it with the typeAlias (that is provided to us in the dialog data).

The resource will return the file name of the csv export.

AngularJS Resource

1 angular.module("umbraco.resources") 2 .factory("uioMaticExportResource", function ($http, umbRequestHelper) { 3 return { 4 getExport: function (typeAlias) { 5 return umbRequestHelper.resourcePromise( 6 $http.get(Umbraco.Sys.ServerVariables.uioMaticAddons.ecBaseUrl + "GetExport?typeAlias="+typeAlias), 7 Failed to generate export 8 ); 9 } 10 } 11 });

this one basicly calls our .net controller

.NET Controller

1 using CsvHelper; 2 using System; 3 using System.IO; 4 using Umbraco.Core.IO; 5 using Umbraco.Web.Editors; 6 7 namespace TestUIOMatic2Take2.Controllers 8 { 9 public class ExportController: UmbracoAuthorizedJsonController 10 { 11 public object GetExport(string typeAlias) 12 { 13 var guid = Guid.NewGuid(); 14 15 using (var textWriter = File.CreateText(IOHelper.MapPath(@"~\App_Plugins\UIOMaticAddons\Exports\" + guid + ".csv"))) 16 { 17 using (var csv = new CsvWriter(textWriter)) 18 { 19 var os = new UIOMatic.Services.PetaPocoObjectService(); 20 21 var data = os.GetAll(UIOMatic.Helper.GetUIOMaticTypeByAlias(typeAlias)); 22 23 csv.Configuration.Delimiter = ";"; 24 csv.Configuration.HasHeaderRecord = true; 25 26 csv.WriteRecords(data); 27 } 28 } 29 30 return new { data = "../App_Plugins/UIOMaticAddons/Exports/" + guid.ToString() + ".csv" }; 31 } 32 } 33 }

 

This uses the great and simple CsvHelper package to easily generate a csv file out of our data and then stores it on disk and returns the file location.

Result

I now got an additional export action I can apply to any model I wish!

Screen Shot 2016-10-27 at 22.18.45

Screen Shot 2016-10-27 at 22.18.58

Future

Once v2 final is out, I’ll make a nuget package out of this (and probably make some tweaks since this is just a proof of concept at the moment) so you can easiliy install it and extend your UI-O-Matic models

Using UI-O-Matic V2 as an entries viewer for your custom forms 0

As promised I would share some real world examples of using UI-O-Matic. One thing I tend to use if for is as a quick entries viewer for custom made forms on your Umbraco site.

Prerequisites

So of course we first need to setup a form on our frontend, for that we’ll need a model, view and (surface)controller. If you arent’ familiar with how to set that up check out the chapter on Umbraco.tv http://umbraco.tv/videos/umbraco-v7/developer/fundamentals/surface-controllers/introduction/ or I’ve also seen this video recently https://www.youtube.com/watch?v=3V0A1AYJbys explaining the process.

Model

1 [TableName("ContactEntries")] 2 [PrimaryKey("Id", autoIncrement = true)] 3 public class ContactEntry 4 { 5 [PrimaryKeyColumn(AutoIncrement = true)] 6 public int Id { get; set; } 7 8 [Required] 9 public string Name { get; set; } 10 11 [Required] 12 [EmailAddress] 13 public string Email { get; set; } 14 15 [SpecialDbType(SpecialDbTypes.NTEXT)] 16 [Required] 17 public string Message { get; set; } 18 19 public DateTime Created { get; set; } 20 }


View

1 @if (TempData["success"] != null) 2 { 3 <p>Thank you for your message!</p> 4 } 5 else 6 { 7 using (Html.BeginUmbracoForm<ContactController>("HandlePost")) 8 { 9 <div> 10 @Html.LabelFor(m => m.Name) 11 @Html.TextBoxFor(x => x.Name) 12 @Html.ValidationMessageFor(m => m.Name) 13 </div> 14 15 <div> 16 @Html.LabelFor(m => m.Email) 17 @Html.TextBoxFor(x => x.Email) 18 @Html.ValidationMessageFor(m => m.Email) 19 </div> 20 21 <div> 22 @Html.LabelFor(m => m.Message) 23 @Html.TextAreaFor(x => x.Message) 24 @Html.ValidationMessageFor(m => m.Message) 25 </div> 26 27 <div> 28 <button type="submit">Submit</button> 29 </div> 30 } 31 }


Controller

1 public class ContactController : SurfaceController 2 { 3 [ChildActionOnly] 4 public ActionResult Render() 5 { 6 return PartialView("ContactEntry",new Models.ContactEntry()); 7 } 8 9 [HttpPost] 10 public ActionResult HandlePost(Models.ContactEntry model) 11 { 12 if (!ModelState.IsValid) 13 return CurrentUmbracoPage(); 14 15 //add to db 16 model.Created = DateTime.Now; 17 var db = ApplicationContext.DatabaseContext.Database; 18 db.Insert(model); 19 20 //send email, do other things… 21 22 TempData["Success"] = true; 23 return RedirectToCurrentUmbracoPage(); 24 } 25 }

 

Of course you’ll also need to make sure your db table exist, that can be done with this piece of code

1 public class App: ApplicationEventHandler 2 { 3 protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 4 { 5 var ctx = applicationContext.DatabaseContext; 6 var db = new DatabaseSchemaHelper(ctx.Database, applicationContext.ProfilingLogger.Logger, ctx.SqlSyntax); 7 8 //Check if the DB table does NOT exist 9 if (!db.TableExist("ContactEntries")) 10 { 11 //Create DB table - and set overwrite to false 12 db.CreateTable(false, typeof(ContactEntry)); 13 } 14 15 } 16 }

So far this has nothing to do with UI-O-Matic it’s just standard Umbraco, MVC and PetaPoco (to insert a db entry).

But of course we now want to show these entries to the client…

Adding UI-O-Matic V2 into the mix

The only thing we have to do now is install UI-O-Matic v2 (at this moment it’s in beta and you can get it from Nuget or build the latest source from github). In this example I’ve build the latest source and installed that but all these features will make it into the final release.

1 [TableName("ContactEntries")] 2 [PrimaryKey("Id", autoIncrement = true)] 3 [UIOMatic("contactentries", "Contact Entries", "Contact Entry", 4 FolderIcon = "icon-users", ItemIcon = "icon-user", 5 SortColumn = "Created", SortOrder = "desc", 6 RenderType = UIOMaticRenderType.List)] 7 public class ContactEntry 8 { 9 [PrimaryKeyColumn(AutoIncrement = true)] 10 public int Id { get; set; } 11 12 [Required] 13 [UIOMaticListViewField] 14 [UIOMaticField] 15 public string Name { get; set; } 16 17 [Required] 18 [EmailAddress] 19 [UIOMaticListViewField] 20 [UIOMaticField] 21 public string Email { get; set; } 22 23 [SpecialDbType(SpecialDbTypes.NTEXT)] 24 [Required] 25 [UIOMaticListViewField] 26 [UIOMaticField(View = UIOMatic.Constants.FieldEditors.Textarea)] 27 public string Message { get; set; } 28 29 [UIOMaticListViewField(Config = "{’format’ : ‘{{value|relativeDate}}’}")] 30 [UIOMaticField(View = UIOMatic.Constants.FieldEditors.DateTime)] 31 public DateTime Created { get; set; } 32 }

 

So first we simply decorate the class with the UIOMatic attribute, providing a unique alias, a singular name and a plural name for our object and some optional parameters like which icon to use and that we would like to render in a list instead of the tree

Then we can mark the items we want in the actual editor (marked with UIOMaticField, can also specify a different editor then textstring as you can see in the example)

And mark the ones we want in the list view (marked with UIOMaticListViewField)

Result

Screen Shot 2016-10-27 at 13.02.11

Screen Shot 2016-10-27 at 13.40.54

As you see simply by decorating our model with some additional attributes we now get an entries viewer/editor! Kapow!

UI-O-Matic v2 Beta looking for testers 0

Two weeks ago I spotted this message on my Github timeline

CuFO0MzXgAENpZ5

and I must say I was pretty excited to see the great Matt Brailsford forking the UI-O-Matic repo. In his fork he has taken the project to the next level,  housekeeping and improving the codebase and implementing quite a few new features.

What has changed?

The project has undergone major refactoring, a lot has changed, so it is not possible to upgrade from v1 to v2 without having to make a couple of changes. To outline the main differences:

  • No IUIOMatic interface and custom validation method but simply using standard .net data annotations
  • UIOMatic field property is now explicit, so if you want it to show up in the UI you need to mark your properties
  • Explicit UIOMaticListViewField attribute (use this if you want properties to show up in the listview)
  • Consistency in the js, no more uppercase properties, this has an impact if you created custom property views, use property.value instead of property.Value

What’s new?

  • Core project (there are now 2 nuget packages one for the core and 1 for the ui)
  • Folder Support
  • List view views (so you can now choose how to render a property in the list view, think image as an example)
  • Filter option on the list view (with the new UIOMaticListViewFilter attribute)
  • UIOMaticRepository (so devs can supply a custom repository object)
  • Map field type
  • New Logo

CvZXRXYWcAA3pQ4

Installation

You can install the beta via Nuget:
Install-Package Nibble.Umbraco.UIOMatic –Pre

Documentation

We are currently working at updating the docs (and they should be ready when the final hits the shelves), you should be able to get started with what is currently available at http://uiomatic.readthedocs.io/en/stable/

Reporting bugs

You can either submit them on the forum https://our.umbraco.org/projects/developer-tools/ui-o-matic/computer-says-no/ or directly on the issue tracker https://github.com/TimGeyssens/UIOMatic/issues

Again credits for this release go out to Matt! H5YR!

Config Tree for Umbraco Now available on Nuget 0

It must have been one of the first project I created for Umbraco (timestamp says it was released December 14, 2008 http://www.nibble.be/?p=53)

But now at last it’s available as a Nuget package https://www.nuget.org/packages/Nibble.Umbraco.ConfigTree/

Simply run the command Install-Package Nibble.Umbraco.ConfigTree in the package manager console of Visual Studio and you’ll have a new tree where you can edit all files in the /config folder of Umbraco.

UI-O-Matic and setting default values 4

I’ve just released verison 1.7.0 which adds the ability to set default values by using the event model.

You can now attach to the event UIOMatic.Controllers.PetaPocoObjectController.ScaffoldingObject

Here is an example:

Say we have the following poco (with all of the UI-O-Matic stuff in place).

1 [UIOMatic("TestWithDate", "icon-users", "icon-user", RenderType = UIOMaticRenderType.List, 2 SortColumn = "TheDate", SortOrder = "desc")] 3 [TableName("TestWithDate")] 4 public class TestWithDate : IUIOMaticModel 5 { 6 public TestWithDate() 7 { 8 9 } 10 11 12 [UIOMaticIgnoreField] 13 [PrimaryKeyColumn(AutoIncrement = true)] 14 public int Id { get; set; } 15 16 [UIOMaticField("Firstname", "Enter your firstname")] 17 public string FirstName { get; set; } 18 19 [UIOMaticField("Lastname", "Enter your lastname")] 20 public string LastName { get; set; } 21 22 [UIOMaticField("TheDate", "Select a date")] 23 public DateTime TheDate { get; set; } 24 25 public IEnumerable<Exception> Validate() 26 { 27 28 return new List<Exception>(); 29 } 30 }

And we wish to set TheDate property to the current date time, you can now do that in the following way:

1 public class Startup : ApplicationEventHandler 2 { 3 protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 4 { 5 UIOMatic.Controllers.PetaPocoObjectController.ScaffoldingObject += PetaPocoObjectController_ScaffoldingObject; 6 } 7 8 private void PetaPocoObjectController_ScaffoldingObject(object sender, UIOMatic.ObjectEventArgs e) 9 { 10 if (e.Object.GetType() == typeof(TestWithDate)) 11 ((TestWithDate)e.Object).TheDate = DateTime.Now; 12 } 13 }

So by using the event model, subscribe to the ScaffoldingObject event, and the in the eventhandler check the type of object (since this is executed for each type), and then simply cast to the correct type and set the property(or multiple) you would like to have a default value for.

UI-O-Matic and one to many relations 1

Just had this question on the forum and makes sense to share this in a blog post so here it is

How can you handle one to many relations with UI-O-Matic? Think order and orderlines

If you take a look at the example project we have the following 2 classes

Dog

1 [UIOMatic(Dogs, icon-users, icon-user, RenderType = UIOMaticRenderType.List)] 2 [TableName(Dogs)] 3 public class Dog : IUIOMaticModel 4 { 5 public Dog() { } 6 7 [UIOMaticIgnoreField] 8 [PrimaryKeyColumn(AutoIncrement = true)] 9 public int Id { get; set; } 10 11 [UIOMaticNameField] 12 public string Name { get; set; } 13 14 [UIOMaticField(Is castrated, Has the dog been castrated)] 15 public bool IsCastrated { get; set; } 16 17 18 [UIOMaticField(Owner, Select the owner of the dog, View = dropdown, 19 Config = {’typeName’: ‘Example.Models.Person, Example’, ‘valueColumn’: ‘Id’, ’sortColumn’: ‘FirstName’, ‘textTemplate’ : ‘FirstName + \” \”+ LastName ‘})] 20 [UIOMaticIgnoreFromListView] 21 public int OwnerId { get; set; } 22 23 public override string ToString() 24 { 25 return Name; 26 } 27 28 public IEnumerable<Exception> Validate() 29 { 30 var exs = new List<Exception>(); 31 32 if (string.IsNullOrEmpty(Name)) 33 exs.Add(new Exception(Please provide a value for name)); 34 35 if (OwnerId == 0) 36 exs.Add(new Exception(Please select an owner)); 37 38 39 return exs; 40 } 41 }

As you see the dog has an OwnerId property that is linked to the Person class  (in the way described here http://www.nibble.be/?p=491 ) So we get a nice dropdown where we can select a Person (instead of having to type in the id)

Person

1 [UIOMatic(People, icon-users, icon-user,SortColumn=FirstName)] 2 [TableName(People)] 3 public class Person : IUIOMaticModel 4 { 5 public Person() { } 6 7 [UIOMaticIgnoreField] 8 [PrimaryKeyColumn(AutoIncrement = true)] 9 public int Id { get; set; } 10 11 [UIOMaticField(Firstname,Enter your firstname)] 12 public string FirstName { get; set; } 13 14 [UIOMaticField(Lastname, Enter your lastname)] 15 public string LastName { get; set; } 16 17 [UIOMaticField(Picture, Please select a picture,View =file)] 18 public string Picture { get; set; } 19 20 [Ignore] 21 [UIOMaticField(Dogs, “”, View =list, 22 Config = {’typeName’: ‘Example.Models.Dog, Example’, ‘foreignKeyColumn’ : ‘OwnerId’, ‘canEdit’ : false})] 23 public IEnumerable<Dog> Dogs { get; set; } 24 25 public override string ToString() 26 { 27 return FirstName + + LastName; 28 } 29 30 public IEnumerable<Exception> Validate() 31 { 32 var exs = new List<Exception>(); 33 34 if (string.IsNullOrEmpty(FirstName)) 35 exs.Add(new Exception(Please provide a value for first name)); 36 37 if (string.IsNullOrEmpty(LastName)) 38 exs.Add(new Exception(Please provide a value for last name)); 39 40 41 return exs; 42 } 43 }

On the person class you’ll see a Dogs property (that is set to Ignore since it isn’t an actuall column) making use of the list field view type (more on that in the docs)

The result

We get a nice overview off all dogs associated with the selected person

Screen Shot 2016-02-19 at 13.54.05

UI-O-Matic Event Model 5

The most recent version of UI-O-Matic (1.4.0 at this moment) introduces a couple of events that allow you to do some interesting stuff. The events are all placed on the PetaPocoObjectController (that’s the controller responsable for handling the crud operations).

Following the Umbraco convention there are before and after events.

BuildingQuery and BuildedQuery

These execute when UI-O-Matic builds the sql query for fetching the list view data. By default UI-O-Matic will fetch all the data from the table but using these events you can limit that by still having control over the query before it is executed.

CreatingObject and CreatedObject

These will execute when UI-O-Matic is inserting an object, so you can use these events to set values.

UpdatingObject and UpdatedObject

These will execute when UI-O-Matic is updating an object

Examples

1 public class EventHandlerscs: ApplicationEventHandler 2 { 3 protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 4 { 5 UIOMatic.Controllers.PetaPocoObjectController.CreatingObject += PetaPocoObjectController_CreatingObject; 6 UIOMatic.Controllers.PetaPocoObjectController.BuildingQuery += PetaPocoObjectController_BuildingQuery; 7 } 8 9 void PetaPocoObjectController_CreatingObject(object sender, UIOMatic.ObjectEventArgs e) 10 { 11 if (e.Object.GetType() == typeof (ccpEvent)) 12 { 13 ccpEvent ob = (ccpEvent) e.Object; 14 ob.IsApproved = true; 15 } 16 } 17 18 void PetaPocoObjectController_BuildingQuery(object sender, UIOMatic.QueryEventArgs e) 19 { 20 if (e.TableName == ccpEvent) 21 e.Query.Where(AREAID = @0, 2); 22 } 23 }

UI-O-Matic, handling Foreign Keys 17

Something you’ll bump into sooner or later when working with custom tables are relationships between tables.

Let’s say we have the following 2 pocos (and matching tables)

People

1 [UIOMatic("People", "icon-users", "icon-user",SortColumn="FirstName")] 2 [TableName("People")] 3 public class Person : IUIOMaticModel 4 { 5 public Person() { } 6 7 [UIOMaticIgnoreField] 8 [PrimaryKeyColumn(AutoIncrement = true)] 9 public int Id { get; set; } 10 11 [UIOMaticField("Firstname","Enter your firstname")] 12 public string FirstName { get; set; } 13 14 [UIOMaticField("Lastname", "Enter your lastname")] 15 public string LastName { get; set; } 16 17 [UIOMaticField("Picture", "Please select a picture",View ="file")] 18 public string Picture { get; set; } 19 20 public override string ToString() 21 { 22 return FirstName + " " + LastName; 23 } 24 25 public IEnumerable<Exception> Validate() 26 { 27 var exs = new List<Exception>(); 28 29 if (string.IsNullOrEmpty(FirstName)) 30 exs.Add(new Exception("Please provide a value for first name")); 31 32 if (string.IsNullOrEmpty(LastName)) 33 exs.Add(new Exception("Please provide a value for last name")); 34 35 36 return exs; 37 } 38 }

Dogs

1 [UIOMatic("Dogs", "icon-users", "icon-user", RenderType = UIOMaticRenderType.List)] 2 [TableName("Dogs")] 3 public class Dog : IUIOMaticModel 4 { 5 public Dog() { } 6 7 [UIOMaticIgnoreField] 8 [PrimaryKeyColumn(AutoIncrement = true)] 9 public int Id { get; set; } 10 11 12 public string Name { get; set; } 13 14 [UIOMaticField("Is castrated", "Has the dog been castrated")] 15 public bool IsCastrated { get; set; } 16 17 18 19 public int OwnerId { get; set; } 20 21 public override string ToString() 22 { 23 return Name; 24 } 25 26 public IEnumerable<Exception> Validate() 27 { 28 var exs = new List<Exception>(); 29 30 if (string.IsNullOrEmpty(Name)) 31 exs.Add(new Exception("Please provide a value for name")); 32 33 if (OwnerId == 0) 34 exs.Add(new Exception("Please select an owner")); 35 36 37 return exs; 38 } 39 }

You’ll see that the Dog class has an property of type int called OwnerId, this will be populated with the id of a Person.

If we let UI-O-Matic render this you’ll get an input of type number but that isn’t what we want since we don’t know which number matches a certain person.

Screen Shot 2015-10-26 at 10.57.47

So instead we want the see the persons full name and be able to select it from a dropdown.

All that we’ll need to do is use the UIOMaticField attribute and say that we want to use a dropdown and pass our dropdown some configuration

1 [UIOMaticField("Owner", "Select the owner of the dog", View = "dropdown", 2 Config = "{’typeName’: ‘Example.Models.Person, Example’, ‘valueColumn’: ‘Id’, ’sortColumn’: ‘FirstName’, ‘textTemplate’ : ‘FirstName + \" \"+ LastName ‘}")] 3 public int OwnerId { get; set; }


So the view is set to dropdown and the config we are passing is (in json format)

  • The name of the type that will be used to populate the dropdown
  • The column used for the value of the item
  • The template used for the text of the item
  • The column used for sorting

Now if we let UI-O-Matic render this we’ll get the following result

Screen Shot 2015-10-26 at 11.04.57

Besides dropdown you can also use a checkboxlist or radiobuttonlist, for more info please check the documentation

Introducing UI-O-Matic for Umbraco, Integrated crud UI for custom db tables in minutes 12

With great pleasure I can announce the first release of a new package: UI-O-Matic.

What can it do?

Well a bit over a year ago I showed an example of how you could create a crud UI for a third party db table. As you can see in that post it is quite a bit of work to make it function…it consists of a petapoco poco, a tree controller, an api controller, angularjs views and controllers and more…

Instead of doing that now you can simply use UI-O-Matic, UI-O-Matic makes it super simple to create a crud ui for your tables, all you need to do is add some additional attributes and implement an interface that has a single member on your poco. UI-O-Matic will use that information to auto generate the UI for you.

Example please

If you have the following db table

1 CREATE TABLE [People] ( 2 [Id] int IDENTITY (1,1) NOT NULL 3 , [FirstName] nvarchar(255) NOT NULL 4 , [LastName] nvarchar(255) NOT NULL 5 , [Picture] nvarchar(255) NOT NULL 6 );

This class

1 [UIOMaticAttribute("People","icon-users","icon-user")] 2 [TableName("People")] 3 public class Person: IUIOMaticModel 4 { 5 public Person() { } 6 7 [UIOMaticIgnoreField] 8 [PrimaryKeyColumn(AutoIncrement = true)] 9 public int Id { get; set; } 10 11 [UIOMaticField("First name","Enter the persons first name")] 12 public string FirstName { get; set; } 13 14 [UIOMaticField("Last name", "Enter the persons last name")] 15 public string LastName { get; set; } 16 17 [UIOMaticField("Picture", "Select a picture", View = "file")] 18 public string Picture { get; set; } 19 20 public override string ToString() 21 { 22 return FirstName + " " + LastName; 23 } 24 25 public IEnumerable<Exception> Validate() 26 { 27 var exs = new List<Exception>(); 28 29 if(string.IsNullOrEmpty(FirstName)) 30 exs.Add(new Exception("Please provide a value for first name")); 31 32 if (string.IsNullOrEmpty(LastName)) 33 exs.Add(new Exception("Please provide a value for last name")); 34 35 36 return exs; 37 } 38 }`

will generate the following integrated crud UI

example

Where can I get it?

You can simply install it from nuget (after installation make sure to give your users access to the new section)

PM> Install-Package Nibble.Umbraco.UIOMatic

Is there documentation?

Yup, you can find that at http://uiomatic.readthedocs.org/

And there is also a recent uHangout showing the state of the project

Now what?

So please give it a try (it should do an awesome job on simple tables but haven’t tested that much on complex ones) and let me know if there are any issues , of course it’s open for collab so fork and submit pull request at will!

EAsy Custom 404 Pages for Umbraco 5

Introducing a small new package that allows you to set your Umbraco site 404 page(s) from within the UI. The page not found manager will extend the content context menu for admins with a new option “404 page”.

Screen Shot 2015-09-22 at 10.44.23

The new option will open a dialog where you are able to select a 404 page for the current page and it’s children (either by searching or selecting a page from the content tree).

Screen Shot 2015-09-22 at 10.48.34

So you can also setup multiple 404 pages (in case you have a multilingual site or an umbraco instance running multiple sites). Since it works this way it’s more versatile then the standard umbraco 404 page setup.

You can download the package on our.umbraco.org https://our.umbraco.org/projects/backoffice-extensions/umbraco-page-not-found-manager/

Or install it through nuget https://www.nuget.org/packages/Nibble.Umbraco.PageNotFoundManager/

If you are insterested in the sourcecode that can be found on GitHub https://github.com/TimGeyssens/UmbracoPageNotFoundManager

And if you wanna learn more you can view a live demo and a run through of the code on this weeks uHangout https://www.youtube.com/watch?v=bFL0xUhRerI

Next Page »