├── App_Code ├── PeopleTreeController.cs ├── Person.cs └── PersonApiController.cs ├── App_Plugins └── People │ ├── backoffice │ └── peopletree │ │ ├── edit.controller.js │ │ └── edit.html │ ├── package.manifest │ ├── person.resource.js │ ├── propertyeditors │ ├── personpicker.controller.js │ ├── personpicker.html │ └── personpickerdialog.html │ └── umbraco │ └── peopleTree │ ├── detox.html │ ├── dialogs.controller.js │ └── drink.html ├── people.sql ├── readme.md └── slides.md /App_Code/PeopleTreeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http.Formatting; 5 | using System.Web; 6 | 7 | using Umbraco.Core; 8 | using Umbraco.Web.Models.Trees; 9 | using Umbraco.Web.Mvc; 10 | using Umbraco.Web.Trees; 11 | 12 | 13 | /// 14 | /// Summary description for PeopleTreeController 15 | /// 16 | 17 | //add treecontroller 18 | [Tree("settings", "peopleTree", "People")] 19 | [PluginController("People")] 20 | public class MyCustomTreeController : TreeController 21 | { 22 | 23 | 24 | protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) 25 | { 26 | //check if we're rendering the root node's children 27 | if (id == Constants.System.Root.ToInvariantString()) 28 | { 29 | var ctrl = new PersonApiController(); 30 | var nodes = new TreeNodeCollection(); 31 | 32 | foreach (var person in ctrl.GetAll()) 33 | { 34 | var node = CreateTreeNode(person.Id.ToString(), queryStrings, person.Name, "icon-user", false); 35 | 36 | if (person.IsDrunk) 37 | node.Icon = "icon-wine-glass"; 38 | 39 | nodes.Add(node); 40 | 41 | } 42 | return nodes; 43 | } 44 | 45 | //this tree doesn't suport rendering more than 1 level 46 | throw new NotSupportedException(); 47 | } 48 | 49 | 50 | 51 | protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) 52 | { 53 | 54 | var menu = new MenuItemCollection(); 55 | var m = new MenuItem("drink", "Drink"); 56 | m.Icon = "wine-glass"; 57 | menu.Items.Add(m); 58 | 59 | var x = new MenuItem("detox", "Detox"); 60 | x.Icon = "medicine"; 61 | menu.Items.Add(x); 62 | 63 | return menu; 64 | } 65 | } -------------------------------------------------------------------------------- /App_Code/Person.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.Serialization; 5 | using System.Web; 6 | using Umbraco.Core.Persistence; 7 | 8 | /// 9 | /// Summary description for People 10 | /// 11 | /// 12 | 13 | [TableName("people")] 14 | [DataContract(Name="person", Namespace = "")] 15 | public class Person 16 | { 17 | [DataMember(Name="id")] 18 | public int Id { get; set; } 19 | 20 | [DataMember(Name = "name")] 21 | public string Name { get; set; } 22 | 23 | [DataMember(Name = "addresse")] 24 | public string Addresse { get; set; } 25 | 26 | [DataMember(Name = "email")] 27 | public string Email { get; set; } 28 | 29 | [DataMember(Name = "bio")] 30 | public string Bio { get; set; } 31 | 32 | [DataMember(Name = "isDrunk")] 33 | public bool IsDrunk { get; set; } 34 | } -------------------------------------------------------------------------------- /App_Code/PersonApiController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using Umbraco.Core.Persistence; 6 | using Umbraco.Web.Editors; 7 | using Umbraco.Web.Mvc; 8 | 9 | /// 10 | /// Summary description for PeopleController 11 | /// 12 | /// 13 | [PluginController("People")] 14 | public class PersonApiController : UmbracoAuthorizedJsonController 15 | { 16 | public Person PostSave(Person person) { 17 | if (person.Id > 0) 18 | DatabaseContext.Database.Update(person); 19 | else 20 | DatabaseContext.Database.Save(person); 21 | 22 | return person; 23 | } 24 | 25 | public int DeleteById(int id) { 26 | var db = UmbracoContext.Application.DatabaseContext.Database; 27 | return db.Delete(id); 28 | } 29 | 30 | public int GetDrunk(int id) 31 | { 32 | var db = UmbracoContext.Application.DatabaseContext.Database; 33 | return db.Update("SET isDrunk = @0 WHERE id = @1", true, id); 34 | } 35 | 36 | public int GetSober(int id) 37 | { 38 | var db = UmbracoContext.Application.DatabaseContext.Database; 39 | return db.Update("SET isDrunk = @0 WHERE id = @1", false, id); 40 | } 41 | 42 | public Person GetById(int id) { 43 | var db = UmbracoContext.Application.DatabaseContext.Database; 44 | var query = new Sql().Select("*").From("people").Where(x => x.Id == id); 45 | 46 | return db.Fetch(query).FirstOrDefault(); 47 | } 48 | 49 | public IEnumerable GetAll() 50 | { 51 | var db = UmbracoContext.Application.DatabaseContext.Database; 52 | var query = new Sql().Select("*").From("people"); 53 | 54 | return db.Fetch(query); 55 | } 56 | } -------------------------------------------------------------------------------- /App_Plugins/People/backoffice/peopletree/edit.controller.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco").controller("People.PersonEditController", 2 | function($scope, $routeParams, personResource, notificationsService){ 3 | 4 | //get a person id -> service 5 | personResource.getById($routeParams.id).then(function(response){ 6 | $scope.person = response.data; 7 | }); 8 | 9 | $scope.save = function(person){ 10 | personResource.save(person).then(function(response){ 11 | $scope.person = response.data; 12 | 13 | notificationsService.success("Success", person.name + " has been saved"); 14 | }); 15 | }; 16 | }); -------------------------------------------------------------------------------- /App_Plugins/People/backoffice/peopletree/edit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 10 |
11 |
12 |
13 | Save 14 |
15 |
16 |
17 | 18 |
19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 |
33 |
-------------------------------------------------------------------------------- /App_Plugins/People/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | propertyEditors: [ 3 | { 4 | alias: "People.PersonPicker", 5 | name: "Person Picker", 6 | hideLabel: false, 7 | valueType: "INT", 8 | editor: { 9 | view: "~/App_Plugins/People/propertyEditors/PersonPicker.html" 10 | } 11 | } 12 | ], 13 | 14 | javascript: [ 15 | '~/App_Plugins/People/propertyEditors/PersonPicker.controller.js', 16 | '~/App_Plugins/People/backoffice/peopletree/edit.controller.js', 17 | '~/App_Plugins/People/umbraco/peopletree/dialogs.controller.js', 18 | '~/App_Plugins/People/person.resource.js' 19 | ] 20 | } -------------------------------------------------------------------------------- /App_Plugins/People/person.resource.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.resources") 2 | .factory("personResource", function($http){ 3 | return{ 4 | getById: function(id){ 5 | return $http.get("People/PersonApi/GetById?id="+id); 6 | }, 7 | 8 | getall: function(){ 9 | return $http.get("People/PersonApi/GetAll"); 10 | }, 11 | 12 | save: function(person){ 13 | return $http.post("People/PersonApi/PostSave", angular.toJson(person)); 14 | }, 15 | 16 | getDrunkById: function(id){ 17 | return $http.get("People/PersonApi/GetDrunk?id="+id); 18 | }, 19 | 20 | getSoberById: function(id){ 21 | return $http.get("People/PersonApi/GetSober?id="+id); 22 | } 23 | }; 24 | }); -------------------------------------------------------------------------------- /App_Plugins/People/propertyeditors/personpicker.controller.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco").controller("People.PersonPickerController", 2 | function($scope, dialogService){ 3 | $scope.openPicker = function(){ 4 | dialogService.open({ 5 | template: "../app_plugins/people/propertyeditors/personpickerdialog.html", 6 | scope: $scope, 7 | callback: populate 8 | }); 9 | }; 10 | 11 | function populate(data){ 12 | $scope.model.value = data; 13 | }; 14 | }); 15 | 16 | 17 | angular.module("umbraco").controller("People.PersonPickerDialogController", 18 | function($scope, dialogService){ 19 | 20 | $scope.dialogEventHandler = $({}); 21 | 22 | $scope.dialogEventHandler.bind("treeNodeSelect", function(ev, args){ 23 | args.event.preventDefault(); 24 | args.event.stopPropagation(); 25 | $scope.submit(args.node.id); 26 | }); 27 | }); -------------------------------------------------------------------------------- /App_Plugins/People/propertyeditors/personpicker.html: -------------------------------------------------------------------------------- 1 |
2 | {{model.value}} 3 | Pick person 4 |
-------------------------------------------------------------------------------- /App_Plugins/People/propertyeditors/personpickerdialog.html: -------------------------------------------------------------------------------- 1 |
3 |
4 | 5 | 9 | 10 |
11 |
-------------------------------------------------------------------------------- /App_Plugins/People/umbraco/peopleTree/detox.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Its time to detox! {{currentNode.name}}

