Merge branch 'master' into token-authentication
This commit is contained in:
		
						commit
						132ea38da3
					
				
					 2 changed files with 93 additions and 104 deletions
				
			
		|  | @ -7,6 +7,7 @@ | ||||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> |     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> | ||||||
|     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> |     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> | ||||||
|     <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> |     <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | ||||||
|  |     <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.2.20171210/classList.min.js"></script> | ||||||
|     <link rel="shortcut icon" href="img/favicon.ico"> |     <link rel="shortcut icon" href="img/favicon.ico"> | ||||||
|     <title>Reimbursinator</title> |     <title>Reimbursinator</title> | ||||||
| </head> | </head> | ||||||
|  | @ -43,6 +44,19 @@ | ||||||
|                         <h3>Your Report History</h3> |                         <h3>Your Report History</h3> | ||||||
|                     </div> |                     </div> | ||||||
|                     <div class="card-body"> |                     <div class="card-body"> | ||||||
|  |                         <table class="table table-striped table-responsive-sm" style="visibility:hidden"> | ||||||
|  |                             <thead> | ||||||
|  |                                 <tr> | ||||||
|  |                                     <th>Title</th> | ||||||
|  |                                     <th>Date Created</th> | ||||||
|  |                                     <th class="d-none d-lg-table-cell">State</th> | ||||||
|  |                                     <th class="d-none d-md-table-cell">Date Submitted</th> | ||||||
|  |                                     <th>Action</th> | ||||||
|  |                                 </tr> | ||||||
|  |                             </thead> | ||||||
|  |                             <tbody> | ||||||
|  |                             </tbody> | ||||||
|  |                         </table> | ||||||
|                     </div> |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|  | @ -18,8 +18,10 @@ function getEndpointDomain() { | ||||||
| 
 | 
 | ||||||
|     if (OSName === "Windows") { |     if (OSName === "Windows") { | ||||||
|         domain = "https://192.168.99.100:8444/"; |         domain = "https://192.168.99.100:8444/"; | ||||||
|  |     } else if (OSName === "MacOS" && navigator.userAgent.includes("Firefox")) { | ||||||
|  |         domain = "https://192.168.99.100:8444/"; // That's Shuaiyi
 | ||||||
|     } else { |     } else { | ||||||
|         domain = "https://localhost:8444/" |         domain = "https://localhost:8444/"; // Jack, Preston
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return domain; |     return domain; | ||||||
|  | @ -58,11 +60,15 @@ function getDataFromEndpoint(url, callback) { | ||||||
| // Wraps a Bootstrap form group around a field
 | // Wraps a Bootstrap form group around a field
 | ||||||
| function createFormGroup(key, field) { | function createFormGroup(key, field) { | ||||||
|     const formGroup = document.createElement("div") |     const formGroup = document.createElement("div") | ||||||
|     formGroup.classList.add("form-group"); |     formGroup.classList.add("form-group", "row"); | ||||||
| 
 | 
 | ||||||
|     const label = document.createElement("label"); |     const label = document.createElement("label"); | ||||||
|     label.innerHTML = field.label; |     label.classList.add("col-sm-4", "col-form"); | ||||||
|  |     label.innerHTML = field.label + ": "; | ||||||
|     label.setAttribute("for", key); |     label.setAttribute("for", key); | ||||||
|  |      | ||||||
|  |     const div = document.createElement("div"); | ||||||
|  |     div.classList.add("col-sm-6"); | ||||||
| 
 | 
 | ||||||
|     const input = document.createElement("input"); |     const input = document.createElement("input"); | ||||||
|     input.name = key; |     input.name = key; | ||||||
|  | @ -74,36 +80,38 @@ function createFormGroup(key, field) { | ||||||
|             if (field.value === true) |             if (field.value === true) | ||||||
|                 input.setAttribute("checked", "checked"); |                 input.setAttribute("checked", "checked"); | ||||||
|             input.classList.add("form-check-input"); |             input.classList.add("form-check-input"); | ||||||
|             formGroup.classList.add("form-check"); |             label.className = ""; | ||||||
|             label.classList.add("form-check-label"); |             label.classList.add("form-check-label"); | ||||||
|             formGroup.appendChild(input); // Reversed order compared to others
 |             outerLabel = document.createElement("div"); | ||||||
|             formGroup.appendChild(label); |             outerLabel.classList.add("col-sm-4"); | ||||||
|  |             outerLabel.innerHTML = "Flight type: "; | ||||||
|  |             formCheck = document.createElement("div"); | ||||||
|  |             formCheck.classList.add("form-check"); | ||||||
|  |             formCheck.appendChild(input); | ||||||
|  |             formCheck.appendChild(label); | ||||||
|  |             div.appendChild(formCheck); | ||||||
|  |             formGroup.appendChild(outerLabel); | ||||||
|  |             formGroup.appendChild(div); | ||||||
|             break; |             break; | ||||||
|         case "date": |         case "date": | ||||||
|             input.type = "datetime"; |  | ||||||
|             input.value = field.value; |  | ||||||
|             input.classList.add("form-control"); |  | ||||||
|             formGroup.appendChild(label); |  | ||||||
|             formGroup.appendChild(input); |  | ||||||
|             break; |  | ||||||
|         case "decimal": |         case "decimal": | ||||||
|             input.type = "text"; |             input.type = "text"; | ||||||
|             input.value = field.value; |             input.value = field.value; | ||||||
|             input.classList.add("form-control"); |             input.classList.add("form-control"); | ||||||
|             formGroup.appendChild(label); |             formGroup.appendChild(label); | ||||||
|             formGroup.appendChild(input); |             div.appendChild(input) | ||||||
|  |             formGroup.appendChild(div); | ||||||
|             break; |             break; | ||||||
|         case "file": |         case "file": | ||||||
|             input.type = "file"; |             input.type = "file"; | ||||||
|             input.classList.add("form-control-file"); |             input.classList.add("form-control-file"); | ||||||
|  |             let uploadMessage = document.createElement("p"); | ||||||
|  |             uploadMessage.classList.add("form-text"); | ||||||
|  |             uploadMessage.innerHTML = field.value; | ||||||
|  |             div.appendChild(input) | ||||||
|  |             div.appendChild(uploadMessage); | ||||||
|             formGroup.appendChild(label); |             formGroup.appendChild(label); | ||||||
|             formGroup.appendChild(input); |             formGroup.appendChild(div); | ||||||
|             let uploadMessage = document.createTextNode("Uploaded file:"); |  | ||||||
|             formGroup.appendChild(uploadMessage); |  | ||||||
|             const link = document.createElement("a"); |  | ||||||
|             link.href = field.value; |  | ||||||
|             link.innerHTML = field.value; |  | ||||||
|             formGroup.appendChild(link); |  | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|  | @ -159,7 +167,7 @@ function createEditReportForm(parsedData) { | ||||||
|         col.removeChild(col.firstChild) |         col.removeChild(col.firstChild) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Add report title and date to card header
 |     // Add report title and date
 | ||||||
|     const reportTitle = parsedData.title; |     const reportTitle = parsedData.title; | ||||||
|     const dateCreated = new Date(parsedData.date_created).toLocaleDateString("en-US"); |     const dateCreated = new Date(parsedData.date_created).toLocaleDateString("en-US"); | ||||||
|     const h3 = document.createElement("h3");  |     const h3 = document.createElement("h3");  | ||||||
|  | @ -172,7 +180,6 @@ function createEditReportForm(parsedData) { | ||||||
|     accordion.classList.add("accordion"); |     accordion.classList.add("accordion"); | ||||||
|     accordion.id = "editReportAccordion"; |     accordion.id = "editReportAccordion"; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     // Traverse the report's sections array
 |     // Traverse the report's sections array
 | ||||||
|     const sections = parsedData.sections; |     const sections = parsedData.sections; | ||||||
|     for (let key in sections) { |     for (let key in sections) { | ||||||
|  | @ -223,105 +230,73 @@ function createEditReportForm(parsedData) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function displayListOfReports(parsedData) { | function displayListOfReports(parsedData) { | ||||||
|     const cardBody = document.querySelector(".card-body"); |  | ||||||
|     const table = document.createElement("table"); |  | ||||||
|     const reports = parsedData.reports; |     const reports = parsedData.reports; | ||||||
|     let reportsAdded = 0; |  | ||||||
| 
 | 
 | ||||||
|     // Create report table
 |     if (reports.length === 0) { | ||||||
|     for (let i = 0; i < reports.length; i++) { |         const cardBody = document.querySelector(".card-body"); | ||||||
|         let title = reports[i].title; |  | ||||||
|         let dateCreated = new Date(reports[i].date_created).toLocaleDateString("en-US"); |  | ||||||
|         let state = reports[i].state; |  | ||||||
|         let dateSubmitted; |  | ||||||
|         let rid = reports[i].report_pk; |  | ||||||
| 
 |  | ||||||
|         // Create edit/view button
 |  | ||||||
|         let actionButton = document.createElement("button"); |  | ||||||
|         actionButton.type = "submit"; |  | ||||||
|         actionButton.setAttribute("data-rid", rid); |  | ||||||
|         actionButton.classList.add("btn"); |  | ||||||
| 
 |  | ||||||
|         if (state === "created") { |  | ||||||
|             // Edit button
 |  | ||||||
|             dateSubmitted = "TBD"; |  | ||||||
|             actionButton.classList.add("btn-primary"); |  | ||||||
|             actionButton.innerHTML = "Edit"; |  | ||||||
|             actionButton.addEventListener("click", openEditReportForm); |  | ||||||
|         } else { |  | ||||||
|             // View button
 |  | ||||||
|             dateSubmitted = new Date(reports[i].date_submitted).toLocaleDateString("en-US"); |  | ||||||
|             actionButton.classList.add("btn-success"); |  | ||||||
|             actionButton.innerHTML = "View"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Insert data into the table object
 |  | ||||||
|         let bodyRow = table.insertRow(i);  |  | ||||||
|         bodyRow.insertCell(0).innerHTML = title; |  | ||||||
|         bodyRow.insertCell(1).innerHTML = dateCreated;  |  | ||||||
| 
 |  | ||||||
|         let stateCell = bodyRow.insertCell(2); |  | ||||||
|         stateCell.innerHTML = state; |  | ||||||
|         stateCell.classList.add("d-none", "d-lg-table-cell"); // Column visible only on large displays
 |  | ||||||
| 
 |  | ||||||
|         let dateSubmittedCell = bodyRow.insertCell(3); |  | ||||||
|         dateSubmittedCell.innerHTML = dateSubmitted; |  | ||||||
|         dateSubmittedCell.classList.add("d-none", "d-md-table-cell"); // Column visible on medium and larger displays
 |  | ||||||
| 
 |  | ||||||
|         bodyRow.insertCell(4).appendChild(actionButton); |  | ||||||
|         reportsAdded++; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (reportsAdded === 0) { |  | ||||||
|         // Report list is empty
 |  | ||||||
|         const p = document.createElement("p"); |         const p = document.createElement("p"); | ||||||
|         p.innerHTML = "No reports found."; |         p.innerHTML = "No reports found."; | ||||||
|         cardBody.appendChild(p); |         cardBody.appendChild(p); | ||||||
|     } else { |     } else { | ||||||
|         // Report list exists and table rows have been created
 |         const table = document.querySelector("table"); | ||||||
|         // Create table header, add it to the table, and append the result to the card body
 |         const tbody = document.querySelector("tbody"); | ||||||
| 
 | 
 | ||||||
|         const tr = document.createElement("tr"); |         // Insert data into the table row
 | ||||||
|  |         for (let i = 0; i < reports.length; i++) { | ||||||
|  |             let title = reports[i].title; | ||||||
|  |             let dateCreated = new Date(reports[i].date_created).toLocaleDateString("en-US"); | ||||||
|  |             let state = reports[i].state; | ||||||
|  |             let dateSubmitted; | ||||||
|  |             let rid = reports[i].report_pk; | ||||||
| 
 | 
 | ||||||
|         const headTitle = document.createElement("th"); |             let bodyRow = tbody.insertRow(i);  | ||||||
|         headTitle.innerHTML = "Title"; |             bodyRow.insertCell(0).innerHTML = title; | ||||||
|         tr.appendChild(headTitle); |             bodyRow.insertCell(1).innerHTML = dateCreated;  | ||||||
| 
 | 
 | ||||||
|         const headDateCreated = document.createElement("th"); |             let stateCell = bodyRow.insertCell(2); | ||||||
|         headDateCreated.innerHTML = "Date Created"; |             stateCell.innerHTML = state; | ||||||
|         tr.appendChild(headDateCreated); |             stateCell.classList.add("d-none", "d-lg-table-cell"); // Column visible only on large displays
 | ||||||
| 
 | 
 | ||||||
|         const headState = document.createElement("th"); |             // Create edit/view button
 | ||||||
|         headState.innerHTML = "State"; |             let actionButton = document.createElement("button"); | ||||||
|         headState.classList.add("d-none", "d-lg-table-cell"); // Column visible only on large displays
 |             actionButton.type = "submit"; | ||||||
|         tr.appendChild(headState); |             actionButton.setAttribute("data-rid", rid); | ||||||
|  |             actionButton.classList.add("btn"); | ||||||
| 
 | 
 | ||||||
|         const headDateSubmitted = document.createElement("th") |             if (state === "created") { | ||||||
|         headDateSubmitted.innerHTML = "Date Submitted"; |                 // Edit button
 | ||||||
|         headDateSubmitted.classList.add("d-none", "d-md-table-cell"); // Column visible on medium and larger displays
 |                 dateSubmitted = "TBD"; | ||||||
|         tr.appendChild(headDateSubmitted); |                 actionButton.classList.add("btn-primary", "edit-report-button"); // Add event listener class
 | ||||||
|  |                 actionButton.innerHTML = "Edit"; | ||||||
|  |                 //actionButton.addEventListener("click", openEditReportForm);
 | ||||||
|  |             } else { | ||||||
|  |                 // View button
 | ||||||
|  |                 dateSubmitted = new Date(reports[i].date_submitted).toLocaleDateString("en-US"); | ||||||
|  |                 actionButton.classList.add("btn-success"); | ||||||
|  |                 actionButton.innerHTML = "View"; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|         const headAction = document.createElement("th") |             let dateSubmittedCell = bodyRow.insertCell(3); | ||||||
|         headAction.innerHTML = "Action"; |             dateSubmittedCell.innerHTML = dateSubmitted; | ||||||
|         tr.appendChild(headAction); |             dateSubmittedCell.classList.add("d-none", "d-md-table-cell"); // Column visible on medium and larger displays
 | ||||||
|  |             bodyRow.insertCell(4).appendChild(actionButton); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         const thead = document.createElement("thead"); |         table.style.visibility = "visible"; | ||||||
|         thead.appendChild(tr); |  | ||||||
|         table.prepend(thead); |  | ||||||
|         table.classList.add("table", "table-striped", "table-responsive-sm"); |  | ||||||
|         cardBody.appendChild(table); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function getReportHistory(event) { | document.addEventListener("DOMContentLoaded", function(event) { | ||||||
|     const url = getEndpointDomain() + "api/v1/reports"; |     const url = getEndpointDomain() + "api/v1/reports"; | ||||||
|     getDataFromEndpoint(url, displayListOfReports); |     getDataFromEndpoint(url, displayListOfReports); | ||||||
| } | }); | ||||||
| 
 | 
 | ||||||
| function openEditReportForm(event) { | document.addEventListener("click", function(event) { | ||||||
|     const url = getEndpointDomain() + "api/v1/report/" + this.dataset.rid; |     if (event.target && event.target.classList.contains("edit-report-button")) { | ||||||
|     getDataFromEndpoint(url, createEditReportForm); |         console.log("Edit button clicked"); | ||||||
| } |         const url = getEndpointDomain() + "api/v1/report/" + event.target.dataset.rid; | ||||||
|  |         getDataFromEndpoint(url, createEditReportForm); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| 
 |     // TODO: Add view report
 | ||||||
| document.addEventListener("DOMContentLoaded", getReportHistory); | }); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 kououken
						kououken