{"database": "fishbowl_archive", "table": "biscript", "rows": [[24, "_binary \u0001", "   let capacities;\r\nconst daysInWeek = 7;\r\nconst tableId = 'schedule-table';\r\nconst HeaderDateFormat = 'dddd MMM-D';\r\nconst NameOfResource = 'Machine';\r\nlet currentViewWeek = moment().startOf('day');\r\nlet getEventData = (momentDate) => {\r\n   console.groupCollapsed('getEventData');\r\n   let queryDate = moment(momentDate);\r\n   const QUERY = `SELECT CONCAT('WO#:',wo.num) AS eventName,\r\n                wo.num AS eventNameRaw,\r\n                wo.note AS eventDescription,\r\n                DATE(wo.dateScheduledToStart) AS startDate,\r\n                DATE(wo.dateScheduled) AS endDate,\r\n                COALESCE(calcategory.id,0) AS resourceId,\r\n                CONCAT('#',COALESCE(REPLACE(calcategory.color,'x',''),'A9A9A9')) AS color,\r\n                (COALESCE(bom.estimatedduration,0) / 60) * wo.qtyTarget AS estimatedHours,\r\n                ROUND(((COALESCE(bom.estimatedduration,0) / 60) * wo.qtyTarget) / (DATEDIFF(wo.dateScheduled,wo.dateScheduledToStart) + 1),2) AS estimatedDailyHours,\r\n                (DATEDIFF(wo.dateScheduled,wo.dateScheduledToStart) + 1) AS datediff\r\n\r\n                FROM wo\r\n                LEFT JOIN calcategory ON wo.calcategoryid = calcategory.id\r\n                LEFT JOIN moitem ON wo.moitemid = moitem.id\r\n                LEFT JOIN bom ON moitem.bomid = bom.id\r\n                WHERE wo.statusid < 40\r\n                AND (YEARWEEK(wo.dateScheduledToStart) = YEARWEEK('${queryDate.format(\r\n                   'YYYY-MM-DD'\r\n                )}') OR YEARWEEK(wo.dateScheduled) = YEARWEEK('${queryDate.format(\r\n      'YYYY-MM-DD'\r\n   )}'))`;\r\n   console.log('Query', QUERY);\r\n   let events = JSON.parse(runQuery(QUERY));\r\n   if (events.length > 0) {\r\n      console.log('events exist', events);\r\n   } else {\r\n      console.log(\r\n         `No events found this week: ${queryDate.format('YYYY-MM-DD')}`\r\n      );\r\n   }\r\n   console.groupEnd('getEventData');\r\n   return events;\r\n};\r\nfunction getOffset(el) {\r\n   var _x = 0;\r\n   var _y = 0;\r\n   while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {\r\n      _x += el.offsetLeft - el.scrollLeft;\r\n      _y += el.offsetTop - el.scrollTop;\r\n      el = el.offsetParent;\r\n   }\r\n   return { top: _y, left: _x };\r\n}\r\nlet getResources = () => {\r\n   console.groupCollapsed('getResources');\r\n   let QUERY = `SELECT\r\n                    name,\r\n                    id,\r\n                    \"\" AS limits,\r\n                    CONCAT('#',color) AS color\r\n\r\n                    FROM calcategory\r\n                    ORDER BY id DESC`;\r\n   console.log('Query', QUERY);\r\n\r\n   // ADD LOAD REPORT DATA HERE ONCE THE REPORT IS FUNCTIONAL. ALSO ADD THE ABILITY TO EASILY SWITCH BACK TO THIS TEST DATA\r\n   // saveReportData('');\r\n   capacities = loadReportData();\r\n   if (!capacities) {\r\n      capacities = [];\r\n      console.log('capacities was blank');\r\n   } else {\r\n      capacities = JSON.parse(capacities);\r\n      console.log('parsed capacities object', capacities);\r\n      capacities = capacities[0].capacities;\r\n      console.log('capacities was found and parsed', capacities);\r\n   }\r\n   // capacities = [\r\n   //    { resourceId: 102, defaultCapacity: [8, 7, 6, 5, 4, 3, 2] },\r\n   //    { resourceId: 101, defaultCapacity: [1, 2, 3, 4, 5, 6, 7] },\r\n   // ];\r\n   let resources = [\r\n      {\r\n         name: 'No Resource Assigned',\r\n         id: '0',\r\n         limits: [0, 0, 0, 0, 0, 0, 0],\r\n         color: 'grey',\r\n      },\r\n   ];\r\n   let results = JSON.parse(runQuery(QUERY));\r\n   console.log('Query Resluts', results);\r\n   if (!!resources) {\r\n      resources = resources.concat(results);\r\n   }\r\n\r\n   if (resources.length > 0) {\r\n      for (resource of resources) {\r\n         for (cap of capacities) {\r\n            if (cap.id == resource.id) {\r\n               resource.limits = cap.limits;\r\n               console.log(\r\n                  'default capacities found for resource',\r\n                  resource.limits\r\n               );\r\n            }\r\n         }\r\n         if (!resource.limits) {\r\n            console.log(\r\n               'No capacity settings found for this resource. Setting capacities to default'\r\n            );\r\n            resource.limits = [8, 8, 8, 8, 8, 8, 8];\r\n         }\r\n      }\r\n      console.groupCollapsed('resourcesResults');\r\n      console.log('resources', resources);\r\n      console.groupEnd('resourcesResults');\r\n   } else {\r\n      console.error('No Resources Found');\r\n   }\r\n   console.groupEnd('getResources');\r\n   return resources;\r\n};\r\nconst resources = getResources();\r\n\r\nlet calcUsage = () => {\r\n   console.groupCollapsed('calcUsage');\r\n   let timestamp = Date.now();\r\n   for (resource of resources) {\r\n      for (let i = 0; i < daysInWeek; i++) {\r\n         let dayTotal = 0;\r\n         let capacity;\r\n         let days = $(`td.day${i}.${resource.id}.busy`);\r\n         if (days[0]) {\r\n            capacity = days[0].getAttribute('capacity');\r\n         } else {\r\n            console.log('no busy days. removed warning');\r\n            $(`td.day${i}.${resource.id}`).removeClass('bg-danger');\r\n            continue;\r\n         }\r\n         days.children().each((index, cell) => {\r\n            dayTotal += parseInt($(cell).attr('duration'));\r\n         });\r\n         console.log(`day ${i} Total:`, dayTotal, 'capacity:', capacity);\r\n         console.log($(`td.day${i}.${resource.id}`));\r\n         $(`td.day${i}.${resource.id}`).each((index, cell) => {\r\n            if (cell.getAttribute('usage-calculated-ts') == timestamp) {\r\n               return true;\r\n            }\r\n            if (capacity >= dayTotal) {\r\n               console.log('removed warning');\r\n               $(cell).removeClass('bg-danger');\r\n               cell.setAttribute('usage-calculated-ts', timestamp);\r\n            } else {\r\n               console.log('added warning');\r\n               $(cell).addClass('bg-danger');\r\n               cell.setAttribute('usage-calculated-ts', timestamp);\r\n            }\r\n         });\r\n      }\r\n   }\r\n   console.groupEnd('calcUsage');\r\n   return true;\r\n};\r\n\r\nlet createRow = (resourceId) => {\r\n   /* MAYBE I CAN INSERT THE CAPACITY INPUTS AFTER I HAVE ACTUALLY ADDED THE ROW IN THE DOM. JUST LOOP THROUGH MY NUMBER OF DAYS AND ADD A CAPACITY INPUT FOR EACH WITH THE VALUES PULLED FROM DATABASE*/\r\n   console.groupCollapsed('createRow');\r\n   let rowString = '';\r\n   let resource;\r\n   let resourceNameCell = $(`td.resource-name.${resourceId}`);\r\n   let rowCount;\r\n   let rowId = Math.trunc(Math.random() * 1000000);\r\n   let tableElement = document.getElementById(tableId);\r\n   for (let item of resources) {\r\n      if (item.id == resourceId) {\r\n         resource = item;\r\n         break;\r\n      }\r\n   }\r\n   if (!resource) {\r\n      console.log('no resource found with id', resourceId);\r\n      console.groupEnd('createRow');\r\n      return false;\r\n   }\r\n\r\n   //If the resource doesn't exist create a new one\r\n   if (!resourceNameCell.length) {\r\n      console.log(\r\n         `row for resource ${resource.name} does not exist. Adding new resource row`\r\n      );\r\n      rowCount = 2;\r\n      let newTbody = document.createElement('tbody', {\r\n         id: `${resource.id}body`,\r\n         class: resource.id,\r\n         resource: resource.id,\r\n      });\r\n      newTbody.setAttribute('id', `${resource.id}body`);\r\n      newTbody.setAttribute('class', resource.id);\r\n      newTbody.setAttribute('resource', resource.id);\r\n\r\n      let newRow = document.createElement('tr');\r\n      newRow.setAttribute('id', rowId);\r\n      newRow.setAttribute('class', `${resource.id} capacity`);\r\n      newRow.setAttribute('resource', resource.id);\r\n      console.log('newRow', newRow);\r\n      let nameCell = newRow.insertCell();\r\n      nameCell.setAttribute('rowspan', 2);\r\n      nameCell.setAttribute('class', `resource-name ${resource.id}`);\r\n      $(nameCell)\r\n         .append(`<span id=\"${resource.name}\" class=\"resource-name\">${resource.name}</span>\r\n                                    <button\r\n                                        id=\"button-${resource.id}\"\r\n                                        class=capacity-button\r\n                                        onclick=\"showCapSettings(event)\"\r\n                                        resource=\"${resource.id}\">\r\n                                        Adjust Caps\r\n                                    </button>\r\n                                    <div\r\n                                        id=\"capacity-modal-${resource.id}\"\r\n                                        class=\"dropdown-content modal capacity-modal ${resource.id}\"\r\n                                        resource=\"${resource.id}\">\r\n                                    </div>`);\r\n      newTbody.appendChild(newRow);\r\n      console.log('newTbody', newTbody);\r\n      tableElement.appendChild(newTbody);\r\n      for (let i = 0; i < daysInWeek; i++) {\r\n         $(newRow).append(`<td\r\n                            id=\"${i}${resource.id}${rowCount}capacity\"\r\n                            class=\"day${i} ${resource.id} capacity\"\r\n                            resource=\"${resource.id}\"\r\n                            day=\"${i}\"\r\n                            row=\"${rowId}\"\r\n                            capacity=\"${resource.limits[i]}\"\r\n                        >\r\n                            <div class=\"day${i} ${resource.id} capacity\"\r\n                                resource=\"${resource.id}\"\r\n                                day=\"${i}\"\r\n                                row=\"${rowId}\"\r\n                                duration=\"0\">Cap: ${resource.limits[i]} hrs</div>\r\n                        </td>`);\r\n      }\r\n      $(`table#${tableId}`).append(newTbody);\r\n      console.log('created new resource row', $(`tr#${rowId}`));\r\n\r\n      for (let dayOfWeek = 0; dayOfWeek < daysInWeek; dayOfWeek++) {\r\n         let week = moment($('table').attr('date'));\r\n         console.log('name of week', week.day(dayOfWeek).format('dddd'));\r\n         let capacityString = `<label class=\"input-label\">${week\r\n            .day(dayOfWeek)\r\n            .format('dddd')}</label>\r\n                                <input\r\n                                    type=\"number\"\r\n                                    min=\"0\"\r\n                                    value=\"${resource.limits[dayOfWeek]}\"\r\n                                    day=\"${dayOfWeek}\"\r\n                                    resource=\"${resource.id}\"\r\n                                    id=\"day${dayOfWeek}capacity-${\r\n            resource.id\r\n         }\"\r\n                                    class=\"capacity-input\"\r\n                                    onChange=\"capacityChange(event)\">\r\n                                <br>`;\r\n\r\n         $(`#capacity-modal-${resource.id}`).append(capacityString);\r\n      }\r\n      // Add the save button\r\n      $(`#capacity-modal-${resource.id}`).append(\r\n         `<input\r\n                type=\"button\"\r\n                class=\"save\"\r\n                onclick=\"saveCapacities(event)\"\r\n                value=\"Save\"\r\n                resource=\"${resource.id}\"/>`\r\n      );\r\n   }\r\n   // Once the resource row exists, or if it already existed, do this\r\n   let newRow = document.createElement('tr');\r\n   newRow.setAttribute('id', rowId);\r\n   newRow.setAttribute('class', `${resource.id} day`);\r\n   newRow.setAttribute('resource', resource.id);\r\n\r\n   rowCount = $(`tr.${resource.id}`).length + 1;\r\n   console.log('rowCount', rowCount);\r\n   resourceNameCell.attr('rowspan', rowCount);\r\n\r\n   for (let i = 0; i < daysInWeek; i++) {\r\n      $(newRow).append(`<td\r\n                        id=\"${i}${resource.id}${rowCount}\"\r\n                        class=\"day${i} ${resource.id} day\"\r\n                        resource=\"${resource.id}\"\r\n                        day=\"${i}\"\r\n                        row=\"${rowId}\"\r\n                        ondrop=\"moveEvent(event)\"\r\n                        ondragover=\"allowDrop(event)\"\r\n                        capacity=\"${resource.limits[i]}\"></td>`);\r\n   }\r\n   console.log(\r\n      `tbody resourceId:${resourceId}`,\r\n      $(`tbody#${resourceId}body`)\r\n   );\r\n   $(`tbody#${resourceId}body`).append(newRow);\r\n   console.log(\r\n      `added row to existing resource id:${resourceId}`,\r\n      $(`tr#${rowId}`)\r\n   );\r\n   console.groupEnd('createRow');\r\n   return $(`tr#${rowId}`);\r\n};\r\n\r\nlet addEvent = (event) => {\r\n   console.groupCollapsed('addEvent');\r\n   let startDate = moment(event.startdate);\r\n   let visualStartDate = moment(event.startdate).clone();\r\n   let endDate = moment(event.enddate);\r\n   let visualEndDate = moment(event.enddate).clone();\r\n\r\n   // for events that leak into the current week I am viewing\r\n   console.log(\r\n      visualStartDate.week(),\r\n      visualEndDate.week(),\r\n      currentViewWeek.week()\r\n   );\r\n   if (visualStartDate.week() != currentViewWeek.week()) {\r\n      visualStartDate = currentViewWeek.clone().day(0);\r\n   } else if (visualEndDate.week() != currentViewWeek.week()) {\r\n      visualEndDate = currentViewWeek.clone().day(6);\r\n   }\r\n   let startDay = visualStartDate.clone().day();\r\n   let endDay = visualEndDate.clone().day();\r\n   console.log(startDate, visualStartDate, startDay);\r\n   console.log(endDate, visualEndDate, endDay);\r\n\r\n   let resourceId = event.resourceid;\r\n   let resourceRows = $(`tr.${resourceId}.day`);\r\n   let daysInRange = [];\r\n   let busyDaysInRange = [];\r\n   let openRow;\r\n   let allEventDaysCells;\r\n   let eventCell;\r\n   console.log('Start Day: ', startDay, ' End Day: ', endDay);\r\n   for (i = startDay; i <= endDay; i++) {\r\n      daysInRange.push('.day' + i);\r\n      busyDaysInRange.push('.day' + i + '.busy');\r\n   }\r\n   daysInRange = daysInRange.join();\r\n   busyDaysInRange = busyDaysInRange.join();\r\n   resourceRows.each((index, cell) => {\r\n      let rowBusy = false;\r\n      $(cell)\r\n         .children(busyDaysInRange)\r\n         .each((i, c) => {\r\n            rowBusy = true;\r\n            return false;\r\n         });\r\n      if (rowBusy == false) {\r\n         openRow = cell;\r\n         console.log(`Open Row found. row id = ${openRow.id}`);\r\n         return false;\r\n      }\r\n   });\r\n   if (openRow) {\r\n      console.log('Open row was found');\r\n      allEventDaysCells = $(openRow).children(daysInRange);\r\n      eventCell = $(openRow).children(`.day${startDay}`);\r\n   } else {\r\n      console.log('No open rows for this event. Creating new row');\r\n      let newRow = createRow(resourceId);\r\n      console.log('new row id', newRow.id);\r\n      allEventDaysCells = $(newRow).children(daysInRange);\r\n      eventCell = $(newRow).children(`.day${startDay}`);\r\n   }\r\n\r\n   let eventId = Math.trunc(Math.random() * 100000);\r\n   let eventTitle;\r\n   if (event.datediff > 1) {\r\n      eventTitle = `${event.eventname} - ${event.estimateddailyhours} hrs/day (${event.estimatedhours} total)`;\r\n   } else {\r\n      eventTitle = `${event.eventname} - ${event.estimateddailyhours} hrs`;\r\n   }\r\n\r\n   let eventDivString = `<div id=\"${eventId + 'wrapper'}\"\r\n                            class=\"day${startDay} day${endDay} ${resourceId} event-wrapper\"\r\n                            resource=\"${resourceId}\"\r\n                            start-day=\"${startDay}\"\r\n                            end-day=\"${endDay}\"\r\n                            start-date=\"${event.startdate}\"\r\n                            visual-start-date=\"${visualStartDate}\"\r\n                            end-date = \"${event.enddate}\"\r\n                            visual-end-date=\"${visualEndDate}\"\r\n                            name=\"${event.eventnameraw}\"\r\n                            draggable=\"true\"\r\n                            ondrop=\"moveEvent(event)\"\r\n                            ondragover=\"allowDrop(event)\"\r\n                            onclick=\"eventClick(event)\"\r\n                            duration=\"${event.estimateddailyhours}\">\r\n                                <div id=${eventId}left\r\n                                    class=\"day${startDay} day${endDay} ${resourceId} left resizer\"\r\n                                    resource=\"${resourceId}\"\r\n                                    eventId=\"${eventId}\"\r\n                                    start-day=\"${startDay}\"\r\n                                    end-day=\"${endDay}\"\r\n                                    start-date=\"${event.startdate}\"\r\n                                    visual-start-date=\"${visualStartDate}\"\r\n                                    end-date = \"${event.enddate}\"\r\n                                    visual-end-date=\"${visualEndDate}\"\r\n                                    name=\"${event.eventnameraw}\"\r\n                                    draggable=\"true\"\r\n                                    ondrop=\"moveEvent(event)\"\r\n                                    ondragover=\"allowDrop(event)\"\r\n                                    onclick=\"eventClick(event)\"\r\n                                    duration=\"${event.estimateddailyhours}\"/>\r\n                                <div id=${eventId}right\r\n                                    class=\"day${startDay} day${endDay} ${resourceId} right resizer\"\r\n                                    resource=\"${resourceId}\"\r\n                                    eventId=\"${eventId}\"\r\n                                    start-day=\"${startDay}\"\r\n                                    end-day=\"${endDay}\"\r\n                                    start-date=\"${event.startdate}\"\r\n                                    visual-start-date=\"${visualStartDate}\"\r\n                                    end-date = \"${event.enddate}\"\r\n                                    visual-end-date=\"${visualEndDate}\"\r\n                                    name=\"${event.eventnameraw}\"\r\n                                    draggable=\"true\"\r\n                                    ondrop=\"moveEvent(event)\"\r\n                                    ondragover=\"allowDrop(event)\"\r\n                                    onclick=\"eventClick(event)\"\r\n                                    duration=\"${event.estimateddailyhours}\"/>\r\n                                <div id=${eventId}\r\n                                    class=\"day${startDay} day${endDay} ${resourceId} event\"\r\n                                    resource=\"${resourceId}\"\r\n                                    eventId=\"${eventId}\"\r\n                                    start-day=\"${startDay}\"\r\n                                    end-day=\"${endDay}\"\r\n                                    start-date=\"${event.startdate}\"\r\n                                    visual-start-date=\"${visualStartDate}\"\r\n                                    end-date = \"${event.enddate}\"\r\n                                    visual-end-date=\"${visualEndDate}\"\r\n                                    name=\"${event.eventnameraw}\"\r\n                                    draggable=\"true\"\r\n                                    ondrop=\"moveEvent(event)\"\r\n                                    ondragover=\"allowDrop(event)\"\r\n                                    onclick=\"eventClick(event)\"\r\n                                    duration=\"${event.estimateddailyhours}\">\r\n                                    ${eventTitle}\r\n                                </div>\r\n                            </div>`;\r\n\r\n   allEventDaysCells.each((index, cell) => {\r\n      // Don't want to remove the first cell. That is where I am dropping the event\r\n      if (index > 0) {\r\n         cell.remove();\r\n      }\r\n   });\r\n   let appendResult = eventCell\r\n      .append(eventDivString)\r\n      .on('dragstart', (event) => {\r\n         dragEvent(event);\r\n      });\r\n   if (appendResult.length == 0) {\r\n      console.log('append result', appendResult);\r\n      console.log('String: ', eventDivString);\r\n   }\r\n\r\n   eventCell.attr('colspan', endDay - startDay + 1);\r\n   // add classes for every day in the range so that it can still be found by all of my searches\r\n   let dayClasses;\r\n   for (i = startDay; i <= endDay; i++) {\r\n      dayClasses += ' day' + i;\r\n   }\r\n   eventCell.addClass(dayClasses);\r\n   eventCell.addClass('busy');\r\n   let eventDiv = $(`#${eventId}`);\r\n   console.log('color:', event.color);\r\n   eventDiv.css({ 'background-color': event.color });\r\n   console.log('event add success. id=', eventDiv.attr('id'), eventDiv);\r\n   console.groupEnd('addEvent');\r\n   calcUsage();\r\n   return eventDiv;\r\n};\r\n\r\nlet dragEvent = (event) => {\r\n   let fromCellId = $(event.target).parent().parent().attr('id');\r\n   let type;\r\n   if (event.target.id.includes('left')) {\r\n      type = 'left';\r\n   } else if (event.target.id.includes('right')) {\r\n      type = 'right';\r\n   } else {\r\n      type = 'move';\r\n   }\r\n   console.log(\r\n      'You are dragging div id=',\r\n      event.target.id,\r\n      'from td id=',\r\n      fromCellId,\r\n      'Type:',\r\n      type\r\n   );\r\n\r\n   let dataObject = JSON.stringify({\r\n      fromCellId: fromCellId,\r\n      eventId: event.target.getAttribute('eventId'),\r\n      targetId: event.target.id,\r\n      type: type,\r\n   });\r\n   event.originalEvent.dataTransfer.setData('text', dataObject);\r\n};\r\n\r\nlet eventClick = (event) => {\r\n   event.preventDefault();\r\n   let woNum = event.target.getAttribute('name');\r\n   console.log('Trying to open wo', openModule('Work Order', woNum));\r\n};\r\n\r\nlet allowDrop = (event) => {\r\n   event.preventDefault();\r\n};\r\n\r\nlet moveEvent = (event) => {\r\n   console.groupCollapsed('moveEvent');\r\n   // PULL THE WO API CALLS OUT OF HERE\r\n   // Move event now needs to Save the order to the database with the updated dates. Then run buildCalendar()\r\n   event.preventDefault();\r\n   event.stopPropagation();\r\n   console.log('event', event);\r\n   const dataTransfer = JSON.parse(event.dataTransfer.getData('text'));\r\n   const eventWrapper = document.getElementById(\r\n      `${dataTransfer.eventId + 'wrapper'}`\r\n   );\r\n\r\n   // check all columns width against the cursor to see which day this was dropped into\r\n   console.groupCollapsed('determine day based on position');\r\n   let newDay;\r\n   let dropPosition = event.pageX;\r\n   console.log('Drop Position', dropPosition);\r\n   $('th').each((index, cell) => {\r\n      left = getOffset(cell).left;\r\n      right = left + cell.offsetWidth;\r\n      console.log('left', left);\r\n      console.log('right', right);\r\n      if (dropPosition >= left && dropPosition <= right) {\r\n         newDay = cell.getAttribute('day');\r\n         return false;\r\n      }\r\n   });\r\n   if (!newDay) {\r\n      console.log('Day the event was dropped into could not be found');\r\n      return false;\r\n   }\r\n   console.groupEnd('determine day based on position');\r\n   let woNum = eventWrapper.getAttribute('name');\r\n   let resourceId = event.target.getAttribute('resource');\r\n   let startDate = eventWrapper.getAttribute('start-date');\r\n   let endDate = eventWrapper.getAttribute('end-date');\r\n   let newStartDate, newEndDate, daysToSubtract;\r\n\r\n   switch (dataTransfer.type) {\r\n      case 'left':\r\n         daysToSubtract = moment(\r\n            eventWrapper.getAttribute('start-date')\r\n         ).diff(currentViewWeek.clone().day(newDay), 'days', true);\r\n         console.log('daysToSubtract', daysToSubtract);\r\n         newStartDate = moment(startDate)\r\n            .subtract(daysToSubtract, 'days')\r\n            .format('YYYY-MM-DD[T]HH:mm:ss');\r\n         newEndDate = moment(endDate).format('YYYY-MM-DD[T]HH:mm:ss');\r\n\r\n         break;\r\n      case 'right':\r\n         daysToSubtract = moment(eventWrapper.getAttribute('end-date')).diff(\r\n            currentViewWeek.clone().day(newDay),\r\n            'days',\r\n            true\r\n         );\r\n         console.log('daysToSubtract', daysToSubtract);\r\n         newStartDate = moment(startDate).format('YYYY-MM-DD[T]HH:mm:ss');\r\n         newEndDate = moment(endDate)\r\n            .subtract(daysToSubtract, 'days')\r\n            .format('YYYY-MM-DD[T]HH:mm:ss');\r\n         break;\r\n      case 'move':\r\n         daysToSubtract = moment(eventWrapper.getAttribute('end-date')).diff(\r\n            currentViewWeek.clone().day(newDay),\r\n            'days',\r\n            true\r\n         );\r\n         console.log('daysToSubtract', daysToSubtract);\r\n         newEndDate = moment(endDate)\r\n            .subtract(daysToSubtract, 'days')\r\n            .format('YYYY-MM-DD[T]HH:mm:ss');\r\n         newStartDate = moment(startDate)\r\n            .subtract(daysToSubtract, 'days')\r\n            .format('YYYY-MM-DD[T]HH:mm:ss');\r\n   }\r\n   console.log('New Day: ' + newDay);\r\n   console.log('Original Start Date: ' + startDate);\r\n   console.log('New Start Date: ' + newStartDate);\r\n   console.log('Original End Date: ' + endDate);\r\n   console.log('New End Date: ' + newEndDate);\r\n   console.log('WO Num: ' + woNum);\r\n   console.log('Resource ID: ' + resourceId);\r\n   let updateResponse = updateWOItem(\r\n      newStartDate,\r\n      newEndDate,\r\n      woNum,\r\n      resourceId\r\n   );\r\n   if ((updateResponse = true)) {\r\n      let table = $('table');\r\n      table.empty();\r\n      buildCalendar(tableId, resources, currentViewWeek);\r\n   } else {\r\n      // add a pop up that will tell hte user something went wrong\r\n   }\r\n   console.groupEnd('moveEvent');\r\n   return;\r\n};\r\n\r\nlet updateWOItem = (eventStart, eventEnd, woNum, resourceId) => {\r\n   if (eventStart == null) {\r\n      return 'No Start Date Found';\r\n   }\r\n   console.log(\r\n      '\\r\\nEvent Start = ' + eventStart + ' Event End = ' + eventEnd\r\n   );\r\n   let WONum = { GetWorkOrderRq: { WorkOrderNumber: woNum } };\r\n   console.log('\\r\\nEvent WO Num = ', WONum);\r\n   let WOAPIObject = JSON.parse(\r\n      runApiRequest('GetWorkOrderRq', JSON.stringify(WONum))\r\n   );\r\n\r\n   if (WOAPIObject.hasOwnProperty('ErrorRs')) {\r\n      console.log('\\r\\nUnable to parse API request. WO Num = ', WONum);\r\n      console.log('API Response: ', WOAPIObject);\r\n      return false;\r\n   } else {\r\n      let WO = WOAPIObject.GetWorkOrderRs.WO;\r\n\r\n      // CHECK TO SEE IF THE EVENT HAS AN END DATE\r\n      if (!moment(eventEnd).isValid()) {\r\n         // CHANGE EACH WO ITEM DATE SCHEDULED\r\n         for (i = 0; i < WO.WOItems; i++) {\r\n            WO.WOItems[i].DateScheduled = eventStart;\r\n         }\r\n         // CHANGE WO DATE SCHEDULED/DATE SCHEDULED TO START\r\n         console.log('Event end was null');\r\n         WO.DateScheduled = eventStart;\r\n         WO.DateScheduledToStart = eventStart;\r\n      } else {\r\n         console.log('Event end was not null');\r\n         for (i = 0; i < WO.WOItems; i++) {\r\n            WO.WOItems[i].DateScheduled = eventStart;\r\n         }\r\n\r\n         WO.DateScheduled = eventEnd;\r\n         WO.DateScheduledToStart = eventStart;\r\n         WO.CalCategoryID = resourceId;\r\n      }\r\n\r\n      // FORMAT REQUEST OBJECT\r\n      let WONewDate = { SaveWorkOrderRq: { WO: WO } };\r\n\r\n      // UPDATE THE WORK ORDER AND WO ITEMS\r\n      let SaveWorkOrderResponse = JSON.parse(\r\n         runApiRequest('SaveWorkOrderRq', JSON.stringify(WONewDate))\r\n      );\r\n\r\n      if (SaveWorkOrderResponse.SaveWorkOrderRs.statusCode == 1000) {\r\n         console.log(\r\n            'Work Order ' +\r\n               woNum +\r\n               ' has been successfully updated to start date and end date ' +\r\n               eventStart\r\n         );\r\n         return true;\r\n      } else {\r\n         console.log('An error occured while saving the WO');\r\n         console.log('SaveWorkOrderRs =', SaveWorkOrderResponse);\r\n         return false;\r\n      }\r\n   }\r\n};\r\n\r\n// let moveEventARCHIVED = (event) => {\r\n//   event.preventDefault();\r\n//   event.stopPropagation();\r\n//   const dataTransfer = JSON.parse(event.dataTransfer.getData(\"text\"));\r\n//   if (dataTransfer.type == \"resize\") {\r\n//     resizeEvent(event);\r\n//     return true;\r\n//   }\r\n\r\n//   console.groupCollapsed(\"moveEvent\");\r\n//   console.log(`You dropped it into id=${event.target.id}`);\r\n//   const toCellId = event.target.id,\r\n//     fromCellId = dataTransfer.fromCellId,\r\n//     eventId = dataTransfer.eventId,\r\n//     toCell = $(`td#${toCellId}`),\r\n//     toResourceId = toCell.attr(\"resource\"),\r\n//     fromCell = $(`td#${fromCellId}`),\r\n//     fromResourceId = fromCell.attr(\"resource\"),\r\n//     eventDiv = $(`div#${eventId}wrapper`);\r\n\r\n//   eventDiv.appendTo(toCell);\r\n//   eventDiv.on(\"dragstart\", (event) => {\r\n//     dragEvent(event);\r\n//   });\r\n//   let toColor;\r\n//   for (resource of resources) {\r\n//     resource.id == toResourceId ? (toColor = resource.color) : null;\r\n//   }\r\n//   console.log(\"resource found\", toColor);\r\n//   eventDiv.css({ \"background-color\": toColor });\r\n//   toCell.addClass(\"busy\");\r\n//   fromCell.removeClass(\"busy\");\r\n//   calcUsage();\r\n\r\n//   //Go to the previous row and see if any of the the cells in that row are busy.\r\n//   //If there are none we are going to delete the row\r\n//   let fromRow = fromCell.parent();\r\n//   // have to loop over all of the rows in the tbody so that I can have the index of the from row\r\n//   let removeRow = false;\r\n//   let firstRowFlag = false;\r\n//   let currentRowCount = $(`tr.${fromResourceId}.day`).length;\r\n\r\n//   if (currentRowCount == 1) {\r\n//     console.log(\r\n//       \"this is the last row for the resource. so it is not removed\"\r\n//     );\r\n//     console.groupEnd(\"moveEvent\");\r\n//     return true;\r\n//   }\r\n//   $(`tbody#${fromResourceId}body`)\r\n//     .children(\".day\")\r\n//     .each((index, element) => {\r\n//       console.log(\"element\", element, \"index\", index);\r\n//       if (firstRowFlag) {\r\n//         $(element).prepend($(`td.${fromResourceId}.resource-name`));\r\n//         removeRow = true;\r\n//       } else if ($(element)[0] == fromRow[0])\r\n//         if (!fromRow.children(\".busy\").length) {\r\n//           // if the from row is the first row, and there are more rows. We need to do stuff to the next row and then remove the from row\r\n//           console.log(\"no children in this row are busy\");\r\n//           if (index == 0) {\r\n//             console.log(\"This was the first row\");\r\n//             firstRowFlag = true;\r\n//           } else {\r\n//             removeRow = true;\r\n//           }\r\n//         } else {\r\n//           console.log(\"children in from row are busy. Not removing it\");\r\n//           $(`td.resource-name.${fromResourceId}`).attr(\r\n//             \"rowspan\",\r\n//             currentRowCount + 1 //adding 1 for capacity row\r\n//           );\r\n//         }\r\n//     });\r\n//   if (removeRow) {\r\n//     console.log(\"from row to be removed\", fromRow);\r\n//     $(`td.resource-name.${fromResourceId}`).attr(\"rowspan\", currentRowCount);\r\n//     fromRow.remove();\r\n//   }\r\n//   console.groupEnd(\"moveEvent\");\r\n//   return true;\r\n// };\r\n\r\n// let moveEventBusy = (event) => {\r\n//   event.preventDefault();\r\n//   event.stopPropagation();\r\n//   const dataTransfer = JSON.parse(event.dataTransfer.getData(\"text\"));\r\n//   if (dataTransfer.type == \"resize\") {\r\n//     resizeEventBusy(event);\r\n//     return true;\r\n//   }\r\n//   console.groupCollapsed(\"moveEventBusy\");\r\n//   console.log(`You dropped it into a busy cell eventId=${event.target.id}`);\r\n//   const toCell = $(`div#${event.target.id}`).parent(),\r\n//     fromCellId = dataTransfer.fromCellId,\r\n//     eventId = dataTransfer.eventId,\r\n//     toResourceId = toCell.attr(\"resource\"),\r\n//     fromCell = $(`td#${fromCellId}`),\r\n//     fromResourceId = fromCell.attr(\"resource\"),\r\n//     eventDiv = $(`div#${eventId}`);\r\n\r\n//   //Create new row after the current row\r\n//   let rowCount = $(`tr.${toResourceId}`).length;\r\n//   let newRow = createRow(toResourceId);\r\n//   let newRowToCell = $(newRow).children(\r\n//     `td.day${toCell.attr(\"day\")}.${toResourceId}`\r\n//   );\r\n//   newRowToCell.append(eventDiv).on(\"dragstart\", (event) => {\r\n//     dragEvent(event);\r\n//   });\r\n//   let toColor;\r\n//   for (resource of resources) {\r\n//     resource.id == toResourceId ? (toColor = resource.color) : null;\r\n//   }\r\n//   console.log(\"resource found\", toColor);\r\n//   eventDiv.css({ \"background-color\": toColor });\r\n//   newRowToCell.addClass(\"busy\");\r\n//   fromCell.removeClass(\"busy\");\r\n//   calcUsage();\r\n\r\n//   //Go to the previous row and see if any of the the cells in that row are busy.\r\n//   //If there are none we are going to delete the row\r\n//   let fromRow = fromCell.parent();\r\n//   let currentRowCount = parseInt($(`tr.${fromResourceId}.day`).length);\r\n//   if (currentRowCount == 1) {\r\n//     console.log(\r\n//       \"this is the last row for the resource. so it is not removed\"\r\n//     );\r\n//     console.groupEnd(\"moveEventBusy\");\r\n//     return true;\r\n//   }\r\n//   // have to loop over all of the rows in the tbody so that I can have the index of the from row\r\n//   let firstRowFlag = false;\r\n//   let removeRow = false;\r\n//   $(`tbody#${fromResourceId}body`)\r\n//     .children(\".day\")\r\n//     .each((index, element) => {\r\n//       if (firstRowFlag) {\r\n//         $(element).prepend($(`td.${fromResourceId}.resource-name`));\r\n//         removeRow = true;\r\n//       } else if ($(element)[0] == fromRow[0]) {\r\n//         if (!fromRow.children(\".busy\").length) {\r\n//           // if the from row is the first row, and there are more rows. We need to do stuff to the next row and then remove the from row\r\n//           console.log(\"no children in this row are busy\");\r\n//           if (index == 0) {\r\n//             console.log(\"This was the first row\");\r\n//             firstRowFlag = true;\r\n//           } else {\r\n//             removeRow = true;\r\n//           }\r\n//         } else {\r\n//           console.log(\"Cell(s) in from row are busy. Not removing it\");\r\n//           $(`td.resource-name.${fromResourceId}`).attr(\r\n//             \"rowspan\",\r\n//             currentRowCount + 1 //adding 1 for capacity row\r\n//           );\r\n//         }\r\n//       }\r\n//     });\r\n\r\n//   if (removeRow) {\r\n//     console.log(\"from row to be removed\", fromRow);\r\n//     $(`td.resource-name.${fromResourceId}`).attr(\"rowspan\", currentRowCount);\r\n//     fromRow.remove();\r\n//   }\r\n//   console.groupEnd(\"moveEventBusy\");\r\n//   return true;\r\n// };\r\n\r\nlet changeCalendarWeek = (previous) => {\r\n   let currentDate = moment($('table').attr('date'));\r\n   console.groupCollapsed('changeCalendarWeek');\r\n   console.log('currentDate', currentDate);\r\n   let table = $('table');\r\n   table.empty();\r\n\r\n   let newDate;\r\n   if (previous) {\r\n      console.log('subtracting week');\r\n      newDate = currentDate.clone().subtract(1, 'weeks');\r\n   } else {\r\n      console.log('adding week');\r\n      newDate = currentDate.clone().add(1, 'weeks');\r\n   }\r\n   console.log('new date:', newDate);\r\n   table.attr('date', newDate.format('YYYY-MM-DD'));\r\n   currentViewWeek = newDate;\r\n   buildCalendar(tableId, resources, currentViewWeek);\r\n   console.groupEnd('changeCalendarWeek');\r\n   return true;\r\n};\r\n\r\nlet showCapSettings = (event) => {\r\n   event.stopPropagation();\r\n   let resourceId = $(event.target).attr('resource');\r\n   console.log(`showing capacity modal for ${resourceId}`);\r\n   console.log('pageX', event.pageX, 'pageY', event.pageY);\r\n   let modal = $(`.modal.${resourceId}`);\r\n   modal.css({ top: event.pageY, left: event.pageX });\r\n   modal.toggle();\r\n};\r\n\r\nlet buildCalendar = (tableId, resources, momentDate) => {\r\n   console.groupCollapsed('buildCalendar');\r\n   let tableHeaderString = `<thead><th class=\"resource-name\">${NameOfResource}</th>`;\r\n\r\n   for (let dayOfWeek = 0; dayOfWeek < daysInWeek; dayOfWeek++) {\r\n      let dayName = momentDate.day(dayOfWeek).format(HeaderDateFormat);\r\n      tableHeaderString += `<th class=\"day${dayOfWeek}\" day=\"${dayOfWeek}\">${dayName}</th>`;\r\n   }\r\n\r\n   tableHeaderString += `</thead>`;\r\n   let table = $(`#${tableId}`);\r\n   table.append(tableHeaderString);\r\n   table.attr('date', momentDate.format('YYYY-MM-DD'));\r\n\r\n   resources.forEach((resource) => {\r\n      createRow(resource.id);\r\n   });\r\n   console.log('schedule creation successful');\r\n\r\n   let events = getEventData(momentDate);\r\n   for (event of events) {\r\n      addEvent(event);\r\n   }\r\n   console.groupEnd('buildCalendar');\r\n   return true;\r\n};\r\n\r\nlet capacityChange = (event) => {\r\n   let day = $(event.target).attr('day');\r\n   let resourceId = $(event.target).attr('resource');\r\n   let value = parseInt(event.target.value);\r\n\r\n   for (resource of resources) {\r\n      if (resource.id == resourceId) {\r\n         resource.limits[day] = value;\r\n         break;\r\n      }\r\n   }\r\n};\r\n\r\nlet saveCapacities = (event) => {\r\n   let resourceId = $(event.target).attr('resource');\r\n   console.log('saving capacities for resource id:', resourceId);\r\n   let currentInfo = loadReportData();\r\n   if (!currentInfo) {\r\n      currentInfo = [{}];\r\n   } else {\r\n      currentInfo = JSON.parse(currentInfo);\r\n   }\r\n   console.log('Current Info', currentInfo);\r\n   let newCapacities = [...currentInfo];\r\n   newCapacities[0].capacities = resources;\r\n   console.log('New Capacity Object', newCapacities);\r\n   let saveResponse = saveReportData(JSON.stringify(newCapacities));\r\n   let table = $('table');\r\n   table.empty();\r\n   buildCalendar(tableId, resources, currentViewWeek);\r\n};\r\n\r\nlet resizeEventARCHIVED = (event) => {\r\n   event.preventDefault();\r\n   event.stopPropagation();\r\n   console.groupCollapsed('resizeEvent');\r\n   console.log('You just dropped one of the resize elements');\r\n   console.groupEnd('resizeEvent');\r\n   return true;\r\n};\r\n\r\nlet resizeEventBusyARCHIVED = (event) => {\r\n   event.preventDefault();\r\n   event.stopPropagation();\r\n   console.groupCollapsed('resizeEventBusy');\r\n   console.log(\r\n      'You just dropped one of the resize elements in a busy space'\r\n   );\r\n   console.groupEnd('resizeEventBusy');\r\n   return true;\r\n};\r\n\r\n$(document).ready(() => {\r\n   console.log('Document Ready');\r\n   $('#prev-button').click((event) => changeCalendarWeek(true));\r\n   $('#next-button').click((event) => changeCalendarWeek(false));\r\n   buildCalendar(tableId, resources, currentViewWeek);\r\n   let body = $(document.body);\r\n   body.click((event) => {\r\n      //check to see if we are interacting with any child of a capacity modal element\r\n      if ($(event.target).parents('.capacity-modal').length) {\r\n         return false;\r\n      } else {\r\n         $('.capacity-modal').hide();\r\n      }\r\n   });\r\n});\r\n", "2023-01-05 17:28:07.037000", "Capacity planning separated out by calendar category", "Category Capacity Planning", "", 20, 1, "category-capacity-planning", 0]], "columns": ["id", "active", "data", "dateLastModified", "description", "name", "note", "typeId", "fbVersion", "fbName", "published"], "primary_keys": ["id"], "primary_key_values": ["24"], "units": {}, "query_ms": 1.6641479451209307}