4 | 5 | Detox 6 |
-------------------------------------------------------------------------------- /App_Plugins/People/umbraco/peopleTree/dialogs.controller.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco") 2 | .controller("People.PersonDrinkController", 3 | function($scope, personResource, navigationService){ 4 | $scope.drink = function(id){ 5 | personResource.getDrunkById(id).then(function(){ 6 | navigationService.reloadNode($scope.currentNode.parent); 7 | navigationService.hideNavigation(); 8 | }); 9 | }; 10 | }); 11 | 12 | angular.module("umbraco") 13 | .controller("People.PersonDetoxController", 14 | function($scope, personResource, navigationService){ 15 | $scope.detox = function(id){ 16 | personResource.getSoberById(id).then(function(){ 17 | navigationService.reloadNode($scope.currentNode.parent); 18 | navigationService.hideNavigation(); 19 | }); 20 | }; 21 | }); -------------------------------------------------------------------------------- /App_Plugins/People/umbraco/peopleTree/drink.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Its time to drink! {{currentNode.name}}

4 | 5 | Drink 6 |
-------------------------------------------------------------------------------- /people.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE people ( 2 | id INTEGER NOT NULL IDENTITY(1, 1), 3 | name VARCHAR(255) NULL, 4 | addresse VARCHAR(255) NULL, 5 | email VARCHAR(255) NULL, 6 | bio VARCHAR(MAX) NULL, 7 | isdrunk bit NULL, 8 | PRIMARY KEY (id) 9 | ); 10 | GO 11 | 12 | INSERT INTO people(name,addresse,email,bio) VALUES('Seth Rios','Ap #594-2215 In St.','odio.tristique.pharetra@rutrumloremac.org','eget lacus. Mauris non dui nec urna suscipit nonummy. Fusce'); 13 | INSERT INTO people(name,addresse,email,bio) VALUES('Theodore Henderson','6412 Nulla Road','egestas.Duis.ac@Donecconsectetuermauris.co.uk','tempus eu, ligula. Aenean euismod mauris eu elit. Nulla facilisi.'); 14 | INSERT INTO people(name,addresse,email,bio) VALUES('Davis Steele','209-2157 Malesuada Road','convallis@nequevenenatis.ca','Proin sed turpis nec mauris blandit mattis. Cras eget nisi'); 15 | INSERT INTO people(name,addresse,email,bio) VALUES('Levi Underwood','748-8544 Et, Avenue','ultricies.adipiscing.enim@Quisque.ca','convallis convallis dolor. Quisque tincidunt pede ac urna. Ut tincidunt'); 16 | INSERT INTO people(name,addresse,email,bio) VALUES('Rina Frazier','Ap #915-5321 Aenean Rd.','quam.vel.sapien@Uttinciduntvehicula.org','ut ipsum ac mi eleifend egestas. Sed pharetra, felis eget'); 17 | INSERT INTO people(name,addresse,email,bio) VALUES('Anthony Santos','166-5529 Orci. Rd.','id.erat.Etiam@Uttinciduntorci.co.uk','Donec dignissim magna a tortor. Nunc commodo auctor velit. Aliquam'); 18 | INSERT INTO people(name,addresse,email,bio) VALUES('Jerome Chambers','P.O. Box 117, 3162 Facilisi. Avenue','lectus.Cum.sociis@consequatauctornunc.com','vitae erat vel pede blandit congue. In scelerisque scelerisque dui.'); 19 | INSERT INTO people(name,addresse,email,bio) VALUES('Aladdin Wynn','8310 Fermentum Rd.','enim@magnaa.org','Duis at lacus. Quisque purus sapien, gravida non, sollicitudin a,'); 20 | INSERT INTO people(name,addresse,email,bio) VALUES('Kyla Harrington','653-6365 Ac St.','ipsum.porta@antebibendum.co.uk','vulputate, posuere vulputate, lacus. Cras interdum. Nunc sollicitudin commodo ipsum.'); 21 | INSERT INTO people(name,addresse,email,bio) VALUES('Jaime Lawson','Ap #557-2351 Fermentum St.','egestas.Duis.ac@ligulaNullamenim.edu','at, egestas a, scelerisque sed, sapien. Nunc pulvinar arcu et'); 22 | INSERT INTO people(name,addresse,email,bio) VALUES('Savannah May','Ap #357-6000 Ipsum St.','ut.odio@vitaeodiosagittis.edu','pharetra nibh. Aliquam ornare, libero at auctor ullamcorper, nisl arcu'); 23 | INSERT INTO people(name,addresse,email,bio) VALUES('Wing Parsons','Ap #423-3378 Vulputate, Av.','tempor.arcu@lectus.net','Etiam ligula tortor, dictum eu, placerat eget, venenatis a, magna.'); 24 | INSERT INTO people(name,addresse,email,bio) VALUES('Clarke Lara','Ap #236-8881 Ipsum. Street','euismod@Donecporttitor.co.uk','dolor. Fusce feugiat. Lorem ipsum dolor sit amet, consectetuer adipiscing'); 25 | INSERT INTO people(name,addresse,email,bio) VALUES('Adrian Sanford','P.O. Box 170, 7929 Consequat St.','eget@loremauctor.com','netus et malesuada fames ac turpis egestas. Aliquam fringilla cursus'); 26 | INSERT INTO people(name,addresse,email,bio) VALUES('Vera Everett','P.O. Box 985, 2557 Venenatis Ave','ornare.lectus@Proinvelnisl.com','Vivamus sit amet risus. Donec egestas. Aliquam nec enim. Nunc'); 27 | INSERT INTO people(name,addresse,email,bio) VALUES('Sybill Myers','Ap #712-6509 Lorem, Av.','Sed.nec.metus@Pellentesquehabitantmorbi.ca','mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae diam. Proin'); 28 | INSERT INTO people(name,addresse,email,bio) VALUES('Orla Yates','670 Feugiat Avenue','venenatis@Duisacarcu.ca','eget metus eu erat semper rutrum. Fusce dolor quam, elementum'); 29 | INSERT INTO people(name,addresse,email,bio) VALUES('Matthew Tyler','P.O. Box 945, 681 Neque St.','sit.amet.nulla@Nullatinciduntneque.com','dictum ultricies ligula. Nullam enim. Sed nulla ante, iaculis nec,'); 30 | INSERT INTO people(name,addresse,email,bio) VALUES('Cassandra Beasley','Ap #143-7512 Libero St.','a.aliquet@auctorodioa.com','Nunc ac sem ut dolor dapibus gravida. Aliquam tincidunt, nunc'); 31 | INSERT INTO people(name,addresse,email,bio) VALUES('Azalia Anderson','P.O. Box 870, 6128 Risus. Ave','risus.Nulla.eget@feugiattelluslorem.edu','auctor odio a purus. Duis elementum, dui quis accumsan convallis,'); 32 | INSERT INTO people(name,addresse,email,bio) VALUES('Irene Wong','Ap #126-7844 Blandit. Ave','pulvinar.arcu.et@nullamagna.net','consectetuer adipiscing elit. Curabitur sed tortor. Integer aliquam adipiscing lacus.'); 33 | INSERT INTO people(name,addresse,email,bio) VALUES('Allegra Kelly','590-2871 Dui Street','sem.consequat@sodales.co.uk','suscipit nonummy. Fusce fermentum fermentum arcu. Vestibulum ante ipsum primis'); 34 | INSERT INTO people(name,addresse,email,bio) VALUES('Kai Maddox','P.O. Box 543, 5887 Aliquam Rd.','non.dui.nec@sem.edu','risus. Nunc ac sem ut dolor dapibus gravida. Aliquam tincidunt,'); 35 | INSERT INTO people(name,addresse,email,bio) VALUES('Wayne Harvey','836-2454 Amet, Ave','Aliquam.ultrices.iaculis@vitaesemper.org','sapien imperdiet ornare. In faucibus. Morbi vehicula. Pellentesque tincidunt tempus'); 36 | INSERT INTO people(name,addresse,email,bio) VALUES('Martha Osborn','2612 Sed Rd.','Aliquam@acturpisegestas.org','diam vel arcu. Curabitur ut odio vel est tempor bibendum.'); 37 | INSERT INTO people(name,addresse,email,bio) VALUES('Vladimir Oconnor','Ap #521-7996 Curabitur Av.','dictum@sitamet.edu','tortor, dictum eu, placerat eget, venenatis a, magna. Lorem ipsum'); 38 | INSERT INTO people(name,addresse,email,bio) VALUES('Gail Case','Ap #735-3929 Orci, Ave','eu@dolorDonecfringilla.net','vulputate, posuere vulputate, lacus. Cras interdum. Nunc sollicitudin commodo ipsum.'); 39 | INSERT INTO people(name,addresse,email,bio) VALUES('Basia Mann','9546 Et Rd.','justo@nequeetnunc.edu','quis lectus. Nullam suscipit, est ac facilisis facilisis, magna tellus'); 40 | INSERT INTO people(name,addresse,email,bio) VALUES('Zenaida Ellison','930-8080 Nec, Rd.','euismod.urna@aliquamadipiscing.edu','mi, ac mattis velit justo nec ante. Maecenas mi felis,'); 41 | INSERT INTO people(name,addresse,email,bio) VALUES('Colorado Lambert','P.O. Box 783, 4358 Pellentesque Road','aliquet.Phasellus.fermentum@tortordictumeu.net','mauris eu elit. Nulla facilisi. Sed neque. Sed eget lacus.'); 42 | INSERT INTO people(name,addresse,email,bio) VALUES('Flavia Leach','P.O. Box 205, 6080 Sit Road','cursus@infelisNulla.org','eleifend, nunc risus varius orci, in consequat enim diam vel'); 43 | INSERT INTO people(name,addresse,email,bio) VALUES('Kibo Walsh','6624 Bibendum. Rd.','Nulla@velitduisemper.org','lectus quis massa. Mauris vestibulum, neque sed dictum eleifend, nunc'); 44 | INSERT INTO people(name,addresse,email,bio) VALUES('Brent Daniels','6260 Massa. Avenue','lorem@malesuadaIntegerid.ca','blandit. Nam nulla magna, malesuada vel, convallis in, cursus et,'); 45 | INSERT INTO people(name,addresse,email,bio) VALUES('Carol Spencer','P.O. Box 859, 5447 Tellus St.','ipsum.dolor@euelitNulla.ca','lacinia at, iaculis quis, pede. Praesent eu dui. Cum sociis'); 46 | INSERT INTO people(name,addresse,email,bio) VALUES('Gail Glover','779 Pede. Ave','purus.sapien.gravida@nisinibh.co.uk','nec enim. Nunc ut erat. Sed nunc est, mollis non,'); 47 | INSERT INTO people(name,addresse,email,bio) VALUES('Urielle Holman','P.O. Box 741, 6519 Et Rd.','sem.molestie.sodales@eueuismodac.edu','nisl arcu iaculis enim, sit amet ornare lectus justo eu'); 48 | INSERT INTO people(name,addresse,email,bio) VALUES('Kyla Romero','926-1181 Donec Ave','augue.malesuada.malesuada@consectetuercursuset.ca','Praesent interdum ligula eu enim. Etiam imperdiet dictum magna. Ut'); 49 | INSERT INTO people(name,addresse,email,bio) VALUES('Lionel Brooks','P.O. Box 296, 115 Arcu Rd.','nibh@tristique.org','mattis velit justo nec ante. Maecenas mi felis, adipiscing fringilla,'); 50 | INSERT INTO people(name,addresse,email,bio) VALUES('Venus Brooks','504-7347 Libero Avenue','suscipit.nonummy.Fusce@orci.com','hendrerit a, arcu. Sed et libero. Proin mi. Aliquam gravida'); 51 | INSERT INTO people(name,addresse,email,bio) VALUES('Cameron Burnett','Ap #242-8884 Cras Av.','arcu@nonummy.net','ipsum leo elementum sem, vitae aliquam eros turpis non enim.'); 52 | INSERT INTO people(name,addresse,email,bio) VALUES('Urielle Reyes','Ap #865-3870 Ac Street','tellus.sem@risusNullaeget.ca','auctor odio a purus. Duis elementum, dui quis accumsan convallis,'); 53 | INSERT INTO people(name,addresse,email,bio) VALUES('Delilah Park','Ap #286-7096 Mauris, Rd.','consectetuer@egestasligula.co.uk','pellentesque a, facilisis non, bibendum sed, est. Nunc laoreet lectus'); 54 | INSERT INTO people(name,addresse,email,bio) VALUES('Blaine Wiley','P.O. Box 612, 5970 Penatibus Av.','Pellentesque@lectus.com','ultrices. Duis volutpat nunc sit amet metus. Aliquam erat volutpat.'); 55 | INSERT INTO people(name,addresse,email,bio) VALUES('Mohammad Aguirre','246-9040 Ipsum St.','consequat.auctor@Vestibulumante.org','mollis dui, in sodales elit erat vitae risus. Duis a'); 56 | INSERT INTO people(name,addresse,email,bio) VALUES('Nola Stevens','356-5645 Dictum Rd.','ullamcorper.magna.Sed@enimgravidasit.net','Nunc quis arcu vel quam dignissim pharetra. Nam ac nulla.'); 57 | INSERT INTO people(name,addresse,email,bio) VALUES('Gisela Young','2893 In Rd.','dictum.eu@liberomauris.co.uk','Quisque varius. Nam porttitor scelerisque neque. Nullam nisl. Maecenas malesuada'); 58 | INSERT INTO people(name,addresse,email,bio) VALUES('Lane Orr','P.O. Box 780, 206 Elit, Street','adipiscing@egetvolutpat.com','gravida. Praesent eu nulla at sem molestie sodales. Mauris blandit'); 59 | INSERT INTO people(name,addresse,email,bio) VALUES('Demetrius Gibbs','P.O. Box 601, 1340 Augue, Ave','Duis@nuncQuisqueornare.org','sit amet ornare lectus justo eu arcu. Morbi sit amet'); 60 | INSERT INTO people(name,addresse,email,bio) VALUES('Nasim Velazquez','930-3281 Lorem Rd.','dui@tinciduntpede.com','tellus. Aenean egestas hendrerit neque. In ornare sagittis felis. Donec'); 61 | INSERT INTO people(name,addresse,email,bio) VALUES('Wynter Sexton','690 Eu St.','eu.metus@MaurismagnaDuis.org','non, lobortis quis, pede. Suspendisse dui. Fusce diam nunc, ullamcorper'); 62 | INSERT INTO people(name,addresse,email,bio) VALUES('Lucas Lynch','9592 Blandit Rd.','sem@morbi.com','cubilia Curae; Phasellus ornare. Fusce mollis. Duis sit amet diam'); 63 | INSERT INTO people(name,addresse,email,bio) VALUES('Caryn Kline','Ap #715-1293 Porttitor Rd.','blandit.at@montesnasceturridiculus.ca','nec, leo. Morbi neque tellus, imperdiet non, vestibulum nec, euismod'); 64 | INSERT INTO people(name,addresse,email,bio) VALUES('Ciara Gill','Ap #787-3796 Purus Ave','Nunc@velsapienimperdiet.org','Cras pellentesque. Sed dictum. Proin eget odio. Aliquam vulputate ullamcorper'); 65 | INSERT INTO people(name,addresse,email,bio) VALUES('Chava Owen','1338 Vel, Road','Maecenas.ornare.egestas@lectusconvallisest.edu','Suspendisse commodo tincidunt nibh. Phasellus nulla. Integer vulputate, risus a'); 66 | INSERT INTO people(name,addresse,email,bio) VALUES('Wynne Mccall','P.O. Box 806, 8463 Quisque Rd.','orci.quis@enimMauris.org','Morbi neque tellus, imperdiet non, vestibulum nec, euismod in, dolor.'); 67 | INSERT INTO people(name,addresse,email,bio) VALUES('Inez Rodriquez','P.O. Box 991, 8956 Integer Ave','nonummy.ac.feugiat@elit.edu','nec, mollis vitae, posuere at, velit. Cras lorem lorem, luctus'); 68 | INSERT INTO people(name,addresse,email,bio) VALUES('Cedric Shaffer','Ap #703-8212 Semper Street','condimentum.eget@euarcuMorbi.edu','ridiculus mus. Proin vel arcu eu odio tristique pharetra. Quisque'); 69 | INSERT INTO people(name,addresse,email,bio) VALUES('Tasha Riddle','9230 Sagittis Street','consectetuer@elitNulla.ca','magnis dis parturient montes, nascetur ridiculus mus. Proin vel nisl.'); 70 | INSERT INTO people(name,addresse,email,bio) VALUES('Austin Mathews','Ap #175-582 Lacus Av.','sem.mollis@sem.org','non, egestas a, dui. Cras pellentesque. Sed dictum. Proin eget'); 71 | INSERT INTO people(name,addresse,email,bio) VALUES('Neve Robbins','3532 Lacus. St.','ac.orci.Ut@turpisnonenim.org','tempus mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae diam.'); 72 | INSERT INTO people(name,addresse,email,bio) VALUES('Christen Bradford','Ap #915-4946 Velit. Road','egestas@dictummi.net','eget massa. Suspendisse eleifend. Cras sed leo. Cras vehicula aliquet'); 73 | INSERT INTO people(name,addresse,email,bio) VALUES('Hilary Merrill','P.O. Box 827, 2973 Lobortis, Rd.','mi.eleifend.egestas@mi.com','in felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris'); 74 | INSERT INTO people(name,addresse,email,bio) VALUES('Kadeem Adkins','5457 Lacinia Avenue','Suspendisse@aliquetodioEtiam.edu','Curabitur ut odio vel est tempor bibendum. Donec felis orci,'); 75 | INSERT INTO people(name,addresse,email,bio) VALUES('April Roth','Ap #294-3962 Imperdiet, Avenue','at@magnisdisparturient.net','Mauris ut quam vel sapien imperdiet ornare. In faucibus. Morbi'); 76 | INSERT INTO people(name,addresse,email,bio) VALUES('Chava Lucas','Ap #776-4993 Ipsum Avenue','non.arcu.Vivamus@Suspendissealiquet.ca','penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin'); 77 | INSERT INTO people(name,addresse,email,bio) VALUES('Maia Mccullough','P.O. Box 420, 4835 Sit Ave','semper.et.lacinia@Nunc.net','ultricies dignissim lacus. Aliquam rutrum lorem ac risus. Morbi metus.'); 78 | INSERT INTO people(name,addresse,email,bio) VALUES('Wyoming Payne','8700 Magnis Ave','non@nuncullamcorpereu.com','dignissim lacus. Aliquam rutrum lorem ac risus. Morbi metus. Vivamus'); 79 | INSERT INTO people(name,addresse,email,bio) VALUES('Mira Harrell','P.O. Box 399, 7893 A St.','vel.venenatis@natoquepenatibus.co.uk','commodo ipsum. Suspendisse non leo. Vivamus nibh dolor, nonummy ac,'); 80 | INSERT INTO people(name,addresse,email,bio) VALUES('Jermaine Garrett','P.O. Box 460, 4963 Scelerisque Rd.','mollis.Integer.tincidunt@sagittis.co.uk','libero. Integer in magna. Phasellus dolor elit, pellentesque a, facilisis'); 81 | INSERT INTO people(name,addresse,email,bio) VALUES('Emmanuel Rutledge','P.O. Box 143, 9858 Integer Rd.','nonummy.ut.molestie@sit.co.uk','elit pede, malesuada vel, venenatis vel, faucibus id, libero. Donec'); 82 | INSERT INTO people(name,addresse,email,bio) VALUES('Vanna Hurst','776-2490 Morbi Avenue','risus.Donec@blandit.net','Integer tincidunt aliquam arcu. Aliquam ultrices iaculis odio. Nam interdum'); 83 | INSERT INTO people(name,addresse,email,bio) VALUES('Violet Watts','223-6972 Ut Av.','posuere.cubilia.Curae@liberoettristique.net','pede. Cras vulputate velit eu sem. Pellentesque ut ipsum ac'); 84 | INSERT INTO people(name,addresse,email,bio) VALUES('Zeus Poole','145-4576 Vitae Avenue','hendrerit.a@velitQuisquevarius.com','Donec sollicitudin adipiscing ligula. Aenean gravida nunc sed pede. Cum'); 85 | INSERT INTO people(name,addresse,email,bio) VALUES('Melissa Knowles','Ap #208-3886 Elit, Road','lacus.Ut@magnaetipsum.net','Donec tempor, est ac mattis semper, dui lectus rutrum urna,'); 86 | INSERT INTO people(name,addresse,email,bio) VALUES('Elton Mack','349-7453 Mauris. St.','inceptos.hymenaeos@justo.net','Donec tincidunt. Donec vitae erat vel pede blandit congue. In'); 87 | INSERT INTO people(name,addresse,email,bio) VALUES('Kaitlin Mccarthy','7875 Donec Ave','aliquam@mauris.com','Nullam suscipit, est ac facilisis facilisis, magna tellus faucibus leo,'); 88 | INSERT INTO people(name,addresse,email,bio) VALUES('Dane Crawford','8448 Lorem Av.','Fusce@ut.co.uk','lacus. Nulla tincidunt, neque vitae semper egestas, urna justo faucibus'); 89 | INSERT INTO people(name,addresse,email,bio) VALUES('Shaine Gilbert','3947 Sit Avenue','fringilla.est.Mauris@elitelitfermentum.edu','in, cursus et, eros. Proin ultrices. Duis volutpat nunc sit'); 90 | INSERT INTO people(name,addresse,email,bio) VALUES('Lev Garza','P.O. Box 237, 4179 Suspendisse Av.','aliquet.diam@idantedictum.com','leo, in lobortis tellus justo sit amet nulla. Donec non'); 91 | INSERT INTO people(name,addresse,email,bio) VALUES('Dominique Ramirez','Ap #219-2276 Posuere Road','mattis.Integer.eu@at.com','fames ac turpis egestas. Aliquam fringilla cursus purus. Nullam scelerisque'); 92 | INSERT INTO people(name,addresse,email,bio) VALUES('Clare Cervantes','P.O. Box 332, 6444 Lorem Street','turpis.egestas.Fusce@semperNamtempor.org','at sem molestie sodales. Mauris blandit enim consequat purus. Maecenas'); 93 | INSERT INTO people(name,addresse,email,bio) VALUES('Joseph Donaldson','6152 Nullam Ave','mauris.sapien@egestasadui.net','In mi pede, nonummy ut, molestie in, tempus eu, ligula.'); 94 | INSERT INTO people(name,addresse,email,bio) VALUES('Allen Lane','Ap #306-581 Vivamus Av.','et.euismod.et@accumsanlaoreet.edu','laoreet posuere, enim nisl elementum purus, accumsan interdum libero dui'); 95 | INSERT INTO people(name,addresse,email,bio) VALUES('Stuart Daniels','Ap #952-5096 Sit St.','molestie.pharetra.nibh@lacinia.co.uk','in sodales elit erat vitae risus. Duis a mi fringilla'); 96 | INSERT INTO people(name,addresse,email,bio) VALUES('Harper Sullivan','P.O. Box 948, 6206 Ipsum St.','libero.et@pellentesque.co.uk','ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor.'); 97 | INSERT INTO people(name,addresse,email,bio) VALUES('Leila Conrad','P.O. Box 971, 9597 Orci. Ave','imperdiet.nec.leo@mattisornare.org','Donec non justo. Proin non massa non ante bibendum ullamcorper.'); 98 | INSERT INTO people(name,addresse,email,bio) VALUES('Cole Reilly','Ap #815-9969 Cras St.','et.commodo@faucibus.ca','Praesent luctus. Curabitur egestas nunc sed libero. Proin sed turpis'); 99 | INSERT INTO people(name,addresse,email,bio) VALUES('Chiquita Shaw','P.O. Box 844, 2351 Nisl St.','magna@Aeneaneget.ca','malesuada augue ut lacus. Nulla tincidunt, neque vitae semper egestas,'); 100 | INSERT INTO people(name,addresse,email,bio) VALUES('Armand Coleman','5426 Sociis Rd.','Aenean@convallisin.edu','natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.'); 101 | INSERT INTO people(name,addresse,email,bio) VALUES('Francesca Tillman','353-9307 Tincidunt. Ave','mus@risusDonecegestas.org','Phasellus in felis. Nulla tempor augue ac ipsum. Phasellus vitae'); 102 | INSERT INTO people(name,addresse,email,bio) VALUES('Henry Valentine','110-5580 Non Rd.','pharetra.Quisque@Nunc.co.uk','lectus, a sollicitudin orci sem eget massa. Suspendisse eleifend. Cras'); 103 | INSERT INTO people(name,addresse,email,bio) VALUES('Mara Le','P.O. Box 641, 5472 Faucibus. Rd.','pharetra.Quisque.ac@CurabiturdictumPhasellus.com','Aliquam adipiscing lobortis risus. In mi pede, nonummy ut, molestie'); 104 | INSERT INTO people(name,addresse,email,bio) VALUES('Noelani Dean','891-9779 Lobortis St.','quis@egestasa.co.uk','Nunc pulvinar arcu et pede. Nunc sed orci lobortis augue'); 105 | INSERT INTO people(name,addresse,email,bio) VALUES('Hammett Atkinson','196-7810 Nec Street','sed.consequat.auctor@nectellusNunc.com','egestas. Aliquam fringilla cursus purus. Nullam scelerisque neque sed sem'); 106 | INSERT INTO people(name,addresse,email,bio) VALUES('Mark Donaldson','782-1474 Et Avenue','ut.ipsum.ac@elitelit.net','in, hendrerit consectetuer, cursus et, magna. Praesent interdum ligula eu'); 107 | INSERT INTO people(name,addresse,email,bio) VALUES('Cedric Cunningham','107-1268 Faucibus St.','aptent.taciti.sociosqu@utaliquam.edu','pellentesque eget, dictum placerat, augue. Sed molestie. Sed id risus'); 108 | INSERT INTO people(name,addresse,email,bio) VALUES('Leilani Wyatt','2079 Malesuada Av.','accumsan@Donec.ca','Cras lorem lorem, luctus ut, pellentesque eget, dictum placerat, augue.'); 109 | INSERT INTO people(name,addresse,email,bio) VALUES('Julian Jennings','454-4890 Ultricies Street','Etiam.vestibulum@sedconsequat.edu','lobortis ultrices. Vivamus rhoncus. Donec est. Nunc ullamcorper, velit in'); 110 | INSERT INTO people(name,addresse,email,bio) VALUES('Jerry Fleming','548-9040 Velit. Street','eu@euodioPhasellus.com','sit amet luctus vulputate, nisi sem semper erat, in consectetuer'); 111 | INSERT INTO people(name,addresse,email,bio) VALUES('Ashton Griffith','Ap #980-2084 Amet Ave','Mauris.molestie@nuncIn.net','fermentum vel, mauris. Integer sem elit, pharetra ut, pharetra sed,'); 112 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | #Umbraco 7 samples 2 | 3 | **Code from my UK Umbraco festival 2013, to install, simply copy the app_code and app_plugins folder to the root of your site, run the people.sql against the current database, and finally restart your website.** 4 | 5 | ##What is this? 6 | 7 | The included files was used during my session to show how you build a tree, intergrate it with a context menu, wire it up to dialogs, and editor, and how we make those views fetch and submit data to the server. Finally we reuse a lot of our logic, building a custom picker property editor to assign custom data to a document. 8 | 9 | Read the attached slides.md for each step with some additional comments 10 | 11 | 12 | ##Folder structure 13 | 14 | ###App_code 15 | Contains all serverside classes to construct the tree and the rest-endpoint in the shape of a treecontroller and an apicontroller. 16 | 17 | **person.cs** describes the data we are passing around, mapping it to the people DB table. This is done with the embedded petapoco orm in umbraco. 18 | 19 | **PeopleTreeController.cs** exposes methods for the tree, and does the configuration to register it in umbracos /config/tree.config file. It contains 2 methods, 2 for returning nodes for the tree, and on for returning menu actions when requested. 20 | 21 | **PersonApiController.cs** exposes the different methods the person.resource.cs uses in editors and dialogs to retrieve and modify person data. Its a UmbracoAuthorizedJsonController which only works for authorized umbraco users, and will only return json. 22 | 23 | ##App_plugins 24 | Containing all the client-side code, dependencies and the package.manifest file, which registers needed dependencies on app_start, as well as included property editors. 25 | 26 | **/app_plugins/backoffice/peopletreee/** contains all editors for the tree "peopletree". 27 | 28 | **/app_plugins/umbraco/peopletreee/** contains all the dialogs for the tree "peopletree". notice: this is bound to change as this is a bug. Both editors and dialogs will be in the /backoffice folder. 29 | 30 | **/app_plugins/propertyeditors/** contains all property-editors registered by the package.manifest -in this case a personpicker. 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /slides.md: -------------------------------------------------------------------------------- 1 | #Building in belle 2 | 3 | 4 | ##Todo 5 | We have so much stuff to build: 6 | 7 | - Data and services 8 | - A tree 9 | - A context menu 10 | - An Editor 11 | - Menu + actions 12 | - Action dialogs 13 | - Property Editor 14 | - Property Editor Dialog 15 | 16 | 17 | 18 | ##Data and services 19 | I've already done a bit of stuff 20 | 21 | - Database with a collection of people 22 | - A person class 23 | - A basic APIController with methods for common actions 24 | 25 | 26 | ##Person Class 27 | The data we will pass around 28 | 29 | [TableName("people")] 30 | [DataContract(Name="person", Namespace = "")] 31 | public class Person 32 | { 33 | [DataMember(Name="id")] 34 | public int Id { get; set; } 35 | 36 | [DataMember(Name = "name")] 37 | public string Name { get; set; } 38 | 39 | [DataMember(Name = "addresse")] 40 | public string Addresse { get; set; } 41 | 42 | [DataMember(Name = "email")] 43 | public string Email { get; set; } 44 | 45 | [DataMember(Name = "bio")] 46 | public string Bio { get; set; } 47 | 48 | [DataMember(Name = "isDrunk")] 49 | public bool IsDrunk { get; set; } 50 | } 51 | 52 | 53 | 54 | ##PersonApiController 55 | Our services endpoint for our JS to access serverside data. We use a standard attribute to expose: 56 | 57 | [PluginController("People")] 58 | public class PersonApiController : UmbracoAuthorizedJsonController 59 | { 60 | ...methods 61 | } 62 | 63 | Accesible via url: 64 | 65 | /umbraco/People/PersonApi/GetById/1 66 | 67 | 68 | ##Methods in the PersonApiController 69 | 70 | public IEnumerable GetAll() 71 | { 72 | var db = UmbracoContext.Application.DatabaseContext.Database; 73 | var query = new Sql().Select("*").From("people"); 74 | 75 | return db.Fetch(query); 76 | } 77 | 78 | 79 | 80 | ##Methods in the PersonApiControl 2 81 | 82 | public Person PostSave(Person person) { 83 | if (person.Id > 0) 84 | DatabaseContext.Database.Update(person); 85 | else 86 | DatabaseContext.Database.Save(person); 87 | 88 | return person; 89 | } 90 | 91 | 92 | #So what now? 93 | 94 | 95 | ##Step 1. the tree 96 | 97 | - We will create a tree to display person list 98 | - Talk about conventions 99 | - default urls and their locations 100 | 101 | 102 | ##Step 2. the context menu 103 | 104 | - Make the tree return context menu items 105 | - prettify with icons 106 | - More conventions talk 107 | 108 | 109 | ##Step 3. the editor 110 | 111 | - Create a html view in the right location 112 | - Create editing controls to modify values 113 | 114 | 115 | ##Step 4, the action dialogs 116 | 117 | - Menu points to drink/detox views 118 | - We need to add these views 119 | 120 | 121 | 122 | ##Step 5. the js resource 123 | 124 | - create person.resource.js 125 | - include in package.manifest 126 | - map serverside methods to js methods 127 | - makes use of $http 128 | 129 | 130 | 131 | ##Mapping url to a promise 132 | Promises are a core part of Angular. So you say, "Do this" and when you are eventually done or fail, I'll deal with it. 133 | 134 | getById: function(id){ 135 | return $http.get("People/PersonApi/GetById?id="+id); 136 | }, 137 | 138 | **So you can do:** 139 | 140 | personResource.getById(123).then(function(response){ 141 | $scope.person = response.data; 142 | },function(err){ 143 | alert("fail: " + err); 144 | }); 145 | 146 | 147 | ##Step 6, tying it all together in the controllers 148 | 149 | - Add editor controller 150 | - Add dialog controllers 151 | - Intergrate with the personResource service 152 | 153 | 154 | ##Step 7, Add people picker 155 | 156 | - Add people picker property editor 157 | - Add people tree dialog 158 | - use Umb-Tree directive 159 | 160 | 161 | ##Step 8, sharing is caring 162 | 163 | - You can download the entire project here: 164 | - https://github.com/perploug/UkFest-AngularJS-Demo --------------------------------------------------------------------------------