mirror of
				https://github.com/arcan1s/ffxivbis.git
				synced 2025-10-31 05:33:41 +00:00 
			
		
		
		
	migrate to bootstrap (#14)
This commit is contained in:
		
							
								
								
									
										349
									
								
								src/main/resources/html/bis.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										349
									
								
								src/main/resources/html/bis.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,349 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <title>Best in slot</title> | ||||
|  | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|  | ||||
|     <link href="/static/favicon.ico" rel="shortcut icon"> | ||||
|  | ||||
|     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous" type="text/css"> | ||||
|     <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css" rel="stylesheet" type="text/css"> | ||||
|  | ||||
|     <link href="https://unpkg.com/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" rel="stylesheet" type="text/css"> | ||||
|  | ||||
|  | ||||
|     <link href="https://unpkg.com/jquery-resizable-columns@0.2.3/dist/jquery.resizableColumns.css" rel="stylesheet" type="text/css"> | ||||
|  | ||||
|     <link href="/static/styles.css" rel="stylesheet" type="text/css"> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
|     <div class="container"> | ||||
|         <nav class="navbar navbar-expand-lg justify-content-between align-items-center border-bottom"> | ||||
|             <a class="navbar-brand" id="navbar-title">Party</a> | ||||
|             <ul class="navbar-nav"> | ||||
|                 <a class="nav-item nav-link" id="navbar-bis">best in slot</a> | ||||
|                 <a class="nav-item nav-link" id="navbar-loot">looted items</a> | ||||
|             </ul> | ||||
|             <ul class="navbar-nav"> | ||||
|                 <a class="nav-item nav-link" id="navbar-users">users</a> | ||||
|             </ul> | ||||
|         </nav> | ||||
|     </div> | ||||
|  | ||||
|     <div id="alert-placeholder" class="container"></div> | ||||
|  | ||||
|     <div class="container"> | ||||
|         <h2>Best in slot</h2> | ||||
|     </div> | ||||
|  | ||||
|     <div class="container"> | ||||
|         <div id="toolbar"> | ||||
|             <button id="update-btn" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#update-bis-dialog" hidden> | ||||
|                 <i class="bi bi-plus"></i> update | ||||
|             </button> | ||||
|             <button class="btn btn-secondary" onclick="reload()"> | ||||
|                 <i class="bi bi-arrow-clockwise"></i> reload | ||||
|             </button> | ||||
|             <button id="remove-btn" class="btn btn-danger" onclick="removePiece()" disabled hidden> | ||||
|                 <i class="bi bi-trash"></i> remove | ||||
|             </button> | ||||
|         </div> | ||||
|  | ||||
|         <table id="bis" class="table table-striped table-hover" | ||||
|                data-click-to-select="true" | ||||
|                data-export-options='{"fileName": "bis"}' | ||||
|                data-page-list="[25, 50, 100, all]" | ||||
|                data-page-size="25" | ||||
|                data-pagination="true" | ||||
|                data-resizable="true" | ||||
|                data-search="true" | ||||
|                data-show-columns="true" | ||||
|                data-show-columns-search="true" | ||||
|                data-show-columns-toggle-all="true" | ||||
|                data-show-export="true" | ||||
|                data-show-fullscreen="true" | ||||
|                data-show-search-clear-button="true" | ||||
|                data-single-select="true" | ||||
|                data-sortable="true" | ||||
|                data-sort-reset="true" | ||||
|                data-toolbar="#toolbar"> | ||||
|             <thead class="table-primary"> | ||||
|             <tr> | ||||
|                 <th data-checkbox="true"></th> | ||||
|                 <th data-sortable="true" data-switchable="false" data-field="nick">nick</th> | ||||
|                 <th data-sortable="true" data-switchable="false" data-field="job">job</th> | ||||
|                 <th data-sortable="true" data-field="piece">piece</th> | ||||
|                 <th data-sortable="true" data-field="pieceType">piece type</th> | ||||
|             </tr> | ||||
|             </thead> | ||||
|         </table> | ||||
|     </div> | ||||
|  | ||||
|     <div id="update-bis-dialog" tabindex="-1" role="dialog" class="modal fade"> | ||||
|         <div class="modal-dialog" role="document"> | ||||
|             <form class="modal-content"> | ||||
|                 <div class="modal-header"> | ||||
|                     <div class="btn-group" role="group" aria-label="Update bis"> | ||||
|                         <input id="add-piece-btn" name="update-bis" type="radio" class="btn-check" autocomplete="off" checked> | ||||
|                         <label class="btn btn-outline-primary" for="add-piece-btn">add piece</label> | ||||
|  | ||||
|                         <input id="update-bis-btn" name="update-bis" type="radio" class="btn-check" autocomplete="off"> | ||||
|                         <label class="btn btn-outline-primary" for="update-bis-btn">update bis</label> | ||||
|                     </div> | ||||
|                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="close"></button> | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="modal-body"> | ||||
|                     <div class="form-group row"> | ||||
|                         <label class="col-sm-4 col-form-label" for="player">player</label> | ||||
|                         <div class="col-sm-8"> | ||||
|                             <select id="player" name="player" class="form-control" title="player"></select> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div id="piece-row" class="form-group row"> | ||||
|                         <label class="col-sm-4 col-form-label" for="piece">piece</label> | ||||
|                         <div class="col-sm-8"> | ||||
|                             <select id="piece" name="piece" class="form-control" title="piece"></select> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div id="piece-type-row" class="form-group row"> | ||||
|                         <label class="col-sm-4 col-form-label" for="piece-type">piece type</label> | ||||
|                         <div class="col-sm-8"> | ||||
|                             <select id="piece-type" name="pieceType" class="form-control" title="piece-type"></select> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div id="bis-link-row" class="form-group row" style="display: none"> | ||||
|                         <label class="col-sm-4 col-form-label" for="bis-link">link</label> | ||||
|                         <div class="col-sm-8"> | ||||
|                             <input id="bis-link" name="link" class="form-control" placeholder="link to bis" onkeyup="disableSubmitBisButton()"> | ||||
|                         </div> | ||||
|                     </div> | ||||
|  | ||||
|                     <div class="modal-footer"> | ||||
|                         <button type="button" class="btn btn-danger" data-bs-dismiss="modal">close</button> | ||||
|                         <button id="submit-add-bis-btn" type="button" class="btn btn-primary" data-bs-dismiss="modal" onclick="addPiece()" disabled>add</button> | ||||
|                         <button id="submit-update-bis-btn" type="button" class="btn btn-primary" data-bs-dismiss="modal" onclick="setBis()" style="display: none" disabled>set</button> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </form> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="container"> | ||||
|         <footer class="d-flex flex-wrap justify-content-between align-items-center border-top"> | ||||
|             <ul class="nav"> | ||||
|                 <li><a class="nav-link" href="/" title="home">home</a></li> | ||||
|             </ul> | ||||
|  | ||||
|             <ul class="nav"> | ||||
|                 <li><a class="nav-link" href="https://github.com/arcan1s/ffxivbis" title="sources">ffxivbis</a></li> | ||||
|                 <li><a class="nav-link" href="https://github.com/arcan1s/ffxivbis/releases" title="releases list">releases</a></li> | ||||
|                 <li><a class="nav-link" href="https://github.com/arcan1s/ffxivbis/issues" title="issues tracker">report a bug</a></li> | ||||
|             </ul> | ||||
|         </footer> | ||||
|     </div> | ||||
|  | ||||
|     <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script> | ||||
|  | ||||
|     <script src="https://unpkg.com/tableexport.jquery.plugin/tableExport.min.js"></script> | ||||
|  | ||||
|     <script src="https://unpkg.com/jquery-resizable-columns@0.2.3/dist/jquery.resizableColumns.min.js"></script> | ||||
|  | ||||
|     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | ||||
|     <script src="https://unpkg.com/bootstrap-table@1.19.1/dist/bootstrap-table.min.js"></script> | ||||
|  | ||||
|     <script src="https://unpkg.com/bootstrap-table@1.19.1/dist/extensions/export/bootstrap-table-export.min.js"></script> | ||||
|  | ||||
|     <script src="https://unpkg.com/bootstrap-table@1.19.1/dist/extensions/resizable/bootstrap-table-resizable.js"></script> | ||||
|  | ||||
|     <script src="/static/utils.js"></script> | ||||
|     <script src="/static/load.js"></script> | ||||
|  | ||||
|     <script> | ||||
|         const [partyId, isReadOnly] = getPartyId(); | ||||
|         const table = $("#bis"); | ||||
|         const removeButton = $("#remove-btn"); | ||||
|         const updateButton = $("#update-btn"); | ||||
|  | ||||
|         const submitAddBisButton = $("#submit-add-bis-btn"); | ||||
|         const submitUpdateBisButton = $("#submit-update-bis-btn"); | ||||
|         const updateBisDialog = $("#update-bis-dialog"); | ||||
|  | ||||
|         const addPieceButton = $("#add-piece-btn"); | ||||
|         const updateBisButton = $("#update-bis-btn"); | ||||
|  | ||||
|         const bisLinkRow = $("#bis-link-row"); | ||||
|         const pieceRow = $("#piece-row"); | ||||
|         const pieceTypeRow = $("#piece-type-row"); | ||||
|  | ||||
|         const linkInput = $("#bis-link"); | ||||
|         const pieceInput = $("#piece"); | ||||
|         const pieceTypeInput = $("#piece-type"); | ||||
|         const playerInput = $("#player"); | ||||
|  | ||||
|         function addPiece() { | ||||
|             const player = getCurrentOption(playerInput); | ||||
|             $.ajax({ | ||||
|                 url: `/api/v1/party/${partyId}/bis`, | ||||
|                 data: JSON.stringify({ | ||||
|                     action: "add", | ||||
|                     piece: { | ||||
|                         pieceType: pieceTypeInput.val(), | ||||
|                         job: player.dataset.job, | ||||
|                         piece: pieceInput.val(), | ||||
|                     }, | ||||
|                     playerId: { | ||||
|                         partyId: partyId, | ||||
|                         nick: player.dataset.nick, | ||||
|                         job: player.dataset.job, | ||||
|                     }, | ||||
|                 }), | ||||
|                 type: "POST", | ||||
|                 contentType: "application/json", | ||||
|                 success: function (_) { reload(); }, | ||||
|                 error: function (jqXHR, _, errorThrown) { requestAlert(jqXHR, errorThrown); }, | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function disableSubmitBisButton() { | ||||
|             const nonEmpty = (playerInput.val() !== null);  // well lol | ||||
|             submitUpdateBisButton.attr("disabled", !(nonEmpty && linkInput.val())); | ||||
|             submitAddBisButton.attr("disabled", !(nonEmpty)); | ||||
|         } | ||||
|  | ||||
|         function hideControls() { | ||||
|             removeButton.attr("hidden", isReadOnly); | ||||
|             updateButton.attr("hidden", isReadOnly); | ||||
|         } | ||||
|  | ||||
|         function hideLinkPart() { | ||||
|             disableSubmitBisButton(); | ||||
|             bisLinkRow.hide(); | ||||
|             submitUpdateBisButton.hide(); | ||||
|             pieceRow.show(); | ||||
|             pieceTypeRow.show(); | ||||
|             submitAddBisButton.show(); | ||||
|         } | ||||
|  | ||||
|         function hidePiecePart() { | ||||
|             disableSubmitBisButton(); | ||||
|             bisLinkRow.show(); | ||||
|             submitUpdateBisButton.show(); | ||||
|             pieceRow.hide(); | ||||
|             pieceTypeRow.hide(); | ||||
|             submitAddBisButton.hide(); | ||||
|         } | ||||
|  | ||||
|         function reload() { | ||||
|             table.bootstrapTable("showLoading"); | ||||
|             $.ajax({ | ||||
|                 url: `/api/v1/party/${partyId}`, | ||||
|                 type: "GET", | ||||
|                 dataType: "json", | ||||
|                 success: function (data) { | ||||
|                     const items = data.map(function (player) { | ||||
|                         return player.bis.map(function (loot) { | ||||
|                             return { | ||||
|                                 nick: player.nick, | ||||
|                                 job: player.job, | ||||
|                                 piece: loot.piece, | ||||
|                                 pieceType: loot.pieceType, | ||||
|                             }; | ||||
|                         }); | ||||
|                     }); | ||||
|                     const payload = items.reduce(function (left, right) { return left.concat(right); }, []); | ||||
|                     table.bootstrapTable("load", payload); | ||||
|                     table.bootstrapTable("uncheckAll"); | ||||
|                     table.bootstrapTable("hideLoading"); | ||||
|  | ||||
|                     const options = data.map(function (player) { | ||||
|                         const option = document.createElement("option"); | ||||
|                         option.innerText = formatPlayerId(player); | ||||
|                         option.dataset.nick = player.nick; | ||||
|                         option.dataset.job = player.job; | ||||
|                         return option; | ||||
|                     }); | ||||
|                     playerInput.empty().append(options); | ||||
|                     disableSubmitBisButton(); | ||||
|                 }, | ||||
|                 error: function (jqXHR, _, errorThrown) { requestAlert(jqXHR, errorThrown); }, | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function removePiece() { | ||||
|             const pieces = table.bootstrapTable("getSelections"); | ||||
|             pieces.map(function (loot) { | ||||
|                 $.ajax({ | ||||
|                     url: `/api/v1/party/${partyId}/bis`, | ||||
|                     data: JSON.stringify({ | ||||
|                         action: "remove", | ||||
|                         piece: { | ||||
|                             pieceType: loot.pieceType, | ||||
|                             job: loot.job, | ||||
|                             piece: loot.piece, | ||||
|                         }, | ||||
|                         playerId: { | ||||
|                             partyId: partyId, | ||||
|                             job: loot.job, | ||||
|                             nick: loot.nick, | ||||
|                         }, | ||||
|                     }), | ||||
|                     type: "POST", | ||||
|                     contentType: "application/json", | ||||
|                     success: function (_) { reload(); }, | ||||
|                     error: function (jqXHR, _, errorThrown) { requestAlert(jqXHR, errorThrown); }, | ||||
|                 }); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function reset() { | ||||
|             if (updateBisButton.is(":checked")) { | ||||
|                 hidePiecePart(); | ||||
|             } | ||||
|             if (addPieceButton.is(":checked")) { | ||||
|                 hideLinkPart(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function setBis() { | ||||
|             const player = getCurrentOption(playerInput); | ||||
|             $.ajax({ | ||||
|                 url: `/api/v1/party/${partyId}/bis`, | ||||
|                 data: JSON.stringify({ | ||||
|                     link: linkInput.val(), | ||||
|                     playerId: { | ||||
|                         partyId: partyId, | ||||
|                         nick: player.dataset.nick, | ||||
|                         job: player.dataset.job, | ||||
|                     }, | ||||
|                 }), | ||||
|                 type: "PUT", | ||||
|                 contentType: "application/json", | ||||
|                 success: function (_) { reload(); }, | ||||
|                 error: function (jqXHR, _, errorThrown) { requestAlert(jqXHR, errorThrown); }, | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         $(function () { | ||||
|             setupFormClear(updateBisDialog, reset); | ||||
|             setupRemoveButton(table, removeButton); | ||||
|  | ||||
|             loadHeader(partyId); | ||||
|             loadTypes("/api/v1/types/pieces", pieceInput); | ||||
|             loadTypes("/api/v1/types/pieces/types", pieceTypeInput); | ||||
|  | ||||
|             hideControls(); | ||||
|  | ||||
|             updateBisButton.click(function () { reset(); }); | ||||
|             addPieceButton.click(function () { reset(); }); | ||||
|  | ||||
|             table.bootstrapTable({}); | ||||
|             reload(); | ||||
|         }); | ||||
|     </script> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
		Reference in New Issue
	
	Block a user