JavaScript Scrum App to manage tasks with ease.

JavaScript Scrum App to manage tasks with ease.
Photo by Jo Szczepanska / Unsplash

scrum-board

JavaScript Scrum App to manage tasks with ease.

Warning : It uses localstorage to store your tasks, make sure you don't clean up your Local Storage for this app atleast.


Instructions (How to use Scrum Board)

  • Create a new task by clicking on the Plus(Blue) icon on the footer
  • Update a task by double clicking on Description text, Link text or Assigned to text, card will show (Edit Mode Enabled) text.
  • All updated text will be saved automatically without you doing anything except for typing out your edits on the card. (Can't edit titles as of now, will be released in next version.)
  • Drag your task card to the bin(red) on the footer to delete your task (Note that this cannot be reverted)
  • Move your task card around to update the status of your task, say from Development to Testing and so on.
  • Update a column name by double clicking on Title text.

ScrumBoard

Flow

flows.json

[{"id":"8d4496baf525b65b","type":"tab","label":"Scrum Board - Manage your tasks with ease","disabled":false,"info":"","env":[]},{"id":"7129cc0af3217659","type":"group","z":"8d4496baf525b65b","g":"8b8f5d1b40ce0e12","name":"statics","style":{"fill":"#0070c0","label":true},"nodes":["574ba10e8f5c0ad7","1a870ef46794b6ac"],"x":68,"y":213,"w":1104,"h":714},{"id":"b6cf337a0acf3995","type":"group","z":"8d4496baf525b65b","g":"420299cedb78c474","name":"Scum Board","style":{"fill":"#ffff7f","fill-opacity":"1","label":true},"nodes":["6ecd7a78f59f153e","327e610e5537b880","5b2097bbf46d0a9a","0d6b4987126b8725","2fe04db7532878ac"],"x":94,"y":79,"w":1072,"h":82},{"id":"420299cedb78c474","type":"group","z":"8d4496baf525b65b","g":"8b8f5d1b40ce0e12","name":"Home","style":{"label":true},"nodes":["b6cf337a0acf3995"],"x":68,"y":53,"w":1124,"h":134},{"id":"8b8f5d1b40ce0e12","type":"group","z":"8d4496baf525b65b","name":"APP","style":{"fill":"#0070c0","label":true},"nodes":["7129cc0af3217659","420299cedb78c474"],"x":42,"y":27,"w":1176,"h":926},{"id":"574ba10e8f5c0ad7","type":"group","z":"8d4496baf525b65b","g":"7129cc0af3217659","name":"Image","style":{"label":true},"nodes":["25545394efdfb768","e491cf3e4fafae1c","ad655fe0ac0c577b","60004390397bc2f3","a2787c863221a9c5","6bc809cf9b7de498","1f6eb7989c4e3c0d","5c129d612ea265d6","8a8c9939aff58092","cedfc812c400828b","e902db8e2d92ac98","b8d33823ad6c8ee9","d71cc7317092ce54","7c5570146ad7b660","381707afccfa84dc","2490479ac6adb357","5772cfb3c294ac4f","2830485b5143a37a","13a81f4a12e59c8d","72e3013e320f2a56"],"x":94,"y":439,"w":1052,"h":462},{"id":"1a870ef46794b6ac","type":"group","z":"8d4496baf525b65b","g":"7129cc0af3217659","name":"javascript","style":{"label":true},"nodes":["2c6b88e3aac2d2d3","6872eea233b093ea","c482ae97d1472ed0","48b60e9fa0ee5330","c9f8df22900b55f8","4567b5ee4e287834","c5c80e2238aa96e9"],"x":94,"y":239,"w":1052,"h":162},{"id":"6ecd7a78f59f153e","type":"template","z":"8d4496baf525b65b","g":"b6cf337a0acf3995","name":"HTML","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Scrum Board - Manage your tasks with ease</title>\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css\">\n   <style>{{{payload.style}}}</style>\n</head>\n\n<body>\n    <div class=\"wrapper\">\n        <header class=\"clear\">\n            <ul>\n            </ul>\n        </header>\n        <section id=\"dashboard\" class=\"dashboard clear\">\n        </section>\n\n      <footer>\n        <ul>\n          <li class=\"branding\">Scrum <span>Board</span> <sup>Beta</sup></li>\n        </ul>\n        \n        <ul class=\"controls\">\n          <li data-tooltip=\"Drag A Task Here To Delete\">\n            <a href=\"#\" class=\"remove\" id=\"remove\">\n              <img src=\"app/assets/images/bin.svg\" alt=\"\">\n            </a>\n          </li>\n          <li data-tooltip=\"Add Task\">\n            <a href=\"#\" id=\"add-task\" class=\"add-task\">\n              <img src=\"app/assets/images/plus.svg\" alt=\"\">\n            </a>\n          </li>\n          <li data-tooltip=\"Github\" class=\"github-ref\">\n            <a href=\"https://github.com/i-break-codes/scrum-board\" target=\"_blank\">\n              <img src=\"app/assets/images/github.svg\" alt=\"\">\n            </a>\n          </li>\n        </ul>\n      </footer>\n    </div>\n\n    <div id=\"removed-task-notification\" class=\"removed-task-notification hide\"></div>\n\n    <div class=\"modal hide\" id=\"change-status-modal\">\n        <div class=\"modal-wrapper\">\n            <form action=\"index.html\" method=\"post\" class=\"change-status-form\" name=\"change_status\">\n                <span class=\"close-modal\">X</span>\n\n                <h3>Change column name</h3>\n\n                <ul>\n                    <li>\n                        <input type=\"text\" id=\"new_status\" placeholder=\"Column name\" autofocus>\n                    </li>\n                    <li>\n                        <input type=\"submit\" name=\"change_status\" value=\"Change column name\">\n                    </li>\n                </ul>\n            </form>\n        </div>\n    </div>\n\n    <div class=\"modal hide\" id=\"add-task-modal\">\n        <div class=\"modal-wrapper\">\n            <form action=\"index.html\" method=\"post\" class=\"add-task-form\" name=\"add_task\">\n                <span class=\"close-modal\">X</span>\n\n                <h3>Add a new Task</h3>\n\n                <ul>\n                    <li>\n                        <input type=\"text\" name=\"title\" placeholder=\"Title\" autofocus>\n                    </li>\n                    <li>\n                        <textarea name=\"description\" placeholder=\"Description\"></textarea>\n                    </li>\n                    <li>\n                        <input type=\"text\" name=\"remote_url\" placeholder=\"Remote Task URL\">\n                    </li>\n                    <li>\n                        <input type=\"text\" name=\"assigned_to\" placeholder=\"Assigned To\">\n                    </li>\n                    <li>\n                        <input type=\"submit\" name=\"create_task\" value=\"Create Task\">\n                    </li>\n                </ul>\n            </form>\n        </div>\n\n        <div class=\"create-task-branding\">\n            Scrum <span>Board</span> <sup>Beta</sup>\n        </div>\n    </div>\n\n    <div class=\"hide\" id=\"tips\">\n        Double click on the task text to edit it <br> <span>(Task titles are <b>editable</b> for now)</span>\n    </div>\n\n<script id=\"task-card-template\" type=\"text/x-handlebars-template\">\n{{{payload.script}}}\n</script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js\"></script>\n    <script src=\"/app/assets/scripts/helper.js\"></script>\n    <script src=\"/app/assets/scripts/localstorage.js\"></script>\n    <script src=\"/app/assets/scripts/app.js\"></script>\n</body>\n\n</html>","output":"str","x":870,"y":120,"wires":[["5b2097bbf46d0a9a"]]},{"id":"5b2097bbf46d0a9a","type":"http response","z":"8d4496baf525b65b","g":"b6cf337a0acf3995","name":"","statusCode":"200","headers":{},"x":1080,"y":120,"wires":[]},{"id":"2fe04db7532878ac","type":"http in","z":"8d4496baf525b65b","g":"b6cf337a0acf3995","name":"","url":"/index.html","method":"get","upload":false,"swaggerDoc":"","x":200,"y":120,"wires":[["0d6b4987126b8725"]]},{"id":"327e610e5537b880","type":"template","z":"8d4496baf525b65b","g":"b6cf337a0acf3995","name":"CSS","field":"payload.style","fieldType":"msg","format":"css","syntax":"mustache","template":"/**\n * logerr\n *\n * @category   scrum-board\n * @author     Vaibhav Mehta <vaibhav@decodingweb.com>\n * @copyright  Copyright (c) 2016 Vaibhav Mehta <https://github.com/i-break-codes>\n * @license    http://www.opensource.org/licenses/mit-license.html  MIT License\n * @version    1.0 Beta\n */\n@import 'https://fonts.googleapis.com/css?family=Hind+Vadodara:300,400';\n* {\n  margin: 0;\n  padding: 0;\n  outline: 0;\n  box-sizing: border-box; }\n\nhtml, body, .wrapper {\n  height: 100%; }\n\nbody {\n  font-weight: 300;\n  font-family: Hind Vadodara;\n  background-image: linear-gradient(to left, #000428, #004e92);\n  color: #fff;\n  font-size: 14px; }\n\nul {\n  list-style-type: none; }\n\na {\n  text-decoration: none;\n  color: inherit; }\n\n.clear:after {\n  content: \"\";\n  display: table;\n  clear: both; }\n\n.hide {\n  display: none !important; }\n\nheader {\n  background-color: rgba(0, 0, 0, 0.4); }\n  header li {\n    padding: 15px;\n    float: left;\n    width: 20%;\n    text-align: center;\n    position: relative;\n    text-transform: uppercase; }\n    header li:after {\n      content: \"\";\n      position: absolute;\n      left: 0;\n      bottom: 0;\n      width: 100%;\n      height: 1px; }\n    header li:nth-child(1):after {\n      background: linear-gradient(to left, #cb2d3e, #ef473a); }\n    header li:nth-child(2):after {\n      background: linear-gradient(to left, #ffb347, #ffcc33); }\n    header li:nth-child(3):after {\n      background: linear-gradient(to left, #56ab2f, #a8e063); }\n    header li:nth-child(4):after {\n      background: linear-gradient(to left, #00d2ff, #3a7bd5); }\n    header li:nth-child(5):after {\n      background: linear-gradient(to left, #4CB8C4, #3CD3AD); }\n\n.wrapper {\n  overflow: hidden; }\n\n.dashboard {\n  height: calc(100% - 101px); }\n  .dashboard > div {\n    float: left;\n    height: 100%;\n    border-right: 1px solid rgba(0, 0, 0, 0.4);\n    width: 20%; }\n\n.card {\n  background-color: rgba(0, 0, 0, 0.4);\n  min-height: 50px;\n  margin: 10px;\n  position: relative;\n  overflow: hidden;\n  height: 40px;\n  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1);\n  z-index: 2; }\n  .card:before {\n    content: \"\";\n    position: absolute;\n    height: 100%;\n    width: 1px; }\n  .rejected .card p:before, .rejected\n  .card h5:after {\n    color: #ef473a; }\n  .pending .card p:before, .pending\n  .card h5:after {\n    color: #ffcc33; }\n  .development .card p:before, .development\n  .card h5:after {\n    color: #a8e063; }\n  .testing .card p:before, .testing\n  .card h5:after {\n    color: #3a7bd5; }\n  .production .card p:before, .production\n  .card h5:after {\n    color: #3CD3AD; }\n  .card h5 {\n    font-size: 13px;\n    line-height: 50px;\n    padding-left: 10px;\n    font-weight: 300;\n    cursor: move; }\n  .card.edit-mode h5 {\n    position: relative; }\n    .card.edit-mode h5:after {\n      top: 50%;\n      margin-left: 5px;\n      margin-top: 1px;\n      -ms-transform: translateY(-50%);\n          transform: translateY(-50%);\n      position: absolute;\n      font-size: 9px;\n      content: \"(Edit Mode Enabled)\"; }\n  .rejected .card:before {\n    background: linear-gradient(to left, #cb2d3e, #ef473a); }\n  .pending .card:before {\n    background: linear-gradient(to left, #ffb347, #ffcc33); }\n  .development .card:before {\n    background: linear-gradient(to left, #56ab2f, #a8e063); }\n  .testing .card:before {\n    background: linear-gradient(to left, #00d2ff, #3a7bd5); }\n  .production .card:before {\n    background: linear-gradient(to left, #4CB8C4, #3CD3AD); }\n  .card.expanded {\n    overflow: auto !important;\n    height: auto !important; }\n\n.card-details {\n  padding: 10px;\n  font-size: 12px;\n  word-wrap: break-word;\n  padding-top: 0; }\n  .card-details p {\n    margin-bottom: 10px;\n    position: relative; }\n    .card-details p:before {\n      position: absolute;\n      left: 0; }\n    .card-details p:nth-child(1) {\n      padding-left: 67px; }\n      .card-details p:nth-child(1):before {\n        content: \"Description : \"; }\n    .card-details p:nth-child(2) {\n      padding-left: 72px; }\n      .card-details p:nth-child(2):before {\n        content: \"Remote URL : \"; }\n    .card-details p:nth-child(3) {\n      padding-left: 70px; }\n      .card-details p:nth-child(3):before {\n        content: \"Assigned To : \"; }\n  .card-details a {\n    border-bottom: 1px dotted #fff; }\n    .card-details a:hover {\n      border-bottom-style: solid; }\n\n.dragged-over {\n  background-color: rgba(0, 0, 0, 0.1); }\n\n@keyframes rotate180 {\n  to {\n    transform: rotate(180deg); } }\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-image: linear-gradient(to left, #000428, #004e92);\n  z-index: 2; }\n\n.modal-wrapper {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  max-width: 400px;\n  margin: auto;\n  width: 100%;\n  -ms-transform: translateX(-50%) translateY(-50%);\n      transform: translateX(-50%) translateY(-50%); }\n  .modal-wrapper .close-modal {\n    border: 1px solid rgba(255, 255, 255, 0.1);\n    border-radius: 50%;\n    width: 50px;\n    height: 50px;\n    position: absolute;\n    top: -90px;\n    font-family: Open Sans;\n    line-height: 52px;\n    font-size: 20px;\n    left: 50%;\n    -ms-transform: translateX(-50%);\n        transform: translateX(-50%);\n    vertical-align: middle;\n    cursor: pointer; }\n    .modal-wrapper .close-modal:hover {\n      border-color: #fff; }\n  .modal-wrapper h3 {\n    font-weight: 100;\n    font-size: 30px;\n    position: relative; }\n\n.add-task-form {\n  text-align: center; }\n  .add-task-form li {\n    margin-top: 30px; }\n  .add-task-form [type=text],\n  .add-task-form [type=submit],\n  .add-task-form textarea {\n    color: #fff;\n    font-size: inherit;\n    font-family: inherit;\n    font-weight: inherit;\n    width: 100%;\n    line-height: 24px;\n    padding: 15px 10px;\n    -webkit-appearance: none;\n       -moz-appearance: none;\n            appearance: none;\n    border: 1px solid rgba(255, 255, 255, 0.07);\n    background-color: transparent;\n    transition: border-color .25s linear; }\n    .add-task-form [type=text]::-webkit-input-placeholder,\n    .add-task-form [type=submit]::-webkit-input-placeholder,\n    .add-task-form textarea::-webkit-input-placeholder {\n      color: rgba(255, 255, 255, 0.3); }\n    .add-task-form [type=text]:focus,\n    .add-task-form [type=submit]:focus,\n    .add-task-form textarea:focus {\n      border-color: #fff; }\n  .add-task-form [type=submit] {\n    cursor: pointer;\n    border-color: transparent; }\n  .add-task-form textarea {\n    resize: none;\n    min-height: 100px; }\n\n.expand-card {\n  height: 19px;\n  width: 19px;\n  background-size: auto 100%;\n  display: inline-block;\n  position: absolute;\n  top: 25px;\n  cursor: pointer;\n  -ms-transform: translateY(-50%);\n      transform: translateY(-50%);\n  right: 15px;\n  padding: 3px; }\n  .rejected .expand-card {\n    background-image: url(\"/app/assets/images/rejected-expand.svg\"); }\n  .pending .expand-card {\n    background-image: url(\"/app/assets/images/pending-expand.svg\"); }\n  .development .expand-card {\n    background-image: url(\"/app/assets/images/development-expand.svg\"); }\n  .testing .expand-card {\n    background-image: url(\"/app/assets/images/testing-expand.svg\"); }\n  .production .expand-card {\n    background-image: url(\"/app/assets/images/production-expand.svg\"); }\n  .expand-card svg {\n    fill: #fff; }\n\n.removed-task-notification {\n  position: absolute;\n  top: 10%;\n  left: 50%;\n  -ms-transform: translateX(-50%);\n      transform: translateX(-50%);\n  padding: 5px 20px;\n  color: #515151;\n  border-radius: 3px;\n  background-color: rgba(255, 255, 255, 0.8);\n  box-sizing: 0 0 3px rgba(0, 0, 0, 0.6); }\n\nfooter {\n  height: 50px;\n  position: relative;\n  border-top: 1px solid rgba(0, 0, 0, 0.4); }\n\n.remove {\n  display: block;\n  background-color: #ef473a;\n  border-radius: 50%;\n  height: 30px;\n  width: 30px;\n  text-align: center;\n  padding-top: 7px;\n  transition: all 300ms ease-out;\n  cursor: default; }\n  .remove img {\n    width: 16px; }\n  .remove.dragged-over {\n    width: 250px;\n    border-radius: 3px; }\n\n.add-task {\n  z-index: 1;\n  border-radius: 50%; }\n  .add-task img {\n    width: 30px;\n    display: block;\n    box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1); }\n  .add-task:hover img {\n    animation: rotate180 .2s linear; }\n\n[data-tooltip] {\n  position: relative; }\n  [data-tooltip]:before {\n    display: none;\n    content: attr(data-tooltip);\n    background-color: rgba(0, 0, 0, 0.6);\n    padding: 10px 20px;\n    position: absolute;\n    text-align: center;\n    white-space: nowrap;\n    left: 50%;\n    -ms-transform: translateY(-130%) translateX(-50%);\n        transform: translateY(-130%) translateX(-50%); }\n  [data-tooltip]:hover:before {\n    display: block; }\n\n.controls {\n  position: absolute;\n  right: 0;\n  top: 50%;\n  -ms-transform: translateY(-50%);\n      transform: translateY(-50%); }\n  .controls li {\n    float: left;\n    margin-right: 20px; }\n  .controls iframe {\n    margin-top: 5px; }\n  .controls .twitter-share-button {\n    background-color: #1b95e0;\n    padding: 2px 10px;\n    font-size: 12px;\n    border-radius: 3px;\n    vertial-align: middle;\n    position: absolute;\n    top: 4px;\n    left: -70px; }\n\n.branding,\n.create-task-branding {\n  text-transform: uppercase;\n  font-size: 18px;\n  padding: 10px; }\n  .branding sup,\n  .create-task-branding sup {\n    position: absolute;\n    font-size: 9px;\n    margin-top: -6px;\n    margin-left: -3px; }\n  .branding span,\n  .create-task-branding span {\n    color: rgba(255, 255, 255, 0.6); }\n\n.create-task-branding {\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 300px; }\n\n.github-ref {\n  height: 30px;\n  width: 30px; }\n  .github-ref img {\n    height: 29px;\n    width: 29px; }\n\n.onboard {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(0, 0, 0, 0.7);\n  z-index: 2; }\n\n.onboard-modal {\n  height: 300px;\n  width: 450px;\n  background-color: #fff;\n  border-radius: 3px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -ms-transform: translate(-50%, -50%);\n      transform: translate(-50%, -50%); }\n\n.tips {\n  position: absolute;\n  bottom: 90px;\n  right: -280px;\n  font-size: 13px;\n  background-color: rgba(0, 0, 0, 0.3);\n  padding: 10px;\n  border-radius: 3px;\n  padding-left: 25px;\n  opacity: 0;\n  animation: showTips 500ms ease-in forwards;\n  cursor: pointer;\n  background-image: url(\"/app/assets/images/info.svg\");\n  background-position: 4px 12px;\n  background-size: 16px;\n  background-repeat: no-repeat; }\n  .tips span {\n    font-size: 10px;\n    font-style: italic; }\n\n@keyframes showTips {\n  to {\n    right: 20px;\n    opacity: 1; } }\n","x":670,"y":120,"wires":[["6ecd7a78f59f153e"]]},{"id":"0d6b4987126b8725","type":"template","z":"8d4496baf525b65b","g":"b6cf337a0acf3995","name":"JavaScript","field":"payload.script","fieldType":"msg","format":"handlebars","syntax":"plain","template":"{{#each this}}\n<div class=\"card\" data-task-id=\"{{id}}\">\n    <a href=\"#\" class=\"expand-card\"></a>\n    <h5>{{title}}</h5>\n    <div class=\"card-details\">\n        <p data-field=\"description\">{{description}}</p>\n        <p data-field=\"remote_url\">\n            {{#checkIfEmptyRemoteURL remote_url}}{{/checkIfEmptyRemoteURL}}\n        </p>\n        <p data-field=\"assigned_to\">\n            {{#checkIfEmptyAssigned assigned_to}}{{/checkIfEmptyAssigned}}\n        </p>\n    </div>\n</div>\n{{/each}}","output":"str","x":450,"y":120,"wires":[["327e610e5537b880"]]},{"id":"8a8c9939aff58092","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/bin.svg","method":"get","upload":false,"swaggerDoc":"","x":250,"y":560,"wires":[["6bc809cf9b7de498"]]},{"id":"6bc809cf9b7de498","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"bin.svg","field":"payload","fieldType":"msg","format":"text","syntax":"plain","template":"  <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 59 59\" style=\"enable-background:new 0 0 59 59;\" xml:space=\"preserve\" width=\"512px\" height=\"512px\">\n    <g>\n      <path d=\"M29.5,51c0.552,0,1-0.447,1-1V17c0-0.553-0.448-1-1-1s-1,0.447-1,1v33C28.5,50.553,28.948,51,29.5,51z\" fill=\"#FFFFFF\" />\n      <path d=\"M19.5,51c0.552,0,1-0.447,1-1V17c0-0.553-0.448-1-1-1s-1,0.447-1,1v33C18.5,50.553,18.948,51,19.5,51z\" fill=\"#FFFFFF\" />\n      <path d=\"M39.5,51c0.552,0,1-0.447,1-1V17c0-0.553-0.448-1-1-1s-1,0.447-1,1v33C38.5,50.553,38.948,51,39.5,51z\" fill=\"#FFFFFF\" />\n      <path d=\"M52.5,6H38.456c-0.11-1.25-0.495-3.358-1.813-4.711C35.809,0.434,34.751,0,33.499,0H23.5c-1.252,0-2.31,0.434-3.144,1.289   C19.038,2.642,18.653,4.75,18.543,6H6.5c-0.552,0-1,0.447-1,1s0.448,1,1,1h2.041l1.915,46.021C10.493,55.743,11.565,59,15.364,59   h28.272c3.799,0,4.871-3.257,4.907-4.958L50.459,8H52.5c0.552,0,1-0.447,1-1S53.052,6,52.5,6z M21.792,2.681   C22.24,2.223,22.799,2,23.5,2h9.999c0.701,0,1.26,0.223,1.708,0.681c0.805,0.823,1.128,2.271,1.24,3.319H20.553   C20.665,4.952,20.988,3.504,21.792,2.681z M46.544,53.979C46.538,54.288,46.4,57,43.636,57H15.364   c-2.734,0-2.898-2.717-2.909-3.042L10.542,8h37.915L46.544,53.979z\" fill=\"#FFFFFF\" />\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n    <g>\n    </g>\n  </svg>\n","output":"str","x":660,"y":560,"wires":[["ad655fe0ac0c577b"]]},{"id":"7c5570146ad7b660","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"development-expand.svg","field":"payload","fieldType":"msg","format":"text","syntax":"plain","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n  viewBox=\"0 0 60 60\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\" fill=\"#a8e063\">\n  <path d=\"M59,22c-0.553,0-1-0.448-1-1V1c0-0.552,0.447-1,1-1s1,0.448,1,1v20C60,21.552,59.553,22,59,22z\" />\n  <path d=\"M59,2H39c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S59.553,2,59,2z\" />\n  <path d=\"M35,26c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C35.512,25.902,35.256,26,35,26z\"/>\n  <path d=\"M1,60c-0.553,0-1-0.448-1-1V39c0-0.552,0.447-1,1-1s1,0.448,1,1v20C2,59.552,1.553,60,1,60z\" />\n  <path d=\"M21,60H1c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S21.553,60,21,60z\" />\n  <path d=\"M1,60c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C1.512,59.902,1.256,60,1,60z\"/>\n</svg>","output":"str","x":710,"y":780,"wires":[["b8d33823ad6c8ee9"]]},{"id":"2830485b5143a37a","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/development-expand.svg","method":"get","upload":false,"swaggerDoc":"","x":310,"y":780,"wires":[["7c5570146ad7b660"]]},{"id":"60004390397bc2f3","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"info.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 111.577 111.577\" style=\"enable-background:new 0 0 111.577 111.577;\" xml:space=\"preserve\" width=\"512px\" height=\"512px\">\n<g>\n\t<path d=\"M78.962,99.536l-1.559,6.373c-4.677,1.846-8.413,3.251-11.195,4.217c-2.785,0.969-6.021,1.451-9.708,1.451   c-5.662,0-10.066-1.387-13.207-4.142c-3.141-2.766-4.712-6.271-4.712-10.523c0-1.646,0.114-3.339,0.351-5.064   c0.239-1.727,0.619-3.672,1.139-5.846l5.845-20.688c0.52-1.981,0.962-3.858,1.316-5.633c0.359-1.764,0.532-3.387,0.532-4.848   c0-2.642-0.547-4.49-1.636-5.529c-1.089-1.036-3.167-1.562-6.252-1.562c-1.511,0-3.064,0.242-4.647,0.71   c-1.59,0.47-2.949,0.924-4.09,1.346l1.563-6.378c3.829-1.559,7.489-2.894,10.99-4.002c3.501-1.111,6.809-1.667,9.938-1.667   c5.623,0,9.962,1.359,13.009,4.077c3.047,2.72,4.57,6.246,4.57,10.591c0,0.899-0.1,2.483-0.315,4.747   c-0.21,2.269-0.601,4.348-1.171,6.239l-5.82,20.605c-0.477,1.655-0.906,3.547-1.279,5.676c-0.385,2.115-0.569,3.731-0.569,4.815   c0,2.736,0.61,4.604,1.833,5.597c1.232,0.993,3.354,1.487,6.368,1.487c1.415,0,3.025-0.251,4.814-0.744   C76.854,100.348,78.155,99.915,78.962,99.536z M80.438,13.03c0,3.59-1.353,6.656-4.072,9.177c-2.712,2.53-5.98,3.796-9.803,3.796   c-3.835,0-7.111-1.266-9.854-3.796c-2.738-2.522-4.11-5.587-4.11-9.177c0-3.583,1.372-6.654,4.11-9.207   C59.447,1.274,62.729,0,66.563,0c3.822,0,7.091,1.277,9.803,3.823C79.087,6.376,80.438,9.448,80.438,13.03z\" fill=\"#FFDA44\"/>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n<g>\n</g>\n</svg>\n","x":660,"y":480,"wires":[["ad655fe0ac0c577b"]]},{"id":"1f6eb7989c4e3c0d","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/info.svg","method":"get","upload":false,"swaggerDoc":"","x":250,"y":480,"wires":[["60004390397bc2f3"]]},{"id":"d71cc7317092ce54","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"pending-expand.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 60 60\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\" fill=\"#ffcc33\">\n  <path d=\"M59,22c-0.553,0-1-0.448-1-1V1c0-0.552,0.447-1,1-1s1,0.448,1,1v20C60,21.552,59.553,22,59,22z\"/>\n  <path d=\"M59,2H39c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S59.553,2,59,2z\"/>\n  <path d=\"M35,26c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C35.512,25.902,35.256,26,35,26z\"/>\n  <path d=\"M1,60c-0.553,0-1-0.448-1-1V39c0-0.552,0.447-1,1-1s1,0.448,1,1v20C2,59.552,1.553,60,1,60z\"/>\n  <path d=\"M21,60H1c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S21.553,60,21,60z\"/>\n  <path d=\"M1,60c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C1.512,59.902,1.256,60,1,60z\"/>\n</svg>","x":700,"y":740,"wires":[["b8d33823ad6c8ee9"]]},{"id":"5772cfb3c294ac4f","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/pending-expand.svg","method":"get","upload":false,"swaggerDoc":"","x":290,"y":740,"wires":[["d71cc7317092ce54"]]},{"id":"a2787c863221a9c5","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"plus.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 50 50\" style=\"enable-background:new 0 0 50 50;\" xml:space=\"preserve\">\n  <circle style=\"fill:#004e92;\" cx=\"25\" cy=\"25\" r=\"25\"/>\n  <line style=\"fill:none;stroke:#000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;\" x1=\"25\" y1=\"13\" x2=\"25\" y2=\"38\"/>\n  <line style=\"fill:none;stroke:#000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;\" x1=\"37.5\" y1=\"25\" x2=\"12.5\" y2=\"25\"/>\n</svg>","x":660,"y":520,"wires":[["ad655fe0ac0c577b"]]},{"id":"5c129d612ea265d6","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/plus.svg","method":"get","upload":false,"swaggerDoc":"","x":250,"y":520,"wires":[["a2787c863221a9c5"]]},{"id":"2490479ac6adb357","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"production-expand.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 60 60\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\" fill=\"#3CD3AD\">\n  <path d=\"M59,22c-0.553,0-1-0.448-1-1V1c0-0.552,0.447-1,1-1s1,0.448,1,1v20C60,21.552,59.553,22,59,22z\"/>\n  <path d=\"M59,2H39c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S59.553,2,59,2z\"/>\n  <path d=\"M35,26c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C35.512,25.902,35.256,26,35,26z\"/>\n  <path d=\"M1,60c-0.553,0-1-0.448-1-1V39c0-0.552,0.447-1,1-1s1,0.448,1,1v20C2,59.552,1.553,60,1,60z\"/>\n  <path d=\"M21,60H1c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S21.553,60,21,60z\"/>\n  <path d=\"M1,60c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C1.512,59.902,1.256,60,1,60z\"/>\n</svg>","x":700,"y":860,"wires":[["b8d33823ad6c8ee9"]]},{"id":"72e3013e320f2a56","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/production-expand.svg","method":"get","upload":false,"swaggerDoc":"","x":300,"y":860,"wires":[["2490479ac6adb357"]]},{"id":"cedfc812c400828b","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"rejected-expand.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 60 60\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\" fill=\"#ef473a\">\n  <path d=\"M59,22c-0.553,0-1-0.448-1-1V1c0-0.552,0.447-1,1-1s1,0.448,1,1v20C60,21.552,59.553,22,59,22z\"/>\n  <path d=\"M59,2H39c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S59.553,2,59,2z\"/>\n  <path d=\"M35,26c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C35.512,25.902,35.256,26,35,26z\"/>\n  <path d=\"M1,60c-0.553,0-1-0.448-1-1V39c0-0.552,0.447-1,1-1s1,0.448,1,1v20C2,59.552,1.553,60,1,60z\"/>\n  <path d=\"M21,60H1c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S21.553,60,21,60z\"/>\n  <path d=\"M1,60c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C1.512,59.902,1.256,60,1,60z\"/>\n</svg>","x":700,"y":700,"wires":[["b8d33823ad6c8ee9"]]},{"id":"e902db8e2d92ac98","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/rejected-expand.svg","method":"get","upload":false,"swaggerDoc":"","x":290,"y":700,"wires":[["cedfc812c400828b"]]},{"id":"381707afccfa84dc","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"testing-expand.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 60 60\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\" fill=\"#3a7bd5\">\n  <path d=\"M59,22c-0.553,0-1-0.448-1-1V1c0-0.552,0.447-1,1-1s1,0.448,1,1v20C60,21.552,59.553,22,59,22z\"/>\n  <path d=\"M59,2H39c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S59.553,2,59,2z\"/>\n  <path d=\"M35,26c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C35.512,25.902,35.256,26,35,26z\"/>\n  <path d=\"M1,60c-0.553,0-1-0.448-1-1V39c0-0.552,0.447-1,1-1s1,0.448,1,1v20C2,59.552,1.553,60,1,60z\"/>\n  <path d=\"M21,60H1c-0.553,0-1-0.448-1-1s0.447-1,1-1h20c0.553,0,1,0.448,1,1S21.553,60,21,60z\"/>\n  <path d=\"M1,60c-0.256,0-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l24-24\n   c0.391-0.391,1.023-0.391,1.414,0s0.391,1.023,0,1.414l-24,24C1.512,59.902,1.256,60,1,60z\"/>\n</svg>","x":690,"y":820,"wires":[["b8d33823ad6c8ee9"]]},{"id":"13a81f4a12e59c8d","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/testing-expand.svg","method":"get","upload":false,"swaggerDoc":"","x":290,"y":820,"wires":[["381707afccfa84dc"]]},{"id":"ad655fe0ac0c577b","type":"http response","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"HTTP 200 image/svg+xml","statusCode":"200","headers":{"content-type":"image/svg+xml"},"x":1010,"y":480,"wires":[]},{"id":"e491cf3e4fafae1c","type":"http in","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"","url":"/app/assets/images/github.svg","method":"get","upload":false,"swaggerDoc":"","x":260,"y":600,"wires":[["25545394efdfb768"]]},{"id":"25545394efdfb768","type":"template","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"github.svg","field":"payload","fieldType":"msg","format":"text","syntax":"mustache","template":"<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1000 1000\" enable-background=\"new 0 0 1000 1000\" xml:space=\"preserve\" fill=\"#fff\">\n  <g>\n    <path d=\"M500,10C229.4,10,10,235.1,10,512.5c0,222,140.4,410.2,335.1,476.7c3.1,0.7,5.7,0.9,8.3,0.9c18.2,0,25.2-13.3,25.2-24.9c0-12-0.4-43.5-0.7-85.5c-18.4,4.2-34.8,5.9-49.4,5.9c-94.3,0-115.7-73.3-115.7-73.3c-22.3-58-54.5-73.5-54.5-73.5c-42.7-30-0.2-30.8,3.1-30.8c0.2,0,0.2,0,0.2,0c49.2,4.4,75,52.1,75,52.1c24.5,42.9,57.3,54.9,86.6,54.9c23,0,43.8-7.4,56-13.1c4.4-32.4,17.1-54.5,31.1-67.2c-108.7-12.7-223.1-55.8-223.1-248.3c0-54.9,19-99.8,50.3-134.8c-5-12.7-21.9-63.9,4.8-133c0,0,3.5-1.1,10.9-1.1c17.7,0,57.8,6.8,123.8,52.7c39.2-11.2,80.9-16.6,122.7-16.8c41.6,0.2,83.6,5.7,122.7,16.8c66.1-45.9,106.1-52.7,123.8-52.7c7.4,0,10.9,1.1,10.9,1.1c26.7,69.1,9.8,120.3,4.8,133c31.3,35.2,50.3,80.1,50.3,134.8c0,192.9-114.6,235.4-223.8,247.8c17.5,15.5,33.3,46.2,33.3,93c0,67.2-0.7,121.4-0.7,137.8c0,11.8,6.8,25.2,24.9,25.2c2.6,0,5.7-0.2,8.8-0.9C849.8,922.6,990,734.3,990,512.5C990,235.1,770.6,10,500,10z M328.5,920.2c4.8,0,9.6-0.2,14.7-0.4c0,6.1,0,12,0.2,17.3c0,5.3,0,10.1,0.2,14.2c-34.1-12.7-66.3-29.5-96.5-50.3C268.6,912.6,295.5,920.2,328.5,920.2z M353.4,760.8c-1.7,4.8-3.3,9.8-4.6,15.1c-7.4,2.2-16.4,3.9-25.6,3.9c-23.8,0-41.6-11.8-56-37c-5.3-10.1-14.9-23.4-28.2-35.7C275.8,738,318.4,752.9,353.4,760.8z M769.1,889.6c-34.6,26-72.2,46.6-111.6,61.7c0-4.2,0-9,0-14.2c0-26,0-65.2,0-110.3c0-27.1-4.6-49.2-10.9-66.7c81.4-18.2,201.3-73.7,201.3-274.3c0-53.8-15.5-101.7-46.4-142.4c6.8-28.2,12-77.9-11.2-137.8l-5.9-15.5l-15.8-5.3c-3.3-1.1-10.5-2.8-21.9-2.8c-25.2,0-67.6,9-130.2,49.9c-37.2-9.2-76.1-14-116.2-14H500h-0.2c-40,0-79.2,4.8-116.2,14c-62.6-40.9-105-49.9-130.2-49.9c-11.4,0-18.6,2-21.9,3.1l-15.8,5.3l-5.9,15.5c-23.2,60.2-17.9,109.8-11.2,137.8c-30.8,40.9-46.4,88.8-46.4,142.4c0,108.5,35,174.8,80.1,215.5C214.8,687,191.8,675,164.2,673h-1.1H162h-0.7c-28.7,0-48.8,11.8-55.1,32.2c-10.3,32.4,21.4,54.7,31.9,62.1l1.1,1.3l3.3,1.3c3.5,2.2,22.1,15.3,37,53.6c4.4,13.6,13.8,31.7,29.8,48.6c-28.7-24.5-54.3-52.5-76.3-83.3C75.4,708.3,45,612.7,45,512.5c0-63.2,12-124.5,35.9-182.2c23-55.8,55.8-105.7,97.8-148.5c41.8-42.9,90.6-76.6,144.6-100C379.2,57.5,438.8,45,500,45s120.8,12.3,176.8,36.5c54.3,23.4,102.8,57.1,144.6,100s74.8,93,97.8,148.5C943,387.8,955,449,955,512.3c0,100.2-30.2,195.8-87.7,276.3C839.7,827.3,806.7,861.2,769.1,889.6z\" />\n  </g>\n</svg>","x":670,"y":600,"wires":[["ad655fe0ac0c577b"]]},{"id":"b8d33823ad6c8ee9","type":"http response","z":"8d4496baf525b65b","g":"574ba10e8f5c0ad7","name":"HTTP 200 image/svg+xml","statusCode":"200","headers":{"content-type":"image/svg+xml"},"x":1010,"y":780,"wires":[]},{"id":"48b60e9fa0ee5330","type":"template","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"helper.js","field":"payload","fieldType":"msg","format":"javascript","syntax":"plain","template":"/**\n * scrum-board\n *\n * @category   scrum-board\n * @author     Vaibhav Mehta <vaibhav@decodingweb.com>\n * @copyright  Copyright (c) 2016 Vaibhav Mehta <https://github.com/i-break-codes>\n * @license    http://www.opensource.org/licenses/mit-license.html  MIT License\n * @version    1.0 Beta\n */\n\n\n// TODO: Clearup this mess later and find a better way to handle blank fields\n\nvar Helper = function() {\n  function init() {\n    checkIfEmptyRemoteURL();\n    checkForEmptyAssign();\n  }\n  \n  function checkIfEmptyRemoteURL() {\n    Handlebars.registerHelper('checkIfEmptyRemoteURL', function(val, options) {\n      if(val) {\n        return '<a href=\"' + val + '\" target=\"_blank\">' + val + '</a>';\n      } else {\n        return '-';\n      }\n    });\n  }\n  \n  function checkForEmptyAssign() {\n    Handlebars.registerHelper('checkIfEmptyAssigned', function(val, options) {\n      if(val) {\n        return val;\n      } else {\n        return '-';\n      }\n    });\n  }\n  \n  return {\n    init: init\n  }\n}();\n\nHelper.init();","output":"str","x":660,"y":280,"wires":[["c482ae97d1472ed0"]]},{"id":"4567b5ee4e287834","type":"http in","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"","url":"/app/assets/scripts/helper.js","method":"get","upload":false,"swaggerDoc":"","x":250,"y":280,"wires":[["48b60e9fa0ee5330"]]},{"id":"c482ae97d1472ed0","type":"http response","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"HTTP 200 text/javascript","statusCode":"200","headers":{"content-type":"text/javascript"},"x":1010,"y":320,"wires":[]},{"id":"c9f8df22900b55f8","type":"template","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"localstorage.js","field":"payload","fieldType":"msg","format":"javascript","syntax":"plain","template":"/**\n * scrum-board\n *\n * @category   scrum-board\n * @author     Vaibhav Mehta <vaibhav@decodingweb.com>\n * @copyright  Copyright (c) 2016 Vaibhav Mehta <https://github.com/i-break-codes>\n * @license    http://www.opensource.org/licenses/mit-license.html  MIT License\n * @version    1.0 Beta\n */\n\n\nvar LocalStorage = function () {\n  function set(key, val) {\n    localStorage.setItem(key, val);\n  }\n\n  function get(key) {\n    return localStorage.getItem(key);\n  }\n\n  function remove(key) {\n    localStorage.removeItem(key);\n  }\n\n  return {\n    set: set,\n    get: get,\n    remove: remove\n  }\n}();","output":"str","x":680,"y":320,"wires":[["c482ae97d1472ed0"]]},{"id":"6872eea233b093ea","type":"template","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"app.js","field":"payload","fieldType":"msg","format":"javascript","syntax":"plain","template":"/**\n * scrum-board\n *\n * @category   scrum-board\n * @author     Vaibhav Mehta <vaibhav@decodingweb.com>\n * @copyright  Copyright (c) 2016 Vaibhav Mehta <https://github.com/i-break-codes>\n * @license    http://www.opensource.org/licenses/mit-license.html  MIT License\n * @version    1.0 Beta\n */\n\nvar App = function () {\n  function init() {\n    tips();\n    preset();\n    addStatusColumns();\n    changeStatus();\n    draggable();\n    droppable();\n    openCard();\n    createTask();\n    closeModal();\n    printNotes();\n    editTask();\n    exitEditMode();\n  }\n\n  function preset() {\n    $('#remove').on('click', function (e) {\n      e.preventDefault();\n    });\n\n    var defaultTask = {\n      id: 1,\n      title: 'This is a sample task',\n      description: 'Sample tasks are useful to get started',\n      remote_url: 'https://asana.com/12345/1234',\n      assigned_to: 'Jon Doe',\n      status: 'pending'\n    }\n\n    if (!LocalStorage.get('appInitialized', true)) {\n      LocalStorage.set('taskCounter', 1);\n      LocalStorage.set('status', JSON.stringify([\n        { key: 'rejected', value: 'Rejected' },\n        { key: 'pending', value: 'Pending' },\n        { key: 'development', value: 'Development' },\n        { key: 'testing', value: 'Testing' },\n        { key: 'production', value: 'Production' }]));\n      LocalStorage.set('task-1', JSON.stringify(defaultTask));\n      LocalStorage.set('appInitialized', true);\n    }\n  }\n\n  function addStatusColumns() {\n\n    var statusArr = JSON.parse(LocalStorage.get('status'));\n    var headerObj = $('header ul');\n    var myDashboard = $('#dashboard');\n    statusArr.map(function (item) {\n      var newLi = $('<li>' + item.value + '</li>');\n      newLi.attr('data-id', item.key);\n      headerObj.append(newLi);\n\n      var newDiv = $('<div id=' + item.key + ' class=' + item.key + '></div>');\n      myDashboard.append(newDiv);\n    });\n\n  }\n\n  function changeStatus() {\n    $('header li').on('dblclick', function (e) {\n      e.preventDefault();\n      var statusToChange = $(this).attr('data-id');\n\n      $('#change-status-modal').removeClass('hide');\n\n      $('#new_status').val($(this).text());\n\n      $('#change-status-modal').find('form').on('submit', function (e) {\n        e.preventDefault();\n        var newStatus = $('#new_status').val();\n        var currentStatus = JSON.parse(LocalStorage.get('status'));\n        currentStatus.map(function (obj) {\n          if (obj.key == statusToChange) {\n            obj.value = newStatus;\n          }\n        });\n\n        $('header ul li[data-id=' + statusToChange + ']').html(newStatus);\n\n        LocalStorage.set('status', JSON.stringify(currentStatus));\n\n\n        $('.close-modal').trigger('click');\n\n      });\n    });\n  }\n\n  function createTask() {\n    var source = $(\"#task-card-template\").html();\n    var template = Handlebars.compile(source);\n\n    $('#add-task').on('click', function (e) {\n      e.preventDefault();\n      $('#add-task-modal').removeClass('hide');\n\n      $('#add-task-modal').find('form').on('submit', function (e) {\n        e.preventDefault();\n        var obj = {};\n        var params = $(this).serialize();\n        var splitParams = params.split('&');\n\n        for (var i = 0, l = splitParams.length; i < l; i++) {\n          var keyVal = splitParams[i].split('=');\n          obj[keyVal[0]] = unescape(keyVal[1]);\n        }\n\n        // TODO: Add validations\n        if (obj.description === '' || obj.title === '') {\n          return;\n        }\n\n        var iid = LocalStorage.get('taskCounter');\n        obj.id = ++iid;\n        obj.status = 'pending';\n        LocalStorage.set('task-' + obj.id, JSON.stringify(obj));\n        LocalStorage.set('taskCounter', iid);\n\n        var newCard = template([obj]);\n        $('#dashboard #' + obj.status).append(newCard);\n        draggable();\n\n        $('.close-modal').trigger('click');\n\n        //Clear form fields after submit\n        $(this).find('input[type=text], textarea').val('');\n      });\n\n    });\n  }\n\n  function editTask() {\n    $(document).on('dblclick', '.card-details', function (e) {\n      e.stopPropagation();\n      $(this).find('p').attr('contenteditable', 'true').parents('.card').addClass('edit-mode');\n    });\n\n    $(document).on('input', '.card p', function () {\n      var taskId = $(this).parents('.card').data('task-id');\n      var fieldToEdit = $(this).data('field');\n      var getTaskData = JSON.parse(LocalStorage.get('task-' + taskId));\n\n      getTaskData[fieldToEdit] = $(this).text();\n\n      LocalStorage.set('task-' + taskId, JSON.stringify(getTaskData));\n    });\n  }\n\n  function exitEditMode() {\n    $(document).on('dblclick', function (e) {\n      $('.card').removeClass('edit-mode').find('[contenteditable]').removeAttr('contenteditable');\n    });\n  }\n\n  function closeModal() {\n    $('.close-modal').on('click', function () {\n      $('.modal').addClass('hide');\n    })\n  }\n\n  function draggable() {\n    $('.card').draggable({\n      handle: 'h5',\n      revert: false,\n      helper: function (e) {\n        //Cloning element, to enable draggable elements move out of scrollable parent element.\n        var original = $(e.target).hasClass(\"ui-draggable\") ? $(e.target) : $(e.target).closest(\".ui-draggable\");\n        return original.clone().css({\n          width: original.width()\n        });\n      },\n      scroll: false,\n      cursor: 'move',\n      start: function (event, ui) { },\n      stop: function (event, ui) { }\n    });\n  }\n\n  function droppable() {\n    var droppableConfig = {\n      tolerance: 'pointer',\n      drop: function (event, ui) {\n        var elm = ui.draggable,\n          parentId = elm.parent().attr('id'),\n          currentId = $(this).attr('id'),\n          taskId = elm.data('task-id');\n\n        if ($(this).attr('id') == 'remove') {\n          //Deletes task\n          elm.remove();\n          LocalStorage.remove('task-' + taskId);\n          $('#removed-task-notification').text('Task removed successfully').removeClass('hide');\n\n\n          setTimeout(function () {\n            $('#removed-task-notification').text('').addClass('hide');\n          }, 3000);\n        } else {\n          //Moves task\n          if (parentId != currentId) {\n            $(elm).detach().removeAttr('style').appendTo(this);\n\n            var getTaskData = JSON.parse(LocalStorage.get('task-' + taskId));\n            getTaskData.status = currentId;\n\n            LocalStorage.set('task-' + taskId, JSON.stringify(getTaskData));\n          }\n        }\n\n        $(this).removeClass('dragged-over');\n      },\n      over: function (event, ui) {\n        $(this).addClass('dragged-over');\n      },\n      out: function (event, ui) {\n        $(this).removeClass('dragged-over');\n      }\n    }\n\n    $('#dashboard > div, #remove').droppable(droppableConfig);\n  }\n\n  function openCard() {\n    $(document).on('click', '.expand-card', function (e) {\n      $(this).parent().toggleClass('expanded');\n      e.preventDefault();\n    });\n  }\n\n  function getAllNotes() {\n    var getAllData = localStorage;\n    var getTasks = [];\n\n    for (var data in getAllData) {\n      if (data.split('-')[0] == 'task') {\n        getTasks.push(JSON.parse(localStorage[data]));\n      }\n    }\n\n    return getTasks;\n  }\n\n  function printNotes() {\n    var source = $(\"#task-card-template\").html();\n    var template = Handlebars.compile(source);\n\n    var status = JSON.parse(LocalStorage.get('status'));\n\n    for (var i = 0, l = status.length; i < l; i++) {\n      var result = App.getAllNotes().filter(function (obj) {\n        return obj.status == status[i].key;\n      });\n\n      if (result) {\n        var cards = template(result);\n        $('#dashboard #' + status[i].key).append(cards);\n        draggable();\n      }\n    }\n  }\n\n  function tips() {\n    if (!JSON.parse(LocalStorage.get('showedTip'))) {\n      $('#tips').removeClass('hide').addClass('tips');\n    }\n\n    $('#tips').on('click', function () {\n      $(this).addClass('hide');\n      LocalStorage.set('showedTip', true);\n    });\n  }\n\n  return {\n    init: init,\n    getAllNotes: getAllNotes\n  }\n}();\n\nApp.init();","output":"str","x":650,"y":360,"wires":[["c482ae97d1472ed0"]]},{"id":"c5c80e2238aa96e9","type":"http in","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"","url":"/app/assets/scripts/localstorage.js","method":"get","upload":false,"swaggerDoc":"","x":270,"y":320,"wires":[["c9f8df22900b55f8"]]},{"id":"2c6b88e3aac2d2d3","type":"http in","z":"8d4496baf525b65b","g":"1a870ef46794b6ac","name":"","url":"/app/assets/scripts/app.js","method":"get","upload":false,"swaggerDoc":"","x":240,"y":360,"wires":[["6872eea233b093ea"]]}]

Credit

This flow is an adaption of the great work developed by Vaibhav Mehta