Advertisement
Guest User

Untitled

a guest
Mar 18th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. $(document).ready(function() {
  2.   const apiRoot = 'https://shrouded-brook-81622.herokuapp.com/v1/';
  3.   const trelloApiRoot = 'https://shrouded-brook-81622.herokuapp.com/v1/trello/';
  4.   const datatableRowTemplate = $('[data-datatable-row-template]').children()[0];
  5.   const $tasksContainer = $('[data-tasks-container]');
  6.  
  7.   var availableBoards = {};
  8.   var availableTasks = {};
  9.  
  10.   // init
  11.  
  12.   getAllTasks();
  13.  
  14.   function getAllAvailableBoards(callback, callbackArgs) {
  15.     var requestUrl = trelloApiRoot + 'boards';
  16.  
  17.     $.ajax({
  18.       url: requestUrl,
  19.       method: 'GET',
  20.       contentType: 'application/json',
  21.       success: function(boards) { callback(callbackArgs, boards); }
  22.     });
  23.   }
  24.  
  25.   function createElement(data) {
  26.     const element = $(datatableRowTemplate).clone();
  27.  
  28.     element.attr('data-task-id', data.id);
  29.     element.find('[data-task-name-section] [data-task-name-paragraph]').text(data.title);
  30.     element.find('[data-task-name-section] [data-task-name-input]').val(data.title);
  31.  
  32.     element.find('[data-task-content-section] [data-task-content-paragraph]').text(data.content);
  33.     element.find('[data-task-content-section] [data-task-content-input]').val(data.content);
  34.  
  35.     return element;
  36.   }
  37.  
  38.   function prepareBoardOrListSelectOptions(availableChoices) {
  39.     return availableChoices.map(function(choice) {
  40.       return $('<option>')
  41.                 .addClass('crud-select__option')
  42.                 .val(choice.id)
  43.                 .text(choice.name || 'Unknown name');
  44.     });
  45.   }
  46.  
  47.   function handleDatatableRender(taskData, boards) {
  48.     $tasksContainer.empty();
  49.     boards.forEach(board => {
  50.       availableBoards[board.id] = board;
  51.     });
  52.  
  53.     taskData.forEach(function(task) {
  54.       var $datatableRowEl = createElement(task);
  55.       var $availableBoardsOptionElements = prepareBoardOrListSelectOptions(boards);
  56.  
  57.       $datatableRowEl.find('[data-board-name-select]')
  58.         .append($availableBoardsOptionElements);
  59.  
  60.       $datatableRowEl
  61.         .appendTo($tasksContainer);
  62.     });
  63.   }
  64.  
  65.   function getAllTasks() {
  66.     const requestUrl = apiRoot + 'tasks';
  67.  
  68.     $.ajax({
  69.       url: requestUrl,
  70.       method: 'GET',
  71.       contentType: "application/json",
  72.       success: function(tasks) {
  73.         tasks.forEach(task => {
  74.           availableTasks[task.id] = task;
  75.         });
  76.  
  77.         getAllAvailableBoards(handleDatatableRender, tasks);
  78.       }
  79.     });
  80.   }
  81.  
  82.   function handleTaskUpdateRequest() {
  83.     var parentEl = $(this).parents('[data-task-id]');
  84.     var taskId = parentEl.attr('data-task-id');
  85.     var taskTitle = parentEl.find('[data-task-name-input]').val();
  86.     var taskContent = parentEl.find('[data-task-content-input]').val();
  87.     var requestUrl = apiRoot + 'tasks';
  88.  
  89.     $.ajax({
  90.       url: requestUrl,
  91.       method: "PUT",
  92.       processData: false,
  93.       contentType: "application/json; charset=utf-8",
  94.       dataType: 'json',
  95.       data: JSON.stringify({
  96.         id: taskId,
  97.         title: taskTitle,
  98.         content: taskContent
  99.       }),
  100.       success: function(data) {
  101.         parentEl.attr('data-task-id', data.id).toggleClass('datatable__row--editing');
  102.         parentEl.find('[data-task-name-paragraph]').text(taskTitle);
  103.         parentEl.find('[data-task-content-paragraph]').text(taskContent);
  104.       }
  105.     });
  106.   }
  107.  
  108.   function handleTaskDeleteRequest() {
  109.     var parentEl = $(this).parents('[data-task-id]');
  110.     var taskId = parentEl.attr('data-task-id');
  111.     var requestUrl = apiRoot + 'tasks';
  112.  
  113.     $.ajax({
  114.       url: requestUrl + '/' + taskId
  115.       ,
  116.       method: 'DELETE',
  117.       success: function() {
  118.         parentEl.slideUp(400, function() { parentEl.remove(); });
  119.       }
  120.     })
  121.   }
  122.  
  123.   function handleTaskSubmitRequest(event) {
  124.     event.preventDefault();
  125.  
  126.     var taskTitle = $(this).find('[name="title"]').val();
  127.     var taskContent = $(this).find('[name="content"]').val();
  128.  
  129.     var requestUrl = apiRoot + 'tasks';
  130.  
  131.     $.ajax({
  132.       url: requestUrl,
  133.       method: 'POST',
  134.       processData: false,
  135.       contentType: "application/json; charset=utf-8",
  136.       dataType: 'json',
  137.       data: JSON.stringify({
  138.         title: taskTitle,
  139.         content: taskContent
  140.       }),
  141.       success: getAllTasks
  142.     });
  143.   }
  144.  
  145.   function toggleEditingState() {
  146.     var parentEl = $(this).parents('[data-task-id]');
  147.     parentEl.toggleClass('datatable__row--editing');
  148.  
  149.     var taskTitle = parentEl.find('[data-task-name-paragraph]').text();
  150.     var taskContent = parentEl.find('[data-task-content-paragraph]').text();
  151.  
  152.     parentEl.find('[data-task-name-input]').val(taskTitle);
  153.     parentEl.find('[data-task-content-input]').val(taskContent);
  154.   }
  155.  
  156.   function handleBoardNameSelect(event) {
  157.     var $changedSelectEl = $(event.target);
  158.     var selectedBoardId = $changedSelectEl.val();
  159.     var $listNameSelectEl = $changedSelectEl.siblings('[data-list-name-select]');
  160.     var preparedListOptions = prepareBoardOrListSelectOptions(availableBoards[selectedBoardId].lists);
  161.  
  162.     $listNameSelectEl.empty().append(preparedListOptions);
  163.   }
  164.  
  165.   function handleCardCreationRequest(event) {
  166.     var requestUrl = trelloApiRoot + 'cards';
  167.     var $relatedTaskRow = $(event.target).parents('[data-task-id]');
  168.     var relatedTaskId = $relatedTaskRow.attr('data-task-id');
  169.     var relatedTask = availableTasks[relatedTaskId];
  170.     var selectedListId = $relatedTaskRow.find('[data-list-name-select]').val();
  171.  
  172.     if (!selectedListId) {
  173.       alert('You have to select a board and a list first!');
  174.       return;
  175.     }
  176.  
  177.     $.ajax({
  178.       url: requestUrl,
  179.       method: 'POST',
  180.       processData: false,
  181.       contentType: "application/json; charset=utf-8",
  182.       dataType: 'json',
  183.       data: JSON.stringify({
  184.         name: relatedTask.title,
  185.         description: relatedTask.content,
  186.         listId: selectedListId
  187.       }),
  188.       success: function(data) {
  189.         console.log('Card created - ' + data.shortUrl);
  190.         alert('Card created - ' + data.shortUrl);
  191.       }
  192.     });
  193.   }
  194.  
  195.   $('[data-task-add-form]').on('submit', handleTaskSubmitRequest);
  196.  
  197.   $tasksContainer.on('change','[data-board-name-select]', handleBoardNameSelect);
  198.   $tasksContainer.on('click','[data-trello-card-creation-trigger]', handleCardCreationRequest);
  199.   $tasksContainer.on('click','[data-task-edit-button]', toggleEditingState);
  200.   $tasksContainer.on('click','[data-task-edit-abort-button]', toggleEditingState);
  201.   $tasksContainer.on('click','[data-task-submit-update-button]', handleTaskUpdateRequest);
  202.   $tasksContainer.on('click','[data-task-delete-button]', handleTaskDeleteRequest);
  203. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement