var Task = function (options) { var _options = options || {}; var _description = _options.description || ""; var _assignedTo = _options.assignedTo || ""; var _duration = _options.duration || 0.0; var _tasks = []; return { description: _description, assignedTo: _assignedTo, duration: _duration, tasks: _tasks }; }; var Controller = function () { var _tasks = []; var initTasks = function () { // 4 "Level 1 _tasks.push(new Task({ description: "Discuss Product Concept", assignedTo: "Jackie Chan; Frodo; Sauroman", duration: 4 })); _tasks.push(new Task({ description: "Create Mockups", assignedTo: "Frodo; Gimili;", duration: 8 })); _tasks.push(new Task({ description: "Setup POC environment", assignedTo: "Frodo; Gandalf", duration: 12 })); _tasks.push(new Task({ description: "POC Development", assignedTo: "Gandalf; Ilsildor; Aragorn", duration: 46 })); // Level 2 _tasks[1].tasks.push(new Task({ description: "Paper walk through", assignedTo: "Gimili;", duration: 6 })); _tasks[1].tasks.push(new Task({ description: "Convert to HTML", assignedTo: "Gimili;", duration: 2 })); _tasks[2].tasks.push(new Task({ description: "Determine SQL or NoSQL database", assignedTo: "Gandalf; Frodo", duration: 2 })); _tasks[2].tasks.push(new Task({ description: "Setup Heroku", assignedTo: "Gandalf; Frodo", duration: 5 })); _tasks[2].tasks.push(new Task({ description: "Setup Nodejs", assignedTo: "Gandalf; Frodo", duration: 5 })); _tasks[3].tasks.push(new Task({ description: "Create Backlog", assignedTo: "Ilsildor;", duration: 10 })); _tasks[3].tasks.push(new Task({ description: "TDD Sprint", assignedTo: "Aragorn;", duration: 10 })); _tasks[3].tasks.push(new Task({ description: "QA Review", assignedTo: "Gandalf;", duration: 10 })); // Level 3 for 'Create Backlog' _tasks[3].tasks[0].tasks.push(new Task({ description: "Confirm users stories", assignedTo: "Isildor; Jackie Chan", duration: 2})); _tasks[3].tasks[0].tasks.push(new Task({ description: "Check Team schedule", assignedTo: "Isildor; ", duration: 3})); // Level 3 for 'TDD Sprint' _tasks[3].tasks[1].tasks.push(new Task({ description: "Confirm users stories", assignedTo: "Isildor; Jackie Chan", duration: 2})); _tasks[3].tasks[0].tasks.push(new Task({ description: "Check Team schedule", assignedTo: "Isildor; ", duration: 3})); }; return { tasks: _tasks, initTasks: initTasks }; }; $(document).ready(function () { var controller = new Controller(); controller.initTasks(); var projectSource = $("#projectDisplay").html(); Handlebars.registerPartial( "taskDisplay", $( "#taskDisplay" ).html() ); var template = Handlebars.compile(projectSource); var resultHTML = template({tasks: controller.tasks}); $("#projectPlan").html(resultHTML); });
<h3>Project Plan</h3> <div id="projectPlan"></div> <script id="projectDisplay" type="text/x-handlebars-template"> <ul class="project-list"> {{> taskDisplay}} </ul> </script> <script id="taskDisplay" type="text/x-handlebars-template"> {{#each tasks}} <li class="list-item"> <span class="task-name">{{description}}</span> | Team: {{assignedTo}} | Duration: {{duration}} (hrs) {{#if tasks}} <ul class="project-list"> {{> taskDisplay}} </ul> {{/if}} </li> {{/each}} </script>
li.list-item{ margin-top: 4px; } span.task-name{ font-weight: bold; font-style: italic; } ul.project-list{ list-style-type: none; margin-bottom: 8px; margin-left: 12px; margin-top: 8px; text-decoration: none; }