diff --git a/index.html b/index.html index 26cc8be..ab2da30 100644 --- a/index.html +++ b/index.html @@ -369,6 +369,7 @@ const inputCharacterName = document.getElementById("character-name"); const inputCampaignName = document.getElementById("campaign-name"); const inputMaxEffort = document.getElementById("max-effort"); + const characterSelector = document.getElementById("character-roster"); var characterRoster = {}; var currentCharacter = null; @@ -443,6 +444,113 @@ localStorage.setItem("character-roster", JSON.stringify()) }; + const loadCharacterRoster = (noSkipLocalStorageCheck) => { + if (!noSkipLocalStorageCheck && !checkLocalStorage()) { + alert("Local storage is not available, cannot load roster.") + } + + var newRoster = localStorage.getItem("character-roster"); + + characterRoster = (newRoster === null) ? {} : JSON.parse(newRoster); + + characterRoster = { + deadBeef: { + campaign: "Campaign One", + name: "Character One", + }, + otherChr: { + campaign: "Campaign Two", + name: "Character Two", + }, + thirdChr: { + campaign: "Campaign One", + name: "Character Three", + } + } + + while (characterSelector.firstChild) { + characterSelector.removeChild(characterSelector.lastChild); + } + + let placeHolder = document.createElement("option"); + placeHolder.appendChild(document.createTextNode("Choose a character to load")); + characterSelector.appendChild(placeHolder); + + let characterList = new Array(); + + for (let [characterID, characterData] of Object.entries(characterRoster)) { + if (characterRoster.hasOwnProperty(characterID)) { + characterList.push([characterID, characterData.campaign, characterData.name]); + } + } + + if (characterList.length == 0) { + return; + } + + characterList.sort((a, b) => { + const campaignA = a[1].toUpperCase(); + const campaignB = b[1].toUpperCase(); + const nameA = a[2].toUpperCase(); + const nameB = b[2].toUpperCase(); + + // Sort by campaign name first + if (campaignA < campaignB) { + return -1; + } + + if (campaignA > campaignB) { + return 1; + } + + // Sort by character name within the same campaign + if (nameA < nameB) { + return -1; + } + + if (nameA > nameB) { + return 1; + } + + // If all else fails, sort by the character ID + if (a[0] < b[0]) { + return -1; + } + + if (a[0] > b[0]) { + return 1; + } + + return 0; + }); + + let currentGroup = null; + let previousCampaign = null; + + characterList.forEach(([characterID, campaignName, characterName]) => { + if ((previousCampaign !== null) && (previousCampaign !== campaignName)) { + console.log("Found a new campaign", campaignName); + characterSelector.appendChild(currentGroup); + currentGroup = null; + } + + if (currentGroup === null) { + currentGroup = document.createElement("optgroup"); + currentGroup.label = campaignName; + } + + let newOption = document.createElement("option"); + newOption.value = characterID; + newOption.appendChild(document.createTextNode(characterName)); + currentGroup.appendChild(newOption); + previousCampaign = campaignName; + }); + + if (currentGroup !== null) { + characterSelector.appendChild(currentGroup); + } + }; + document.addEventListener( "DOMContentLoaded", () => { @@ -451,9 +559,7 @@ alert("Local Storage is not available, saving and loading data will be unavailable."); } - var newRoster = localStorage.getItem("character-roster"); - - characterRoster = (newRoster === null) ? {} : JSON.parse(newRoster); + loadCharacterRoster(true); }, );