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